diff --git a/Cargo.toml b/Cargo.toml index 2bc892e85..ca323c796 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -390,7 +390,7 @@ test-fuzz = "5" [patch.crates-io] -revm = { git = "https://github.com/bnb-chain/revm.git", rev = "76d842a", features = ["std", "secp256k1"], default-features = false } -revm-primitives = { git = "https://github.com/bnb-chain/revm.git", rev = "76d842a", features = ["std"], default-features = false } +revm = { git = "https://github.com/bnb-chain/revm.git", rev = "550b275", features = ["std", "secp256k1"], default-features = false } +revm-primitives = { git = "https://github.com/bnb-chain/revm.git", rev = "550b275", features = ["std"], default-features = false } alloy-chains = { git = "https://github.com/bnb-chain/alloy-chains-rs.git", branch = "feat/v0.1.15-opbnb", feature = ["serde", "rlp", "arbitrary"] } alloy-genesis = { git = "https://github.com/forcodedancing/alloy", branch = "feat/parlia-config" } \ No newline at end of file diff --git a/bin/reth/src/commands/debug_cmd/build_block.rs b/bin/reth/src/commands/debug_cmd/build_block.rs index 566198ec8..60d5b60f1 100644 --- a/bin/reth/src/commands/debug_cmd/build_block.rs +++ b/bin/reth/src/commands/debug_cmd/build_block.rs @@ -311,7 +311,7 @@ impl Command { let executor_factory = EvmProcessorFactory::new(self.chain.clone(), evm_config); let mut executor = executor_factory.with_state(blockchain_db.latest()?); executor - .execute_and_verify_receipt(&block_with_senders.clone().unseal(), U256::MAX)?; + .execute_and_verify_receipt(&block_with_senders.clone().unseal(), U256::MAX, 0)?; let state = executor.take_output_state(); debug!(target: "reth::cli", ?state, "Executed block"); diff --git a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs index 3632f4cff..bbc890b58 100644 --- a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs +++ b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs @@ -177,6 +177,7 @@ impl Command { .with_recovered_senders() .ok_or(BlockValidationError::SenderRecoveryError)?, merkle_block_td + block.difficulty, + 0 )?; let block_state = executor.take_output_state(); diff --git a/crates/blockchain-tree/src/chain.rs b/crates/blockchain-tree/src/chain.rs index 2444cf24a..80002a703 100644 --- a/crates/blockchain-tree/src/chain.rs +++ b/crates/blockchain-tree/src/chain.rs @@ -206,7 +206,7 @@ impl AppendableChain { let mut executor = externals.executor_factory.with_state(&provider); let block_hash = block.hash(); let block = block.unseal(); - executor.execute_and_verify_receipt(&block, U256::MAX)?; + executor.execute_and_verify_receipt(&block, U256::MAX, parent_block.timestamp)?; let bundle_state = executor.take_output_state(); // check state root if the block extends the canonical chain __and__ if state root diff --git a/crates/primitives/src/lib.rs b/crates/primitives/src/lib.rs index 17c780e6e..5f4ed9297 100644 --- a/crates/primitives/src/lib.rs +++ b/crates/primitives/src/lib.rs @@ -48,8 +48,8 @@ pub mod transaction; pub mod trie; mod withdrawal; -#[cfg(feature = "bsc")] -mod system_contracts; +/// #[cfg(feature = "bsc")] +pub mod system_contracts; pub use account::{Account, Bytecode}; #[cfg(any(test, feature = "arbitrary"))] diff --git a/crates/primitives/src/system_contracts/mod.rs b/crates/primitives/src/system_contracts/mod.rs index 3b4db3800..93347ac8e 100644 --- a/crates/primitives/src/system_contracts/mod.rs +++ b/crates/primitives/src/system_contracts/mod.rs @@ -1,14 +1,18 @@ -use std::collections::HashMap; +use crate::{error, ChainSpec}; use alloy_chains::{Chain, NamedChain}; use alloy_primitives::BlockNumber; use include_dir::{include_dir, Dir}; use reth_ethereum_forks::Hardfork; -use crate::ChainSpec; +use revm::primitives::{Address, Bytecode}; +use revm_primitives::hex; +use std::collections::HashMap; +use thiserror::Error; +/// System contracts with their names as keys and addresses as values. #[derive(Debug)] -struct SystemContract<'a> { - name: &'a str, - address: &'a str, +pub struct SystemContract { + name: String, + address: String, } const VALIDATOR_CONTRACT: &str = "0x0000000000000000000000000000000000001000"; @@ -29,63 +33,132 @@ const GOV_TOKEN_CONTRACT: &str = "0x0000000000000000000000000000000000002005"; const TIMELOCK_CONTRACT: &str = "0x0000000000000000000000000000000000002006"; const TOKEN_RECOVER_PORTAL_CONTRACT: &str = "0x0000000000000000000000000000000000003000"; -fn get_all_system_contracts() -> Vec> { +fn get_all_system_contracts() -> Vec { let mut res = vec![]; - res.push(SystemContract { name: "ValidatorContract", address: VALIDATOR_CONTRACT }); - res.push(SystemContract { name: "SlashContract", address: SLASH_CONTRACT }); - res.push(SystemContract { name: "SystemRewardContract", address: SYSTEM_REWARD_CONTRACT }); - res.push(SystemContract { name: "LightClientContract", address: LIGHT_CLIENT_CONTRACT }); - res.push(SystemContract { name: "TokenHubContract", address: TOKEN_HUB_CONTRACT }); - res.push(SystemContract { name: "RelayerIncentivizeContract", address: RELAYER_INCENTIVIZE_CONTRACT }); - res.push(SystemContract { name: "RelayerHubContract", address: RELAYER_HUB_CONTRACT }); - res.push(SystemContract { name: "GovHubContract", address: GOV_HUB_CONTRACT }); - res.push(SystemContract { name: "TokenHubContract", address: TOKEN_HUB_CONTRACT }); - res.push(SystemContract { name: "TokenManagerContract", address: TOKEN_MANAGER_CONTRACT }); - res.push(SystemContract { name: "CrossChainContract", address: CROSS_CHAIN_CONTRACT }); - res.push(SystemContract { name: "StakingContract", address: STAKING_CONTRACT }); - res.push(SystemContract { name: "StakeHubContract", address: STAKE_HUB_CONTRACT }); - res.push(SystemContract { name: "StakeCreditContract", address: STAKE_CREDIT_CONTRACT }); - res.push(SystemContract { name: "GovTokenContract", address: GOV_TOKEN_CONTRACT }); - res.push(SystemContract { name: "GovernorContract", address: GOVERNOR_CONTRACT }); - res.push(SystemContract { name: "TimelockContract", address: TIMELOCK_CONTRACT }); - res.push(SystemContract { name: "TokenRecoverPortalContract", address: TOKEN_RECOVER_PORTAL_CONTRACT }); + res.push(SystemContract { + name: "ValidatorContract".to_string(), + address: VALIDATOR_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "SlashContract".to_string(), + address: SLASH_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "SystemRewardContract".to_string(), + address: SYSTEM_REWARD_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "LightClientContract".to_string(), + address: LIGHT_CLIENT_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "TokenHubContract".to_string(), + address: TOKEN_HUB_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "RelayerIncentivizeContract".to_string(), + address: RELAYER_INCENTIVIZE_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "RelayerHubContract".to_string(), + address: RELAYER_HUB_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "GovHubContract".to_string(), + address: GOV_HUB_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "TokenHubContract".to_string(), + address: TOKEN_HUB_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "TokenManagerContract".to_string(), + address: TOKEN_MANAGER_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "CrossChainContract".to_string(), + address: CROSS_CHAIN_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "StakingContract".to_string(), + address: STAKING_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "StakeHubContract".to_string(), + address: STAKE_HUB_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "StakeCreditContract".to_string(), + address: STAKE_CREDIT_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "GovTokenContract".to_string(), + address: GOV_TOKEN_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "GovernorContract".to_string(), + address: GOVERNOR_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "TimelockContract".to_string(), + address: TIMELOCK_CONTRACT.to_string(), + }); + res.push(SystemContract { + name: "TokenRecoverPortalContract".to_string(), + address: TOKEN_RECOVER_PORTAL_CONTRACT.to_string(), + }); res } -#[derive(Debug)] +/// Errors related to system contract operations. +#[derive(Error, Debug)] pub enum SystemContractError { - InvalidArgument, - CannotReadCode, + /// Error when invalid chain spec is provided. + #[error("System contract not found")] + InvalidSpec, + + /// Error when read invalid content from file. + #[error("Cannot read contract from file")] + FailToRead, + + /// Error when updating the contract fails. + #[error("Cannot deploy contract")] FailToUpdate, } -fn read_system_contract_code(spec: &ChainSpec, hardfork: &Hardfork) -> Result, SystemContractError> { +/// Read system contract code from the given directory. +fn read_system_contract_code( + spec: &ChainSpec, + hardfork: &Hardfork, +) -> Result>, SystemContractError> { #[warn(unused_assignments)] - let mut dir = ""; + let mut dir = String::new(); if spec.chain.eq(&Chain::from_named(NamedChain::BinanceSmartChain)) { - dir = "mainnet" + dir = "mainnet".to_string(); } else if spec.chain.eq(&Chain::from_named(NamedChain::BinanceSmartChainTestnet)) { - dir = "chapel" + dir = "chapel".to_string(); } else { - return Err(SystemContractError::InvalidArgument); + return Err(SystemContractError::InvalidSpec); } let parent_dir = match hardfork { - Hardfork::Bruno => { "bruno" } - Hardfork::Euler => { "euler" } - Hardfork::Feynman => { "feynman" } - Hardfork::FeynmanFix => { "feyman_fix" } - Hardfork::Gibbs => { "gibbs" } - Hardfork::Kepler => { "kepler" } - Hardfork::Luban => { "luban" } - Hardfork::MirrorSync => { "mirror_sync" } - Hardfork::Moran => { "moran" } - Hardfork::Niels => { "niels" } - Hardfork::Planck => { "plank" } - Hardfork::Plato => { "plato" } - Hardfork::Ramanujan => { "ramanujan" } - _ => { return Err(SystemContractError::InvalidArgument); } + Hardfork::Bruno => "bruno", + Hardfork::Euler => "euler", + Hardfork::Feynman => "feynman", + Hardfork::FeynmanFix => "feyman_fix", + Hardfork::Gibbs => "gibbs", + Hardfork::Kepler => "kepler", + Hardfork::Luban => "luban", + Hardfork::MirrorSync => "mirror_sync", + Hardfork::Moran => "moran", + Hardfork::Niels => "niels", + Hardfork::Planck => "plank", + Hardfork::Plato => "plato", + Hardfork::Ramanujan => "ramanujan", + _ => { + return Err(SystemContractError::InvalidSpec); + } }; static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR"); @@ -99,42 +172,60 @@ fn read_system_contract_code(spec: &ChainSpec, hardfork: &Hardfork) -> Result f, - None => continue // the file does not exist, ignore the contract + None => continue, // the file does not exist, ignore the contract }; let body = match contract_file.contents_utf8() { - Some(b) => b, - None => return Err(SystemContractError::CannotReadCode), + Some(body) => body.to_string(), + _ => return Err(SystemContractError::FailToRead), }; - map.insert(String::from(c.address), String::from(body)); + + let bytes = hex::decode(body).unwrap(); + let body_hex = hex::encode(bytes.clone()); + print!("{}", body_hex); + map.insert(c.address.to_string(), Some(Bytecode::new_raw(bytes.into()))); } Ok(map) } -pub fn update_builtin_system_contract(spec: &ChainSpec, block_number: BlockNumber, last_block_time: u64, block_time: u64) -> Result, SystemContractError> { - let mut hardforks = vec![]; +/// Deploy system contracts to the given chain. +pub fn get_upgrade_system_contracts( + spec: &ChainSpec, + block_number: BlockNumber, + last_block_time: u64, + block_time: u64, +) -> Result>, SystemContractError> { + let mut m = HashMap::new(); for hardfork in spec.hardforks.iter() { - if hardfork.1.transitions_at_block(block_number) || hardfork.1.transitions_at_timestamp(block_time, last_block_time) { - hardforks.push(hardfork.0); + if hardfork.1.transitions_at_block(block_number) + || hardfork.1.transitions_at_timestamp(block_time, last_block_time) + { let contracts = match read_system_contract_code(spec, hardfork.0) { Ok(m) => m, Err(_) => return Err(SystemContractError::FailToUpdate), }; - for contract in contracts { - todo!("implement the upgrade logics") - } + contracts.iter().for_each(|(k, v)| { + let address = Address::parse_checksummed(k.clone(), None).unwrap(); + + m.insert(address, v.clone()); + }); } } - Ok(hardforks) + Ok(m) } #[cfg(test)] mod tests { - use crate::chain::BSC_MAINNET; - use crate::{ChainSpecBuilder}; + use revm_primitives::hex; + + #[cfg(feature = "bsc")] use super::*; + #[cfg(feature = "bsc")] + use crate::chain::BSC_MAINNET; + #[cfg(feature = "bsc")] + use crate::ChainSpecBuilder; #[test] fn test_read_system_contract_code() { @@ -146,6 +237,9 @@ mod tests { let res = read_system_contract_code(&mainnet, &Hardfork::Feynman).unwrap(); assert!(res.len() > 0); - assert_eq!(res.get(STAKE_HUB_CONTRACT).unwrap(), "608060405260043610620003db5760003560e01c806386d545061162000203578063d115a2061162000117578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000bf0578063fb50b31f1462000c15578063fc0c5ff11462000c3a578063ff69ab611462000c5257600080fd5b8063e992aaf51462000b6d578063efdbf0e11462000b85578063f1f74d841462000bc1578063f1fad1041462000bd957600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000b00578063daacdb661462000b18578063dbda7fb31462000b30578063e8f67c3b1462000b5557600080fd5b8063d115a2061462000a9d578063d6ca429d1462000ab6578063d7c2dfc81462000adb57600080fd5b8063b187bd261162000199578063c38fbec81162000164578063c38fbec81462000a1f578063c473318f1462000a44578063c8509d81146200083d578063cbb04d9d1462000a5c57600080fd5b8063b187bd26146200098c578063baa7199e14620009ac578063bdceadf314620009d1578063bff02e2014620009e957600080fd5b8063982ef0a711620001da578063982ef0a714620008f7578063a43569b3146200090e578063aad3ec961462000942578063ac431751146200096757600080fd5b806386d54506146200087a5780638a4d3fa814620008b45780638cd22b2214620008d257600080fd5b80634bf6c88211620002fb578063663706d3116200029157806376e7d6d6116200025c57806376e7d6d6146200080d5780638129fc1c1462000825578063831d65d1146200083d5780638456cb59146200086257600080fd5b8063663706d3146200073a5780636ec01b27146200076b5780636f8e2fa414620007c357806375cc7d8914620007e857600080fd5b80635949187111620002d25780635949187114620006a25780635e7cc1c914620006c757806363a036b514620006ec57806364028fbd146200072357600080fd5b80634bf6c882146200063b5780634d99dd1614620006655780634e6fd6c4146200068a57600080fd5b80631fa8882b1162000371578063449ecfe61162000348578063449ecfe6146200058757806345211bfd14620005ac5780634838d16514620005d15780634a49ac4c146200061657600080fd5b80631fa8882b146200053157806338409988146200054a578063417c73a7146200056257600080fd5b8063092193ab11620003b2578063092193ab146200047c5780630e9fbf5114620004935780631182b87514620004b857806317b4f35314620004ec57600080fd5b8063046f7da214620003fb578063059ddd2214620004135780630661806e146200045557600080fd5b36620003f65760345460ff16600114620003f457600080fd5b005b600080fd5b3480156200040857600080fd5b50620003f462000c6a565b3480156200042057600080fd5b50620004386200043236600462009442565b62000cfc565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200046257600080fd5b506200046d60365481565b6040519081526020016200044c565b620003f46200048d36600462009442565b62001111565b348015620004a057600080fd5b50620003f4620004b2366004620094a6565b6200174f565b348015620004c557600080fd5b50620004dd620004d7366004620094eb565b62001a7b565b6040516200044c91906200959e565b348015620004f957600080fd5b50620004386200050b36600462009694565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200053e57600080fd5b506200046d6201518081565b3480156200055757600080fd5b506200046d60375481565b3480156200056f57600080fd5b50620003f46200058136600462009442565b62001dee565b3480156200059457600080fd5b50620003f4620005a636600462009442565b62001e70565b348015620005b957600080fd5b50620003f4620005cb36600462009442565b62002055565b348015620005de57600080fd5b5062000605620005f036600462009442565b60016020526000908152604090205460ff1681565b60405190151581526020016200044c565b3480156200062357600080fd5b50620003f46200063536600462009442565b62002232565b3480156200064857600080fd5b5062000652600881565b60405160ff90911681526020016200044c565b3480156200067257600080fd5b50620003f462000684366004620096e9565b620022ae565b3480156200069757600080fd5b506200043861dead81565b348015620006af57600080fd5b50620003f4620006c136600462009727565b620028cb565b348015620006d457600080fd5b50620003f4620006e636600462009797565b6200369e565b348015620006f957600080fd5b50620007116200070b366004620097b7565b620038a6565b6040516200044c949392919062009820565b620003f462000734366004620098dc565b62003f38565b3480156200074757600080fd5b506200046d6200075936600462009442565b60446020526000908152604090205481565b3480156200077857600080fd5b50620007906200078a36600462009442565b62004582565b6040805182516001600160401b03908116825260208085015182169083015292820151909216908201526060016200044c565b348015620007d057600080fd5b50620004dd620007e236600462009442565b6200462c565b348015620007f557600080fd5b50620003f46200080736600462009442565b62004a45565b3480156200081a57600080fd5b506200046d603d5481565b3480156200083257600080fd5b50620003f462004c17565b3480156200084a57600080fd5b50620003f46200085c366004620094eb565b62004f2e565b3480156200086f57600080fd5b50620003f462004f98565b3480156200088757600080fd5b50620004386200089936600462009442565b6043602052600090815260409020546001600160a01b031681565b348015620008c157600080fd5b506200046d670de0b6b3a764000081565b348015620008df57600080fd5b506200046d620008f1366004620096e9565b62005030565b620003f462000908366004620099b4565b620050e9565b3480156200091b57600080fd5b50620009336200092d36600462009442565b62005773565b6040516200044c9190620099f2565b3480156200094f57600080fd5b50620003f462000961366004620096e9565b62005a60565b3480156200097457600080fd5b50620003f46200098636600462009a6f565b62005acd565b3480156200099957600080fd5b5060005462010000900460ff1662000605565b348015620009b957600080fd5b50620003f4620009cb36600462009b28565b6200696c565b348015620009de57600080fd5b506200046d603c5481565b348015620009f657600080fd5b5062000a0e62000a08366004620097b7565b62006b39565b6040516200044c9392919062009b84565b34801562000a2c57600080fd5b50620003f462000a3e36600462009442565b62006d15565b34801562000a5157600080fd5b506200046d60385481565b34801562000a6957600080fd5b5062000a8162000a7b36600462009442565b62006fd7565b604080519384529115156020840152908201526060016200044c565b34801562000aaa57600080fd5b506200046d620186a081565b34801562000ac357600080fd5b50620003f462000ad536600462009be1565b62007407565b34801562000ae857600080fd5b50620003f462000afa36600462009cca565b6200760b565b34801562000b0d57600080fd5b506200046d603b5481565b34801562000b2557600080fd5b506200046d60495481565b34801562000b3d57600080fd5b506200043862000b4f36600462009442565b62007701565b34801562000b6257600080fd5b506200046d60355481565b34801562000b7a57600080fd5b506200046d603a5481565b34801562000b9257600080fd5b506200046d62000ba436600462009694565b805160208183018101805160468252928201919093012091525481565b34801562000bce57600080fd5b506200046d603e5481565b34801562000be657600080fd5b5062000652601181565b34801562000bfd57600080fd5b506200046d62000c0f366004620096e9565b62007b18565b34801562000c2257600080fd5b50620003f462000c3436600462009a6f565b62007b89565b34801562000c4757600080fd5b506200046d60395481565b34801562000c5f57600080fd5b506200046d604a5481565b600054630100000090046001600160a01b0316331462000c9d576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000cc757604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000d679062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000d959062009d30565b801562000de65780601f1062000dba5761010080835404028352916020019162000de6565b820191906000526020600020905b81548152906001019060200180831162000dc857829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000e119062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3f9062009d30565b801562000e905780601f1062000e645761010080835404028352916020019162000e90565b820191906000526020600020905b81548152906001019060200180831162000e7257829003601f168201915b5050505050815260200160018201805462000eab9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000ed99062009d30565b801562000f2a5780601f1062000efe5761010080835404028352916020019162000f2a565b820191906000526020600020905b81548152906001019060200180831162000f0c57829003601f168201915b5050505050815260200160028201805462000f459062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000f739062009d30565b801562000fc45780601f1062000f985761010080835404028352916020019162000fc4565b820191906000526020600020905b81548152906001019060200180831162000fa657829003601f168201915b5050505050815260200160038201805462000fdf9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200100d9062009d30565b80156200105e5780601f1062001032576101008083540402835291602001916200105e565b820191906000526020600020905b8154815290600101906020018083116200104057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620010ea575050509190925250509051949350505050565b33611000146200113d57604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b03808216600090815260436020908152604080832054841680845260418352818420825161016081018452815487168152600182015487169481019490945260028101549095169183019190915260038401546060830152600484018054919491608084019190620011b69062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620011e49062009d30565b8015620012355780601f10620012095761010080835404028352916020019162001235565b820191906000526020600020905b8154815290600101906020018083116200121757829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620012609062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200128e9062009d30565b8015620012df5780601f10620012b357610100808354040283529160200191620012df565b820191906000526020600020905b815481529060010190602001808311620012c157829003601f168201915b50505050508152602001600182018054620012fa9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620013289062009d30565b8015620013795780601f106200134d5761010080835404028352916020019162001379565b820191906000526020600020905b8154815290600101906020018083116200135b57829003601f168201915b50505050508152602001600282018054620013949062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620013c29062009d30565b8015620014135780601f10620013e75761010080835404028352916020019162001413565b820191906000526020600020905b815481529060010190602001808311620013f557829003601f168201915b505050505081526020016003820180546200142e9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200145c9062009d30565b8015620014ad5780601f106200148157610100808354040283529160200191620014ad565b820191906000526020600020905b8154815290600101906020018083116200148f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162001539575050509190925250505060408101519091506001600160a01b031615806200157657508060e001515b156200163357604051611002903490600081818185875af1925050503d8060008114620015c0576040519150601f19603f3d011682016040523d82523d6000602084013e620015c5565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016269060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200168a57600080fd5b505af11580156200169f573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620016e091815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017159190869060040162009d66565b600060405180830381600087803b1580156200173057600080fd5b505af115801562001745573d6000803e3d6000fd5b5050505050505b50565b33611001146200177757604051630f22c43960e41b8152611001600482015260240162001134565b60005462010000900460ff1615620017a257604051631785c68160e01b815260040160405180910390fd5b600060458383604051620017b892919062009d80565b908152604051908190036020019020546001600160a01b03169050620017e0603f8262007ddd565b620017fe5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062001826620151804262009da6565b604a546000828152604b6020526040902054919250116200185a5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b602052604081208054600192906200187b90849062009dc9565b909155505060405160469062001895908790879062009d80565b908152602001604051809103902054600014158015620018e65750426201518060468787604051620018c992919062009d80565b908152602001604051809103902054620018e4919062009dc9565b105b156200190557604051631898eb6b60e01b815260040160405180910390fd5b6000806200191585600262007e00565b91509150816200193857604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af11580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062009ddf565b9050620019bf858362007e8a565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb283836002604051620019ff9392919062009e0f565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001a3d916001600160a01b0316908a9060040162009d66565b600060405180830381600087803b15801562001a5857600080fd5b505af115801562001a6d573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001aa557604051630f22c43960e41b8152612000600482015260240162001134565b60005462010000900460ff161562001ad057604051631785c68160e01b815260040160405180910390fd5b6034805460ff19166001179055604080516020601f8501819004810282018101909252838152600091829162001b219187908790819084018382808284376000920191909152506200805192505050565b915091508062001b445760405163035ede3560e21b815260040160405180910390fd5b816060015160000362001b6a575050604080516000815260208101909152905062001ddd565b606082015160405163e04c83a760e01b81526000916110049163e04c83a79162001b9a9160040190815260200190565b6020604051808303816000875af115801562001bba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001be0919062009e3e565b90508062001c875782602001516001600160a01b031683600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a8560600151600160405162001c3c92919062009e5e565b60405180910390a385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092965062001ddd95505050505050565b600062001c9484620081b4565b9050600081600481111562001cad5762001cad62009df9565b0362001ccf575050604080516000815260208101909152925062001ddd915050565b6040516000906110049047908381818185875af1925050503d806000811462001d15576040519150601f19603f3d011682016040523d82523d6000602084013e62001d1a565b606091505b505090508062001d3d576040516312171d8360e31b815260040160405180910390fd5b84602001516001600160a01b031685600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a87606001518560405162001d9092919062009e5e565b60405180910390a387878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092985062001ddd975050505050505050565b6034805460ff191690559392505050565b600054630100000090046001600160a01b0316331462001e21576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001e9b57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001ecd5760405163b1d02c3d60e01b815260040160405180910390fd5b8062001edb603f8262007ddd565b62001ef95760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001f3757604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001f87573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001fad919062009ddf565b101562001fcd576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001ff35760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff1916905560498054600191906000906200201790849062009e85565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff16156200208057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620020b25760405163b1d02c3d60e01b815260040160405180910390fd5b33620020c0603f8262007ddd565b620020de5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166200210657604051636520611b60e11b815260040160405180910390fd5b6001600160a01b03828116600090815260436020526040902054161515806200214757506001600160a01b03821660009081526047602052604090205460ff165b156200216657604051631e6f587560e11b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200218c90620151809062009dc9565b1115620021ac57604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b600054630100000090046001600160a01b0316331462002265576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff1615620022d957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200230b5760405163b1d02c3d60e01b815260040160405180910390fd5b8162002319603f8262007ddd565b620023375760405163056e881160e01b815260040160405180910390fd5b816000036200235957604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b0380841660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620023c19062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620023ef9062009d30565b8015620024405780601f10620024145761010080835404028352916020019162002440565b820191906000526020600020905b8154815290600101906020018083116200242257829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200246b9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620024999062009d30565b8015620024ea5780601f10620024be57610100808354040283529160200191620024ea565b820191906000526020600020905b815481529060010190602001808311620024cc57829003601f168201915b50505050508152602001600182018054620025059062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620025339062009d30565b8015620025845780601f10620025585761010080835404028352916020019162002584565b820191906000526020600020905b8154815290600101906020018083116200256657829003601f168201915b505050505081526020016002820180546200259f9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620025cd9062009d30565b80156200261e5780601f10620025f2576101008083540402835291602001916200261e565b820191906000526020600020905b8154815290600101906020018083116200260057829003601f168201915b50505050508152602001600382018054620026399062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620026679062009d30565b8015620026b85780601f106200268c57610100808354040283529160200191620026b8565b820191906000526020600020905b8154815290600101906020018083116200269a57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002744575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af1158015620027be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027e4919062009ddf565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b40829802878460405162002835929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b031603620028625762002862866200880a565b6040808301519051633041949b60e01b815261200591633041949b916200288f9190879060040162009d66565b600060405180830381600087803b158015620028aa57600080fd5b505af1158015620028bf573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff1615620028f657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620029285760405163b1d02c3d60e01b815260040160405180910390fd5b8362002936603f8262007ddd565b620029545760405163056e881160e01b815260040160405180910390fd5b8362002962603f8262007ddd565b620029805760405163056e881160e01b815260040160405180910390fd5b6034805460ff191660011790556000849003620029b057604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b031603620029e35760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002a4b9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002a799062009d30565b801562002aca5780601f1062002a9e5761010080835404028352916020019162002aca565b820191906000526020600020905b81548152906001019060200180831162002aac57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002af59062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002b239062009d30565b801562002b745780601f1062002b485761010080835404028352916020019162002b74565b820191906000526020600020905b81548152906001019060200180831162002b5657829003601f168201915b5050505050815260200160018201805462002b8f9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002bbd9062009d30565b801562002c0e5780601f1062002be25761010080835404028352916020019162002c0e565b820191906000526020600020905b81548152906001019060200180831162002bf057829003601f168201915b5050505050815260200160028201805462002c299062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002c579062009d30565b801562002ca85780601f1062002c7c5761010080835404028352916020019162002ca8565b820191906000526020600020905b81548152906001019060200180831162002c8a57829003601f168201915b5050505050815260200160038201805462002cc39062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002cf19062009d30565b801562002d425780601f1062002d165761010080835404028352916020019162002d42565b820191906000526020600020905b81548152906001019060200180831162002d2457829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002dce57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002e599062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002e879062009d30565b801562002ed85780601f1062002eac5761010080835404028352916020019162002ed8565b820191906000526020600020905b81548152906001019060200180831162002eba57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002f039062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002f319062009d30565b801562002f825780601f1062002f565761010080835404028352916020019162002f82565b820191906000526020600020905b81548152906001019060200180831162002f6457829003601f168201915b5050505050815260200160018201805462002f9d9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002fcb9062009d30565b80156200301c5780601f1062002ff0576101008083540402835291602001916200301c565b820191906000526020600020905b81548152906001019060200180831162002ffe57829003601f168201915b50505050508152602001600282018054620030379062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620030659062009d30565b8015620030b65780601f106200308a57610100808354040283529160200191620030b6565b820191906000526020600020905b8154815290600101906020018083116200309857829003601f168201915b50505050508152602001600382018054620030d19062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620030ff9062009d30565b8015620031505780601f10620031245761010080835404028352916020019162003150565b820191906000526020600020905b8154815290600101906020018083116200313257829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620031dc5750505050508152505090508060e0015180156200321f5750876001600160a01b0316836001600160a01b031614155b156200323e57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af115801562003295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032bb919062009ddf565b9050603754811015620032e15760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b03161480156200337657506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa1580156200334e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003374919062009ddf565b105b1562003395576040516317b204bf60e11b815260040160405180910390fd5b6000620186a0603a5483620033ab919062009e9b565b620033b7919062009da6565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d80600081146200340c576040519150601f19603f3d011682016040523d82523d6000602084013e62003411565b606091505b505090508062003434576040516312171d8360e31b815260040160405180910390fd5b62003440828462009e85565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af115801562003496573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620034bd919062009ddf565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e858960405162003522939291909283526020830191909152604082015260600190565b60405180910390a460408051600280825260608201835260009260208301908036833701905050905086604001518160008151811062003566576200356662009eb5565b60200260200101906001600160a01b031690816001600160a01b031681525050856040015181600181518110620035a157620035a162009eb5565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620035e29084908c9060040162009ecb565b600060405180830381600087803b158015620035fd57600080fd5b505af115801562003612573d6000803e3d6000fd5b505050508a1562003684576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200364f92919062009d66565b600060405180830381600087803b1580156200366a57600080fd5b505af11580156200367f573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff1615620036c957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620036fb5760405163b1d02c3d60e01b815260040160405180910390fd5b3362003709603f8262007ddd565b620037275760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200374d90620151809062009dc9565b11156200376d57604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620037a75760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b039081169086161015620037e5576009820154620037df9086906001600160401b031662009ef7565b620037ff565b6009820154620037ff906001600160401b03168662009ef7565b60098301546001600160401b039182169250600160801b9004168111156200383a5760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b60608060606000620038b9603f62008930565b90508086101562003f2f578415620038d25784620038d4565b805b9450600085620038e5888462009e85565b11620038fd57620038f7878362009e85565b620038ff565b855b9050806001600160401b038111156200391c576200391c620095b3565b60405190808252806020026020018201604052801562003946578160200160208202803683370190505b509450806001600160401b03811115620039645762003964620095b3565b6040519080825280602002602001820160405280156200398e578160200160208202803683370190505b509350806001600160401b03811115620039ac57620039ac620095b3565b604051908082528060200260200182016040528015620039e157816020015b6060815260200190600190039081620039cb5790505b50925060005b8181101562003f2c57600062003a0b62003a02838b62009dc9565b603f906200893b565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003a789062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003aa69062009d30565b801562003af75780601f1062003acb5761010080835404028352916020019162003af7565b820191906000526020600020905b81548152906001019060200180831162003ad957829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003b229062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003b509062009d30565b801562003ba15780601f1062003b755761010080835404028352916020019162003ba1565b820191906000526020600020905b81548152906001019060200180831162003b8357829003601f168201915b5050505050815260200160018201805462003bbc9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003bea9062009d30565b801562003c3b5780601f1062003c0f5761010080835404028352916020019162003c3b565b820191906000526020600020905b81548152906001019060200180831162003c1d57829003601f168201915b5050505050815260200160028201805462003c569062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003c849062009d30565b801562003cd55780601f1062003ca95761010080835404028352916020019162003cd5565b820191906000526020600020905b81548152906001019060200180831162003cb757829003601f168201915b5050505050815260200160038201805462003cf09062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003d1e9062009d30565b801562003d6f5780601f1062003d435761010080835404028352916020019162003d6f565b820191906000526020600020905b81548152906001019060200180831162003d5157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162003dfb575050505050815250509050806000015188848151811062003e345762003e3462009eb5565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003ecd5780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003ea1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003ec7919062009ddf565b62003ed0565b60005b87848151811062003ee55762003ee562009eb5565b602002602001018181525050806080015186848151811062003f0b5762003f0b62009eb5565b602002602001018190525050508062003f249062009f1a565b9050620039e7565b50505b92959194509250565b60005462010000900460ff161562003f6357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562003f955760405163b1d02c3d60e01b815260040160405180910390fd5b3362003fa3603f8262007ddd565b1562003fc257604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b03888116600090815260436020526040902054161515806200400357506001600160a01b03881660009081526047602052604090205460ff165b156200402257604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b0316604588886040516200404192919062009d80565b908152604051908190036020019020546001600160a01b03161415806200408b5750604887876040516200407792919062009d80565b9081526040519081900360200190205460ff165b15620040aa576040516311fdb94760e01b815260040160405180910390fd5b6000620040b8838062009f36565b604051602001620040cb92919062009d80565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff1615620041155760405163c0bf414360e01b815260040160405180910390fd5b60006200412b670de0b6b3a76400003462009e85565b905060365481101562004151576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a166200417957604051636520611b60e11b815260040160405180910390fd5b6113886200418e604087016020880162009797565b6001600160401b03161180620041d45750620041b1604086016020870162009797565b6001600160401b0316620041c9602087018762009797565b6001600160401b0316115b80620042135750620041ed604086016020870162009797565b6001600160401b031662004208606087016040880162009797565b6001600160401b0316115b15620042325760405163dc81db8560e01b815260040160405180910390fd5b6200427d62004242858062009f36565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200894992505050565b6200429b57604051635dba5ad760e01b815260040160405180910390fd5b620042aa838a8a8a8a62008aeb565b620042c857604051631647e3cb60e11b815260040160405180910390fd5b60006200431684620042db878062009f36565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062008c1b92505050565b905062004325603f8562008d1c565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620043a58b8d8362009fde565b508560058201620043b782826200a0a6565b5087905060098201620043cb82826200a1df565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004419908e908e9062009d80565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e6040516200449c9291906200a2af565b60405180910390a460408051848152602081018590526001600160a01b0387169182916000805160206200b5b6833981519152910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816916000805160206200b5b6833981519152910160405180910390a3604051633041949b60e01b815261200590633041949b9062004540908590899060040162009d66565b600060405180830381600087803b1580156200455b57600080fd5b505af115801562004570573d6000803e3d6000fd5b50505050505050505050505050505050565b604080516060810182526000808252602082018190529181019190915281620045ad603f8262007ddd565b620045cb5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915291505b50919050565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082810191909152600484018054919491608084019190620046999062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620046c79062009d30565b8015620047185780601f10620046ec5761010080835404028352916020019162004718565b820191906000526020600020905b815481529060010190602001808311620046fa57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620047439062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620047719062009d30565b8015620047c25780601f106200479657610100808354040283529160200191620047c2565b820191906000526020600020905b815481529060010190602001808311620047a457829003601f168201915b50505050508152602001600182018054620047dd9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200480b9062009d30565b80156200485c5780601f1062004830576101008083540402835291602001916200485c565b820191906000526020600020905b8154815290600101906020018083116200483e57829003601f168201915b50505050508152602001600282018054620048779062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620048a59062009d30565b8015620048f65780601f10620048ca57610100808354040283529160200191620048f6565b820191906000526020600020905b815481529060010190602001808311620048d857829003601f168201915b50505050508152602001600382018054620049119062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200493f9062009d30565b8015620049905780601f10620049645761010080835404028352916020019162004990565b820191906000526020600020905b8154815290600101906020018083116200497257829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162004a1c5750505091909252505050608001519392505050565b336110011462004a6d57604051630f22c43960e41b8152611001600482015260240162001134565b6001600160a01b038082166000908152604360205260409020541662004a95603f8262007ddd565b62004ab35760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004b16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004b3c919062009ddf565b90506000603d544262004b50919062009dc9565b905062004b5e838262007e8a565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004b9e9392919062009e0f565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004bdc916001600160a01b031690889060040162009d66565b600060405180830381600087803b15801562004bf757600080fd5b505af115801562004c0c573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004c385750600054600160ff909116105b8062004c545750303b15801562004c54575060005460ff166001145b62004cb95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162001134565b6000805460ff19166001179055801562004cdd576000805461ff0019166101001790555b33411462004cfe5760405163022d8c9560e31b815260040160405180910390fd5b3a1562004d1e576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d60385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562278d00603e55604a5560408051610760810190915261074080825260609182916200b5d6602083013980602001905181019062004daf91906200a2eb565b915060405180611160016040528061114081526020016200bd16611140913980602001905181019062004de391906200a38f565b905060005b825181101562004e525760016047600085848151811062004e0d5762004e0d62009eb5565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562004e4a8162009f1a565b905062004de8565b5060005b815181101562004ec3576001604883838151811062004e795762004e7962009eb5565b602002602001015160405162004e9091906200a48c565b908152604051908190036020019020805491151560ff1990921691909117905562004ebb8162009f1a565b905062004e56565b5062004ee37308e68ec70fa3b629784fdb28887e206ce8561e0862008d33565b505080156200174c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b336120001462004f5657604051630f22c43960e41b8152612000600482015260240162001134565b7faa5ba621c8b3d7d05bb9e51a7506108251d4d5dbe542ca66fc7bb52aacb02b6583838360405162004f8b939291906200a4aa565b60405180910390a1505050565b600054630100000090046001600160a01b0316331462004fcb576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff161562004ff657604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b60006200503f603f8462007ddd565b6200505d5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa158015620050ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620050e0919062009ddf565b90505b92915050565b60005462010000900460ff16156200511457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620051465760405163b1d02c3d60e01b815260040160405180910390fd5b8162005154603f8262007ddd565b620051725760405163056e881160e01b815260040160405180910390fd5b6037543490811015620051985760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620052009062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200522e9062009d30565b80156200527f5780601f1062005253576101008083540402835291602001916200527f565b820191906000526020600020905b8154815290600101906020018083116200526157829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620052aa9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620052d89062009d30565b8015620053295780601f10620052fd5761010080835404028352916020019162005329565b820191906000526020600020905b8154815290600101906020018083116200530b57829003601f168201915b50505050508152602001600182018054620053449062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620053729062009d30565b8015620053c35780601f106200539757610100808354040283529160200191620053c3565b820191906000526020600020905b815481529060010190602001808311620053a557829003601f168201915b50505050508152602001600282018054620053de9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200540c9062009d30565b80156200545d5780601f1062005431576101008083540402835291602001916200545d565b820191906000526020600020905b8154815290600101906020018083116200543f57829003601f168201915b50505050508152602001600382018054620054789062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620054a69062009d30565b8015620054f75780601f10620054cb57610100808354040283529160200191620054f7565b820191906000526020600020905b815481529060010190602001808311620054d957829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620055835750505050508152505090508060e001518015620055c65750856001600160a01b0316826001600160a01b031614155b15620055e557604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562005636573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200565d919062009ddf565b9050826001600160a01b0316876001600160a01b03166000805160206200b5b683398151915283876040516200569d929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b91620056d29190879060040162009d66565b600060405180830381600087803b158015620056ed57600080fd5b505af115801562005702573d6000803e3d6000fd5b50505050851562001745576040516372f6ad8f60e11b81526120059063e5ed5b1e90620057369086908b9060040162009d66565b600060405180830381600087803b1580156200575157600080fd5b505af115801562005766573d6000803e3d6000fd5b5050505050505050505050565b6200579f6040518060800160405280606081526020016060815260200160608152602001606081525090565b81620057ad603f8262007ddd565b620057cb5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602052604090819020815160808101909252600501805482908290620058029062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620058309062009d30565b8015620058815780601f10620058555761010080835404028352916020019162005881565b820191906000526020600020905b8154815290600101906020018083116200586357829003601f168201915b505050505081526020016001820180546200589c9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620058ca9062009d30565b80156200591b5780601f10620058ef576101008083540402835291602001916200591b565b820191906000526020600020905b815481529060010190602001808311620058fd57829003601f168201915b50505050508152602001600282018054620059369062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620059649062009d30565b8015620059b55780601f106200598957610100808354040283529160200191620059b5565b820191906000526020600020905b8154815290600101906020018083116200599757829003601f168201915b50505050508152602001600382018054620059d09062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620059fe9062009d30565b801562005a4f5780601f1062005a235761010080835404028352916020019162005a4f565b820191906000526020600020905b81548152906001019060200180831162005a3157829003601f168201915b505050505081525050915050919050565b60005462010000900460ff161562005a8b57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005abd5760405163b1d02c3d60e01b815260040160405180910390fd5b62005ac9828262008dcc565b5050565b336110071462005af557604051630f22c43960e41b8152611007600482015260240162001134565b62005b626040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005c1d576020811462005b945783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005bd791858580838501838280828437600092019190915250929392505062008f359050565b90506108fc81108062005beb575061271081115b1562005c145784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60355562006927565b62005c8e6040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005d58576020811462005cc05783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005d0391858580838501838280828437600092019190915250929392505062008f359050565b9050683635c9adc5dea0000081108062005d26575069152d02c7e14af680000081115b1562005d4f5784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60365562006927565b62005dcb604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005e92576020811462005dfd5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005e4091858580838501838280828437600092019190915250929392505062008f359050565b905067016345785d8a000081108062005e605750678ac7230489e8000081115b1562005e895784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60375562006927565b62005f03604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005fbb576020811462005f355783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005f7891858580838501838280828437600092019190915250929392505062008f359050565b905080158062005f8957506101f481115b1562005fb25784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60385562006927565b620060246040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620060e15760208114620060565783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200609991858580838501838280828437600092019190915250929392505062008f359050565b90506203f480811080620060af575062278d0081115b15620060d85784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60395562006927565b6200614f60405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620061fc5760208114620061815783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f8401819004810282018101909252828152600091620061c491858580838501838280828437600092019190915250929392505062008f359050565b90506064811115620061f35784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603a5562006927565b6200626c60405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b156200632d57602081146200629e5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f8401819004810282018101909252828152600091620062e191858580838501838280828437600092019190915250929392505062008f359050565b9050674563918244f40000811080620062fb5750603c5481115b15620063245784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603b5562006927565b6200639b6040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b156200645e5760208114620063cd5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200641091858580838501838280828437600092019190915250929392505062008f359050565b905068056bc75e2d631000008110806200642c5750603b548111155b15620064555784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603c5562006927565b620064cb6040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620065885760208114620064fd5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200654091858580838501838280828437600092019190915250929392505062008f359050565b90506202a300811080620065565750603e548110155b156200657f5784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603d5562006927565b620065f36040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620066b05760208114620066255783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200666891858580838501838280828437600092019190915250929392505062008f359050565b9050620d2f008110806200667e5750603d548111155b15620066a75784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603e5562006927565b6200672a6040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620067d657602081146200675c5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200679f91858580838501838280828437600092019190915250929392505062008f359050565b905080600003620067cd5784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b604a5562006927565b620068446040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620069045760148114620068765783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b6000620068be601484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008f359050565b90506001600160a01b038116620068f25784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b620068fd8162008f3a565b5062006927565b838383836040516325ee20d560e21b81526004016200113494939291906200a4c9565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516200695e94939291906200a4c9565b60405180910390a150505050565b60005462010000900460ff16156200699757604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620069c95760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b03811115620069e757620069e7620095b3565b60405190808252806020026020018201604052801562006a11578160200160208202803683370190505b5090506000805b8381101562006b0f5762006a5a87878381811062006a3a5762006a3a62009eb5565b905060200201602081019062006a51919062009442565b603f9062007ddd565b62006a785760405163056e881160e01b815260040160405180910390fd5b6041600088888481811062006a915762006a9162009eb5565b905060200201602081019062006aa8919062009442565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006ae45762006ae462009eb5565b6001600160a01b039092166020928302919091019091015262006b078162009f1a565b905062006a18565b50604051634484077560e01b8152612005906344840775906200288f908590889060040162009ecb565b606080600062006b4a603f62008930565b90508085101562006d0e57831562006b63578362006b65565b805b935060008462006b76878462009e85565b1162006b8e5762006b88868362009e85565b62006b90565b845b9050806001600160401b0381111562006bad5762006bad620095b3565b60405190808252806020026020018201604052801562006bd7578160200160208202803683370190505b509350806001600160401b0381111562006bf55762006bf5620095b3565b60405190808252806020026020018201604052801562006c1f578160200160208202803683370190505b50925060005b8181101562006d0b5762006c3e62003a02828962009dc9565b85828151811062006c535762006c5362009eb5565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006c8c5762006c8c62009eb5565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006ce05762006ce062009eb5565b6001600160a01b039092166020928302919091019091015262006d038162009f1a565b905062006c25565b50505b9250925092565b336110011462006d3d57604051630f22c43960e41b8152611001600482015260240162001134565b60005462010000900460ff161562006d6857604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006d90603f8262007ddd565b62006dae5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006dd6620151804262009da6565b604a546000828152604b60205260409020549192501162006e0a5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006e2b90849062009dc9565b90915550506001600160a01b0384166000908152604460205260409020541580159062006e8057506001600160a01b038416600090815260446020526040902054429062006e7e90620151809062009dc9565b105b1562006e9f576040516330abb81d60e21b815260040160405180910390fd5b60008062006eaf85600062007e00565b915091508162006ed257604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562006f25573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062006f4b919062009ddf565b905062006f59858362007e8a565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600060405162006f999392919062009e0f565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162005736916001600160a01b0316908a9060040162009d66565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849384938493909291608084019190620070489062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620070769062009d30565b8015620070c75780601f106200709b57610100808354040283529160200191620070c7565b820191906000526020600020905b815481529060010190602001808311620070a957829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620070f29062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620071209062009d30565b8015620071715780601f10620071455761010080835404028352916020019162007171565b820191906000526020600020905b8154815290600101906020018083116200715357829003601f168201915b505050505081526020016001820180546200718c9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620071ba9062009d30565b80156200720b5780601f10620071df576101008083540402835291602001916200720b565b820191906000526020600020905b815481529060010190602001808311620071ed57829003601f168201915b50505050508152602001600282018054620072269062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620072549062009d30565b8015620072a55780601f106200727957610100808354040283529160200191620072a5565b820191906000526020600020905b8154815290600101906020018083116200728757829003601f168201915b50505050508152602001600382018054620072c09062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620072ee9062009d30565b80156200733f5780601f1062007313576101008083540402835291602001916200733f565b820191906000526020600020905b8154815290600101906020018083116200732157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620073cb5750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200743257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620074645760405163b1d02c3d60e01b815260040160405180910390fd5b3362007472603f8262007ddd565b620074905760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c8101544290620074b690620151809062009dc9565b1115620074d657604051631f92cdbd60e11b815260040160405180910390fd5b600581018054620074e79062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620075159062009d30565b8015620075665780601f106200753a5761010080835404028352916020019162007566565b820191906000526020600020905b8154815290600101906020018083116200754857829003601f168201915b50505082875250859160058401915081906200758390826200a4f4565b50602082015160018201906200759a90826200a4f4565b5060408201516002820190620075b190826200a4f4565b5060608201516003820190620075c890826200a4f4565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff16156200763657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620076685760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007689576040516341abc80160e01b815260040160405180910390fd5b60005b83811015620076fa57620076e7858583818110620076ae57620076ae62009eb5565b9050602002016020810190620076c5919062009442565b848484818110620076da57620076da62009eb5565b9050602002013562008dcc565b620076f28162009f1a565b90506200768c565b5050505050565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492938493909160808401916200776c9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200779a9062009d30565b8015620077eb5780601f10620077bf57610100808354040283529160200191620077eb565b820191906000526020600020905b815481529060010190602001808311620077cd57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620078169062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620078449062009d30565b8015620078955780601f10620078695761010080835404028352916020019162007895565b820191906000526020600020905b8154815290600101906020018083116200787757829003601f168201915b50505050508152602001600182018054620078b09062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620078de9062009d30565b80156200792f5780601f1062007903576101008083540402835291602001916200792f565b820191906000526020600020905b8154815290600101906020018083116200791157829003601f168201915b505050505081526020016002820180546200794a9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620079789062009d30565b8015620079c95780601f106200799d57610100808354040283529160200191620079c9565b820191906000526020600020905b815481529060010190602001808311620079ab57829003601f168201915b50505050508152602001600382018054620079e49062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462007a129062009d30565b801562007a635780601f1062007a375761010080835404028352916020019162007a63565b820191906000526020600020905b81548152906001019060200180831162007a4557829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162007aef5750505091909252505050604001519392505050565b600062007b27603f8462007ddd565b62007b455760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd906024016200509c565b60005462010000900460ff161562007bb457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007be65760405163b1d02c3d60e01b815260040160405180910390fd5b3362007bf4603f8262007ddd565b62007c125760405163056e881160e01b815260040160405180910390fd5b3362007c22818787878762008aeb565b62007c4057604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007c5f92919062009d80565b908152604051908190036020019020546001600160a01b031614158062007ca957506048868660405162007c9592919062009d80565b9081526040519081900360200190205460ff165b1562007cc8576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007cf790620151809062009dc9565b111562007d1757604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007d2d91906200a5bc565b908152604051908190036020019020556004810162007d4e87898362009fde565b5042600c820155604051829060459062007d6c908a908a9062009d80565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007dcc908a908a906200a2af565b60405180910390a250505050505050565b6001600160a01b03811660009081526001830160205260408120541515620050e0565b6000806000848460405160200162007e1a9291906200a63a565b60408051601f1981840301815291815281516020928301206000818152604c9093529120549091504281111562007e5a5760008093509350505062007e83565b603e5462007e69904262009dc9565b6000928352604c6020526040909220829055506001925090505b9250929050565b8154604051631507fdb760e11b81526001600160a01b03909116600482015261100090632a0ffb6e90602401600060405180830381600087803b15801562007ed157600080fd5b505af115801562007ee6573d6000803e3d6000fd5b505050506000600162007efa603f62008930565b62007f06919062009e85565b604954108015915062007fc45760405163d31f968d60e01b81526110006004820152600860248201526120009063d31f968d90604401602060405180830381865afa15801562007f5a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062007f80919062009e3e565b62007fc45760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b015482111562007fd957600b83018290555b600a83015460ff166200804c57600a8301805460ff19166001908117909155604980546000906200800c90849062009dc9565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845283820183905283860183905283018290528451808601865282815281018290528451808601909552855185528581019085015291928290620080c39062008fa6565b90506000805b620080d48362009019565b15620081a757806000036200810957620080f8620080f2846200903f565b620090a3565b6001600160a01b0316845262008194565b80600103620081355762008121620080f2846200903f565b6001600160a01b0316602085015262008194565b8060020362008161576200814d620080f2846200903f565b6001600160a01b0316604085015262008194565b806003036200818e576200817f62008179846200903f565b620090bb565b60608501526001915062008194565b620081a7565b6200819f8162009f1a565b9050620080c9565b5091959194509092505050565b6020808201516001600160a01b031660009081526001909152604081205460ff1680620081ec575060208201516001600160a01b0316155b15620081fa57506004919050565b81516200820a90603f9062007ddd565b6200821757506002919050565b81516001600160a01b03908116600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492939192608084019190620082839062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620082b19062009d30565b8015620083025780601f10620082d65761010080835404028352916020019162008302565b820191906000526020600020905b815481529060010190602001808311620082e457829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200832d9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200835b9062009d30565b8015620083ac5780601f106200838057610100808354040283529160200191620083ac565b820191906000526020600020905b8154815290600101906020018083116200838e57829003601f168201915b50505050508152602001600182018054620083c79062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620083f59062009d30565b8015620084465780601f106200841a5761010080835404028352916020019162008446565b820191906000526020600020905b8154815290600101906020018083116200842857829003601f168201915b50505050508152602001600282018054620084619062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200848f9062009d30565b8015620084e05780601f10620084b457610100808354040283529160200191620084e0565b820191906000526020600020905b815481529060010190602001808311620084c257829003601f168201915b50505050508152602001600382018054620084fb9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620085299062009d30565b80156200857a5780601f106200854e576101008083540402835291602001916200857a565b820191906000526020600020905b8154815290600101906020018083116200855c57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620086065750505050508152505090508060e00151801562008651575082600001516001600160a01b031683602001516001600160a01b031614155b15620086605750600392915050565b6040808201516060850151602086015192516317066a5760e21b81526001600160a01b03938416600482015260009390921691635c19a95c919060240160206040518083038185885af1158015620086bc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620086e3919062009ddf565b905083602001516001600160a01b031684600001516001600160a01b03166000805160206200b5b68339815191528387606001516040516200872f929190918252602082015260400190565b60405180910390a383602001516001600160a01b031684600001516001600160a01b03167f607b17598da6bdca05650a2fc08bd2bc8e38c3236806a0fa8e0daabc1d6cb1d883876060015160405162008792929190918252602082015260400190565b60405180910390a360408083015160208601519151633041949b60e01b815261200592633041949b92620087cc9290919060040162009d66565b600060405180830381600087803b158015620087e757600080fd5b505af1158015620087fc573d6000803e3d6000fd5b506000979650505050505050565b6001600160a01b0381166000908152604160205260409020600a81015460ff161562008834575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa15801562008884573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620088aa919062009ddf565b101562005ac957620088cc81603d5442620088c6919062009dc9565b62007e8a565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200891357600080fd5b505af115801562008928573d6000803e3d6000fd5b505050505050565b6000620050e3825490565b6000620050e0838362009193565b60008082905060038151108062008961575060098151115b15620089705750600092915050565b60418160008151811062008988576200898862009eb5565b016020015160f81c1080620089ba5750605a81600081518110620089b057620089b062009eb5565b016020015160f81c115b15620089c95750600092915050565b60015b815181101562008ae1576030828281518110620089ed57620089ed62009eb5565b016020015160f81c108062008a1e5750603982828151811062008a145762008a1462009eb5565b016020015160f81c115b801562008a6e5750604182828151811062008a3d5762008a3d62009eb5565b016020015160f81c108062008a6e5750605a82828151811062008a645762008a6462009eb5565b016020015160f81c115b801562008abe5750606182828151811062008a8d5762008a8d62009eb5565b016020015160f81c108062008abe5750607a82828151811062008ab45762008ab462009eb5565b016020015160f81c115b1562008ace575060009392505050565b62008ad98162009f1a565b9050620089cc565b5060019392505050565b600060308414158062008aff575060608214155b1562008b0e5750600062008c12565b60008686864660405160200162008b2994939291906200a678565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a60405160200162008b839594939291906200a6a5565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa62008bcd57600080fd5b5060008160008151811062008be65762008be662009eb5565b016020015160f81c90506001811462008c085760009550505050505062008c12565b6001955050505050505b95945050505050565b60008061200361dead60405162008c32906200941e565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f08015801562008c75573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b815260040162008ca99291906200a6dd565b6000604051808303818588803b15801562008cc357600080fd5b505af115801562008cd8573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b6000620050e0836001600160a01b038416620091c0565b600054610100900460ff1662008da05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001134565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008dda603f8262007ddd565b62008df85760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562008e5c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008e82919062009ddf565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd39926838360405162008eca91815260200190565b60405180910390a350505050565b60008160405160200162008eed91906200a48c565b604051602081830303815290604052805190602001208360405160200162008f1691906200a48c565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b604080516080810182526000918101828152606082018390528152602081019190915262008fd48262009212565b62008fde57600080fd5b600062008fef836020015162009245565b836020015162009000919062009dc9565b6040805180820190915293845260208401525090919050565b80518051602082015160009291620090319162009dc9565b836020015110915050919050565b60408051808201909152600080825260208201526200905e8262009019565b6200906857600080fd5b602082015160006200907a82620092d4565b905062009088818362009dc9565b60209485015260408051808201909152908152928301525090565b8051600090601514620090b557600080fd5b620050e3825b805160009015801590620090d157508151602110155b620090db57600080fd5b6000620090ec836020015162009245565b90508083600001511015620091445760405162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015260640162001134565b82516000906200915690839062009e85565b90506000808386602001516200916d919062009dc9565b90508051915060208310156200918a57826020036101000a820491505b50949350505050565b6000826000018281548110620091ad57620091ad62009eb5565b9060005260206000200154905092915050565b60008181526001830160205260408120546200920957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620050e3565b506000620050e3565b805160009081036200922657506000919050565b6020820151805160001a9060c082101562008ae1575060009392505050565b8051600090811a60808110156200925f5750600092915050565b60b88110806200927c575060c081108015906200927c575060f881105b156200928b5750600192915050565b60c0811015620092c657620092a3600160b86200a703565b620092b29060ff168262009e85565b620092bf90600162009dc9565b9392505050565b620092a3600160f86200a703565b80516000908190811a6080811015620092f1576001915062009417565b60b88110156200931d576200930860808262009e85565b6200931590600162009dc9565b915062009417565b60c08110156200939657600060b78203600186019550806020036101000a8651049150600181018201935050808310156200938f5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001134565b5062009417565b60f8811015620093ad576200930860c08262009e85565b600060f78203600186019550806020036101000a865104915060018101820193505080831015620094155760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001134565b505b5092915050565b610e96806200a72083390190565b6001600160a01b03811681146200174c57600080fd5b6000602082840312156200945557600080fd5b8135620092bf816200942c565b60008083601f8401126200947557600080fd5b5081356001600160401b038111156200948d57600080fd5b60208301915083602082850101111562007e8357600080fd5b60008060208385031215620094ba57600080fd5b82356001600160401b03811115620094d157600080fd5b620094df8582860162009462565b90969095509350505050565b6000806000604084860312156200950157600080fd5b833560ff811681146200951357600080fd5b925060208401356001600160401b038111156200952f57600080fd5b6200953d8682870162009462565b9497909650939450505050565b60005b83811015620095675781810151838201526020016200954d565b50506000910152565b600081518084526200958a8160208601602086016200954a565b601f01601f19169290920160200192915050565b602081526000620050e0602083018462009570565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620095ee57620095ee620095b3565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200961f576200961f620095b3565b604052919050565b60006001600160401b03821115620096435762009643620095b3565b50601f01601f191660200190565b600062009668620096628462009627565b620095f4565b90508281528383830111156200967d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215620096a757600080fd5b81356001600160401b03811115620096be57600080fd5b8201601f81018413620096d057600080fd5b620096e18482356020840162009651565b949350505050565b60008060408385031215620096fd57600080fd5b82356200970a816200942c565b946020939093013593505050565b80151581146200174c57600080fd5b600080600080608085870312156200973e57600080fd5b84356200974b816200942c565b935060208501356200975d816200942c565b9250604085013591506060850135620097768162009718565b939692955090935050565b6001600160401b03811681146200174c57600080fd5b600060208284031215620097aa57600080fd5b8135620092bf8162009781565b60008060408385031215620097cb57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015620098155781516001600160a01b031687529582019590820190600101620097ee565b509495945050505050565b608081526000620098356080830187620097da565b82810360208481019190915286518083528782019282019060005b818110156200986e5784518352938301939183019160010162009850565b5050848103604086015286518082528282019350600581901b8201830183890160005b83811015620098c357601f19858403018752620098b083835162009570565b9686019692509085019060010162009891565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e0811215620098f957600080fd5b883562009906816200942c565b975060208901356001600160401b03808211156200992357600080fd5b620099318c838d0162009462565b909950975060408b01359150808211156200994b57600080fd5b620099598c838d0162009462565b90975095508591506060605f19840112156200997457600080fd5b60608b01945060c08b01359250808311156200998f57600080fd5b505088016080818b031215620099a457600080fd5b8091505092959891949750929550565b60008060408385031215620099c857600080fd5b8235620099d5816200942c565b91506020830135620099e78162009718565b809150509250929050565b60208152600082516080602084015262009a1060a084018262009570565b90506020840151601f198085840301604086015262009a30838362009570565b9250604086015191508085840301606086015262009a4f838362009570565b925060608601519150808584030160808601525062008c12828262009570565b6000806000806040858703121562009a8657600080fd5b84356001600160401b038082111562009a9e57600080fd5b62009aac8883890162009462565b9096509450602087013591508082111562009ac657600080fd5b5062009ad58782880162009462565b95989497509550505050565b60008083601f84011262009af457600080fd5b5081356001600160401b0381111562009b0c57600080fd5b6020830191508360208260051b850101111562007e8357600080fd5b60008060006040848603121562009b3e57600080fd5b83356001600160401b0381111562009b5557600080fd5b62009b638682870162009ae1565b909450925050602084013562009b79816200942c565b809150509250925092565b60608152600062009b996060830186620097da565b828103602084015262009bad8186620097da565b915050826040830152949350505050565b600082601f83011262009bd057600080fd5b620050e08383356020850162009651565b60006020828403121562009bf457600080fd5b81356001600160401b038082111562009c0c57600080fd5b908301906080828603121562009c2157600080fd5b62009c2b620095c9565b82358281111562009c3b57600080fd5b62009c498782860162009bbe565b82525060208301358281111562009c5f57600080fd5b62009c6d8782860162009bbe565b60208301525060408301358281111562009c8657600080fd5b62009c948782860162009bbe565b60408301525060608301358281111562009cad57600080fd5b62009cbb8782860162009bbe565b60608301525095945050505050565b6000806000806040858703121562009ce157600080fd5b84356001600160401b038082111562009cf957600080fd5b62009d078883890162009ae1565b9096509450602087013591508082111562009d2157600080fd5b5062009ad58782880162009ae1565b600181811c9082168062009d4557607f821691505b6020821081036200462657634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b60008262009dc457634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620050e357620050e362009d90565b60006020828403121562009df257600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260208101839052606081016003831062009e305762009e3062009df9565b826040830152949350505050565b60006020828403121562009e5157600080fd5b8151620092bf8162009718565b828152604081016005831062009e785762009e7862009df9565b8260208301529392505050565b81810381811115620050e357620050e362009d90565b8082028115828204841417620050e357620050e362009d90565b634e487b7160e01b600052603260045260246000fd5b60408152600062009ee06040830185620097da565b905060018060a01b03831660208301529392505050565b6001600160401b0382811682821603908082111562009417576200941762009d90565b60006001820162009f2f5762009f2f62009d90565b5060010190565b6000808335601e1984360301811262009f4e57600080fd5b8301803591506001600160401b0382111562009f6957600080fd5b60200191503681900382131562007e8357600080fd5b601f8211156200804c57600081815260208120601f850160051c8101602086101562009fa85750805b601f850160051c820191505b81811015620089285782815560010162009fb4565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562009ff85762009ff8620095b3565b6200a010836200a009835462009d30565b8362009f7f565b6000601f8411600181146200a04357600085156200a02e5750838201355b6200a03a868262009fc9565b845550620076fa565b600083815260209020601f19861690835b828110156200a07657868501358255602094850194600190920191016200a054565b50868210156200a0945760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200a0b2828362009f36565b6001600160401b038111156200a0cc576200a0cc620095b3565b6200a0e4816200a0dd855462009d30565b8562009f7f565b6000601f8211600181146200a11757600083156200a1025750838201355b6200a10e848262009fc9565b8655506200a174565b600085815260209020601f19841690835b828110156200a14a57868501358255602094850194600190920191016200a128565b50848210156200a1685760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506200a187602083018362009f36565b6200a19781836001860162009fde565b50506200a1a8604083018362009f36565b6200a1b881836002860162009fde565b50506200a1c9606083018362009f36565b6200a1d981836003860162009fde565b50505050565b81356200a1ec8162009781565b6001600160401b03811690508154816001600160401b0319821617835560208401356200a2198162009781565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff198316841781178555908501356200a2598162009781565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000620096e16020830184866200a286565b60006001600160401b038211156200a2e1576200a2e1620095b3565b5060051b60200190565b600060208083850312156200a2ff57600080fd5b82516001600160401b038111156200a31657600080fd5b8301601f810185136200a32857600080fd5b80516200a33962009662826200a2c5565b81815260059190911b820183019083810190878311156200a35957600080fd5b928401925b828410156200a3845783516200a374816200942c565b825292840192908401906200a35e565b979650505050505050565b600060208083850312156200a3a357600080fd5b82516001600160401b03808211156200a3bb57600080fd5b818501915085601f8301126200a3d057600080fd5b81516200a3e162009662826200a2c5565b81815260059190911b830184019084810190888311156200a40157600080fd5b8585015b838110156200a47f578051858111156200a41f5760008081fd5b8601603f81018b136200a4325760008081fd5b8781015160406200a447620096628362009627565b8281528d828486010111156200a45d5760008081fd5b6200a46e838c83018487016200954a565b86525050509186019186016200a405565b5098975050505050505050565b600082516200a4a08184602087016200954a565b9190910192915050565b60ff8416815260406020820152600062008c126040830184866200a286565b6040815260006200a4df6040830186886200a286565b82810360208401526200a3848185876200a286565b81516001600160401b038111156200a510576200a510620095b3565b6200a528816200a521845462009d30565b8462009f7f565b602080601f8311600181146200a55c57600084156200a5475750858301515b6200a553858262009fc9565b86555062008928565b600085815260208120601f198616915b828110156200a58d578886015182559484019460019091019084016200a56c565b50858210156200a5ac5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200a5cc8162009d30565b600182811680156200a5e757600181146200a5fd576200a62e565b60ff19841687528215158302870194506200a62e565b8760005260208060002060005b858110156200a6255781548a8201529084019082016200a60a565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200a664576200a66462009df9565b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b600086516200a6b9818460208b016200954a565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b0383168152604060208201819052600090620096e19083018462009570565b60ff8281168282160390811115620050e357620050e362009d9056fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656424d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e0400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000038000000000000000000000000295e26495cef6f69dfa69911d9d8e4f3bbadb89b00000000000000000000000072b61c6014342d914470ec7ac2975be345796c2b0000000000000000000000002465176c461afb316ebc773c61faee85a6515daa0000000000000000000000007ae2f5b9e386cd1b50a4550696d957cb4900f03a000000000000000000000000b4dd66d7c2c7e57f628210187192fb89d4b99dd4000000000000000000000000e9ae3261a475a27bb1028f140bc2a7c843318afd000000000000000000000000ee226379db83cffc681495730c11fdde79ba4c0c0000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa10000000000000000000000008b6c8fd93d6f4cea42bbb345dbc6f0dfdb5bec73000000000000000000000000ef0274e31810c9df02f98fafde0f841f4e66a1cd000000000000000000000000a6f79b60359f141df90a0c745125b131caaffd12000000000000000000000000e2d3a739effcd3a99387d015e260eefac72ebea100000000000000000000000061dd481a114a2e761c554b641742c973867899d3000000000000000000000000cc8e6d00c17eb431350c6c50d8b8f05176b90b11000000000000000000000000ea0a6e3c511bbd10f4519ece37dc24887e11b55d0000000000000000000000002d4c407bbe49438ed859fe965b140dcf1aab71a9000000000000000000000000685b1ded8013785d6623cc18d214320b6bb64759000000000000000000000000d1d6bf74282782b0b3eb1413c901d6ecf02e8e2800000000000000000000000070f657164e5b75689b64b7fd1fa275f334f28e18000000000000000000000000be807dddb074639cd9fa61b47676c064fc50d62c000000000000000000000000b218c5d6af1f979ac42bc68d98a5a0d796c6ab010000000000000000000000009f8ccdafcc39f3c7d6ebf637c9151673cbc36b88000000000000000000000000d93dbfb27e027f5e9e6da52b9e1c413ce35adc11000000000000000000000000ce2fd7544e0b2cc94692d4a704debef7bcb613280000000000000000000000000bac492386862ad3df4b666bc096b0505bb694da000000000000000000000000733fda7714a05960b7536330be4dbb135bef0ed600000000000000000000000035ebb5849518aff370ca25e19e1072cc1a9fabca000000000000000000000000ebe0b55ad7bb78309180cada12427d120fdbcc3a0000000000000000000000006488aa4d1955ee33403f8ccb1d4de5fb97c7ade20000000000000000000000004396e28197653d0c244d95f8c1e57da902a72b4e000000000000000000000000702be18040aa2a9b1af9219941469f1a435854fc00000000000000000000000012d810c13e42811e9907c02e02d1fad46cfa18ba0000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e2000000000000000000000000b8f7166496996a7da21cf1f1b04d9b3e26a3d0770000000000000000000000009bb832254baf4e8b4cc26bd2b52b31389b56e98b0000000000000000000000004430b3230294d12c6ab2aac5c2cd68e80b16b581000000000000000000000000c2be4ec20253b8642161bc3f444f53679c1f3d47000000000000000000000000ee01c3b1283aa067c58eab4709f85e99d46de5fe0000000000000000000000009ef9f4360c606c7ab4db26b016007d3ad0ab86a00000000000000000000000002f7be8361c80a4c1e7e9aaf001d0877f1cfde21800000000000000000000000035e7a025f4da968de7e4d7e4004197917f4070f1000000000000000000000000d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000008c4d90829ce8f72d0163c1d5cf348a862d55063000000000000000000000000068bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d00000000000000000000000082012708dafc9e1b880fd083b32182b869be8e090000000000000000000000006bbad7cf34b5fa511d8e963dbba288b1960e75d600000000000000000000000022b81f8e175ffde54d797fe11eb03f9e3bf75f1d00000000000000000000000078f3adfc719c99674c072166708589033e2d9afe00000000000000000000000029a97c6effb8a411dabc6adeefaa84f5067c8bbe000000000000000000000000aacf6a8119f7e11623b5a43da638e91f669a130f0000000000000000000000002b3a6c089311b478bf629c29d790a7a6db3fc1b9000000000000000000000000fe6e72b223f6d6cf4edc6bff92f30e84b8258249000000000000000000000000a6503279e8b5c7bb5cf4defd3ec8abf3e009a80b0000000000000000000000004ee63a09170c3f2207aeca56134fc2bee1b28e3c000000000000000000000000ac0e15a038eedfc68ba3c35c73fed5be4a07afb500000000000000000000000069c77a677c40c7fbea129d4b171a39b7a8ddabfa00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000030977cf58294f7239d515e15b24cfeb82494056cf691eaf729b165f32c9757c429dba5051155903067e56ebe3698678e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003081db0422a5fd08e40db1fc2368d2245e4b18b1d0b85c921aaaafd2e341760e29fc613edd39f71254614e2055c3287a510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a923564c6ffd37fb2fe9f118ef88092e8762c7addb526ab7eb1e772baef85181f892c731be0c1891a50e6b06262c816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b84f83ff2df44193496793b847f64e9d6db1b3953682bb95edd096eb1e69bbd357c200992ca78050d0cbe180cfaa018e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0de8472be0308918c8bdb369bf5a67525210daffa053c52224c1d2ef4f5b38e4ecfcd06a1cc51c39c3a7dccfcb6b507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ae7bc6faa3f0cc3e6093b633fd7ee4f86970926958d0b7ec80437f936acf212b78f0cd095f4565fff144fd458d233a5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003084248a459464eec1a21e7fc7b71a053d9644e9bb8da4853b8f872cd7c1d6b324bf1922829830646ceadfb658d3de009a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a8a257074e82b881cfa06ef3eb4efeca060c2531359abd0eab8af1e3edfa2025fca464ac9c3fd123f6c24a0d7886948500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003098cbf822e4bc29f1701ac0350a3d042cd0756e9f74822c6481773ceb000641c51b870a996fe0f6a844510b1061f38cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b772e180fbf38a051c97dabc8aaa0126a233a9e828cdafcc7422c4bb1f4030a56ba364c54103f26bad91508b5220b741000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030956c470ddff48cb49300200b5f83497f3a3ccb3aeb83c5edd9818569038e61d197184f4aa6939ea5e9911e3e98ac6d210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a80967d39e406a0a9642d41e9007a27fc1150a267d143a9f786cd2b5eecbdcc4036273705225b956d5e2f8f5eb95d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b3a3d4feb825ae9702711566df5dbf38e82add4dd1b573b95d2466fa6501ccb81e9d26a352b96150ccbf7b697fd0a419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2d4c6283c44a1c7bd503aaba7666e9f0c830e0ff016c1c750a5e48757a713d0836b1cabfd5c281b1de3b77d1c19218300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003093c1f7f6929d1fe2a17b4e14614ef9fc5bdc713d6631d675403fbeefac55611bf612700b1b65f4744861b80b0f7d6ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a60f82a7bcf74b4cb053b9bfe83d0ed02a84ebb10865dfdd8e26e7535c43a1cccd268e860f502216b379dfc9971d358000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030939e8fb41b682372335be8070199ad3e8621d1743bcac4cc9d8f0f6e10f41e56461385c8eb5daac804fe3f2bca6ce73900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096a26afa1295da81418593bd12814463d9f6e45c36a0e47eb4cd3e5b6af29c41e2a3a5636430155a466e216585af3ba7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1f2c71577def3144fabeb75a8a1c8cb5b51d1d1b4a05eec67988b8685008baa17459ec425dbaebc852f496dc92196cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b659ad0fbd9f515893fdd740b29ba0772dbde9b4635921dd91bd2963a0fc855e31f6338f45b211c4e9dedb7f2eb09de70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308819ec5ec3e97e1f03bbb4bb6055c7a5feac8f4f259df58349a32bb5cb377e2cb1f362b77f1dd398cfd3e9dba46138c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b313f9cba57c63a84edb4079140e6dbd7829e5023c9532fce57e9fe602400a2953f4bf7dab66cca16e97be95d4de7044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b64abe25614c9cfd32e456b4d521f29c8357f4af4606978296c9be93494072ac05fa86e3d27cc8d66e65000f8ba33fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0bec348681af766751cb839576e9c515a09c8bffa30a46296ccc56612490eb480d03bf948e10005bbcc0421f90b3d4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0245c33bc556cfeb013cd3643b30dbdef6df61a0be3ba00cae104b3c587083852e28f8911689c7033f7021a8a1774c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a7f3e2c0b4b16ad183c473bafe30a36e39fa4a143657e229cd23c77f8fbc8e4e4e241695dd3d248d1e51521eee6619140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fdf49777b22f927d460fa3fcdd7f2ba0cf200634a3dfb5197d7359f2f88aaf496ef8c93a065de0f376d164ff2b6db9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308ab17a9148339ef40aed8c177379c4db0bb5efc6f5c57a5d1a6b58b84d4b562e227196c79bda9a136830ed0c09f378130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308dd20979bd63c14df617a6939c3a334798149151577dd3f1fadb2bd1c1b496bf84c25c879da5f0f9dfdb88c6dd17b1e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b679cbab0276ac30ff5f198e5e1dedf6b84959129f70fe7a07fcdf13444ba45b5dbaa7b1f650adf8b0acbecd04e2675b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308974616fe8ab950a3cded19b1d16ff49c97bf5af65154b3b097d5523eb213f3d35fc5c57e7276c7f2d83be87ebfdcdf9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ab764a39ff81dad720d5691b852898041a3842e09ecbac8025812d51b32223d8420e6ae51a01582220a10f7722de67c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309025b6715c8eaabac0bfccdb2f25d651c9b69b0a184011a4a486b0b2080319d2396e7ca337f2abdf01548b2de1b3ba06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2317f59d86abfaf690850223d90e9e7593d91a29331dfc2f84d5adecc75fc39ecab4632c1b4400a3dd1e1298835bcca00000000000000000000000000000000a164736f6c6343000811000a") + let bytes = res.get(STAKE_HUB_CONTRACT).unwrap(); + let bytes = bytes.as_ref().unwrap(); + + assert_eq!(hex::encode(bytes.original_bytes()), "608060405260043610620003db5760003560e01c806386d545061162000203578063d115a2061162000117578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000bf0578063fb50b31f1462000c15578063fc0c5ff11462000c3a578063ff69ab611462000c5257600080fd5b8063e992aaf51462000b6d578063efdbf0e11462000b85578063f1f74d841462000bc1578063f1fad1041462000bd957600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000b00578063daacdb661462000b18578063dbda7fb31462000b30578063e8f67c3b1462000b5557600080fd5b8063d115a2061462000a9d578063d6ca429d1462000ab6578063d7c2dfc81462000adb57600080fd5b8063b187bd261162000199578063c38fbec81162000164578063c38fbec81462000a1f578063c473318f1462000a44578063c8509d81146200083d578063cbb04d9d1462000a5c57600080fd5b8063b187bd26146200098c578063baa7199e14620009ac578063bdceadf314620009d1578063bff02e2014620009e957600080fd5b8063982ef0a711620001da578063982ef0a714620008f7578063a43569b3146200090e578063aad3ec961462000942578063ac431751146200096757600080fd5b806386d54506146200087a5780638a4d3fa814620008b45780638cd22b2214620008d257600080fd5b80634bf6c88211620002fb578063663706d3116200029157806376e7d6d6116200025c57806376e7d6d6146200080d5780638129fc1c1462000825578063831d65d1146200083d5780638456cb59146200086257600080fd5b8063663706d3146200073a5780636ec01b27146200076b5780636f8e2fa414620007c357806375cc7d8914620007e857600080fd5b80635949187111620002d25780635949187114620006a25780635e7cc1c914620006c757806363a036b514620006ec57806364028fbd146200072357600080fd5b80634bf6c882146200063b5780634d99dd1614620006655780634e6fd6c4146200068a57600080fd5b80631fa8882b1162000371578063449ecfe61162000348578063449ecfe6146200058757806345211bfd14620005ac5780634838d16514620005d15780634a49ac4c146200061657600080fd5b80631fa8882b146200053157806338409988146200054a578063417c73a7146200056257600080fd5b8063092193ab11620003b2578063092193ab146200047c5780630e9fbf5114620004935780631182b87514620004b857806317b4f35314620004ec57600080fd5b8063046f7da214620003fb578063059ddd2214620004135780630661806e146200045557600080fd5b36620003f65760345460ff16600114620003f457600080fd5b005b600080fd5b3480156200040857600080fd5b50620003f462000c6a565b3480156200042057600080fd5b50620004386200043236600462009442565b62000cfc565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200046257600080fd5b506200046d60365481565b6040519081526020016200044c565b620003f46200048d36600462009442565b62001111565b348015620004a057600080fd5b50620003f4620004b2366004620094a6565b6200174f565b348015620004c557600080fd5b50620004dd620004d7366004620094eb565b62001a7b565b6040516200044c91906200959e565b348015620004f957600080fd5b50620004386200050b36600462009694565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200053e57600080fd5b506200046d6201518081565b3480156200055757600080fd5b506200046d60375481565b3480156200056f57600080fd5b50620003f46200058136600462009442565b62001dee565b3480156200059457600080fd5b50620003f4620005a636600462009442565b62001e70565b348015620005b957600080fd5b50620003f4620005cb36600462009442565b62002055565b348015620005de57600080fd5b5062000605620005f036600462009442565b60016020526000908152604090205460ff1681565b60405190151581526020016200044c565b3480156200062357600080fd5b50620003f46200063536600462009442565b62002232565b3480156200064857600080fd5b5062000652600881565b60405160ff90911681526020016200044c565b3480156200067257600080fd5b50620003f462000684366004620096e9565b620022ae565b3480156200069757600080fd5b506200043861dead81565b348015620006af57600080fd5b50620003f4620006c136600462009727565b620028cb565b348015620006d457600080fd5b50620003f4620006e636600462009797565b6200369e565b348015620006f957600080fd5b50620007116200070b366004620097b7565b620038a6565b6040516200044c949392919062009820565b620003f462000734366004620098dc565b62003f38565b3480156200074757600080fd5b506200046d6200075936600462009442565b60446020526000908152604090205481565b3480156200077857600080fd5b50620007906200078a36600462009442565b62004582565b6040805182516001600160401b03908116825260208085015182169083015292820151909216908201526060016200044c565b348015620007d057600080fd5b50620004dd620007e236600462009442565b6200462c565b348015620007f557600080fd5b50620003f46200080736600462009442565b62004a45565b3480156200081a57600080fd5b506200046d603d5481565b3480156200083257600080fd5b50620003f462004c17565b3480156200084a57600080fd5b50620003f46200085c366004620094eb565b62004f2e565b3480156200086f57600080fd5b50620003f462004f98565b3480156200088757600080fd5b50620004386200089936600462009442565b6043602052600090815260409020546001600160a01b031681565b348015620008c157600080fd5b506200046d670de0b6b3a764000081565b348015620008df57600080fd5b506200046d620008f1366004620096e9565b62005030565b620003f462000908366004620099b4565b620050e9565b3480156200091b57600080fd5b50620009336200092d36600462009442565b62005773565b6040516200044c9190620099f2565b3480156200094f57600080fd5b50620003f462000961366004620096e9565b62005a60565b3480156200097457600080fd5b50620003f46200098636600462009a6f565b62005acd565b3480156200099957600080fd5b5060005462010000900460ff1662000605565b348015620009b957600080fd5b50620003f4620009cb36600462009b28565b6200696c565b348015620009de57600080fd5b506200046d603c5481565b348015620009f657600080fd5b5062000a0e62000a08366004620097b7565b62006b39565b6040516200044c9392919062009b84565b34801562000a2c57600080fd5b50620003f462000a3e36600462009442565b62006d15565b34801562000a5157600080fd5b506200046d60385481565b34801562000a6957600080fd5b5062000a8162000a7b36600462009442565b62006fd7565b604080519384529115156020840152908201526060016200044c565b34801562000aaa57600080fd5b506200046d620186a081565b34801562000ac357600080fd5b50620003f462000ad536600462009be1565b62007407565b34801562000ae857600080fd5b50620003f462000afa36600462009cca565b6200760b565b34801562000b0d57600080fd5b506200046d603b5481565b34801562000b2557600080fd5b506200046d60495481565b34801562000b3d57600080fd5b506200043862000b4f36600462009442565b62007701565b34801562000b6257600080fd5b506200046d60355481565b34801562000b7a57600080fd5b506200046d603a5481565b34801562000b9257600080fd5b506200046d62000ba436600462009694565b805160208183018101805160468252928201919093012091525481565b34801562000bce57600080fd5b506200046d603e5481565b34801562000be657600080fd5b5062000652601181565b34801562000bfd57600080fd5b506200046d62000c0f366004620096e9565b62007b18565b34801562000c2257600080fd5b50620003f462000c3436600462009a6f565b62007b89565b34801562000c4757600080fd5b506200046d60395481565b34801562000c5f57600080fd5b506200046d604a5481565b600054630100000090046001600160a01b0316331462000c9d576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000cc757604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000d679062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000d959062009d30565b801562000de65780601f1062000dba5761010080835404028352916020019162000de6565b820191906000526020600020905b81548152906001019060200180831162000dc857829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000e119062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3f9062009d30565b801562000e905780601f1062000e645761010080835404028352916020019162000e90565b820191906000526020600020905b81548152906001019060200180831162000e7257829003601f168201915b5050505050815260200160018201805462000eab9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000ed99062009d30565b801562000f2a5780601f1062000efe5761010080835404028352916020019162000f2a565b820191906000526020600020905b81548152906001019060200180831162000f0c57829003601f168201915b5050505050815260200160028201805462000f459062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462000f739062009d30565b801562000fc45780601f1062000f985761010080835404028352916020019162000fc4565b820191906000526020600020905b81548152906001019060200180831162000fa657829003601f168201915b5050505050815260200160038201805462000fdf9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200100d9062009d30565b80156200105e5780601f1062001032576101008083540402835291602001916200105e565b820191906000526020600020905b8154815290600101906020018083116200104057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620010ea575050509190925250509051949350505050565b33611000146200113d57604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b03808216600090815260436020908152604080832054841680845260418352818420825161016081018452815487168152600182015487169481019490945260028101549095169183019190915260038401546060830152600484018054919491608084019190620011b69062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620011e49062009d30565b8015620012355780601f10620012095761010080835404028352916020019162001235565b820191906000526020600020905b8154815290600101906020018083116200121757829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620012609062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200128e9062009d30565b8015620012df5780601f10620012b357610100808354040283529160200191620012df565b820191906000526020600020905b815481529060010190602001808311620012c157829003601f168201915b50505050508152602001600182018054620012fa9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620013289062009d30565b8015620013795780601f106200134d5761010080835404028352916020019162001379565b820191906000526020600020905b8154815290600101906020018083116200135b57829003601f168201915b50505050508152602001600282018054620013949062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620013c29062009d30565b8015620014135780601f10620013e75761010080835404028352916020019162001413565b820191906000526020600020905b815481529060010190602001808311620013f557829003601f168201915b505050505081526020016003820180546200142e9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200145c9062009d30565b8015620014ad5780601f106200148157610100808354040283529160200191620014ad565b820191906000526020600020905b8154815290600101906020018083116200148f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162001539575050509190925250505060408101519091506001600160a01b031615806200157657508060e001515b156200163357604051611002903490600081818185875af1925050503d8060008114620015c0576040519150601f19603f3d011682016040523d82523d6000602084013e620015c5565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016269060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200168a57600080fd5b505af11580156200169f573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620016e091815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017159190869060040162009d66565b600060405180830381600087803b1580156200173057600080fd5b505af115801562001745573d6000803e3d6000fd5b5050505050505b50565b33611001146200177757604051630f22c43960e41b8152611001600482015260240162001134565b60005462010000900460ff1615620017a257604051631785c68160e01b815260040160405180910390fd5b600060458383604051620017b892919062009d80565b908152604051908190036020019020546001600160a01b03169050620017e0603f8262007ddd565b620017fe5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062001826620151804262009da6565b604a546000828152604b6020526040902054919250116200185a5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b602052604081208054600192906200187b90849062009dc9565b909155505060405160469062001895908790879062009d80565b908152602001604051809103902054600014158015620018e65750426201518060468787604051620018c992919062009d80565b908152602001604051809103902054620018e4919062009dc9565b105b156200190557604051631898eb6b60e01b815260040160405180910390fd5b6000806200191585600262007e00565b91509150816200193857604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af11580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062009ddf565b9050620019bf858362007e8a565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb283836002604051620019ff9392919062009e0f565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001a3d916001600160a01b0316908a9060040162009d66565b600060405180830381600087803b15801562001a5857600080fd5b505af115801562001a6d573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001aa557604051630f22c43960e41b8152612000600482015260240162001134565b60005462010000900460ff161562001ad057604051631785c68160e01b815260040160405180910390fd5b6034805460ff19166001179055604080516020601f8501819004810282018101909252838152600091829162001b219187908790819084018382808284376000920191909152506200805192505050565b915091508062001b445760405163035ede3560e21b815260040160405180910390fd5b816060015160000362001b6a575050604080516000815260208101909152905062001ddd565b606082015160405163e04c83a760e01b81526000916110049163e04c83a79162001b9a9160040190815260200190565b6020604051808303816000875af115801562001bba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001be0919062009e3e565b90508062001c875782602001516001600160a01b031683600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a8560600151600160405162001c3c92919062009e5e565b60405180910390a385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092965062001ddd95505050505050565b600062001c9484620081b4565b9050600081600481111562001cad5762001cad62009df9565b0362001ccf575050604080516000815260208101909152925062001ddd915050565b6040516000906110049047908381818185875af1925050503d806000811462001d15576040519150601f19603f3d011682016040523d82523d6000602084013e62001d1a565b606091505b505090508062001d3d576040516312171d8360e31b815260040160405180910390fd5b84602001516001600160a01b031685600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a87606001518560405162001d9092919062009e5e565b60405180910390a387878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092985062001ddd975050505050505050565b6034805460ff191690559392505050565b600054630100000090046001600160a01b0316331462001e21576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001e9b57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001ecd5760405163b1d02c3d60e01b815260040160405180910390fd5b8062001edb603f8262007ddd565b62001ef95760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001f3757604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001f87573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001fad919062009ddf565b101562001fcd576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001ff35760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff1916905560498054600191906000906200201790849062009e85565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff16156200208057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620020b25760405163b1d02c3d60e01b815260040160405180910390fd5b33620020c0603f8262007ddd565b620020de5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166200210657604051636520611b60e11b815260040160405180910390fd5b6001600160a01b03828116600090815260436020526040902054161515806200214757506001600160a01b03821660009081526047602052604090205460ff165b156200216657604051631e6f587560e11b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200218c90620151809062009dc9565b1115620021ac57604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b600054630100000090046001600160a01b0316331462002265576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff1615620022d957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200230b5760405163b1d02c3d60e01b815260040160405180910390fd5b8162002319603f8262007ddd565b620023375760405163056e881160e01b815260040160405180910390fd5b816000036200235957604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b0380841660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620023c19062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620023ef9062009d30565b8015620024405780601f10620024145761010080835404028352916020019162002440565b820191906000526020600020905b8154815290600101906020018083116200242257829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200246b9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620024999062009d30565b8015620024ea5780601f10620024be57610100808354040283529160200191620024ea565b820191906000526020600020905b815481529060010190602001808311620024cc57829003601f168201915b50505050508152602001600182018054620025059062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620025339062009d30565b8015620025845780601f10620025585761010080835404028352916020019162002584565b820191906000526020600020905b8154815290600101906020018083116200256657829003601f168201915b505050505081526020016002820180546200259f9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620025cd9062009d30565b80156200261e5780601f10620025f2576101008083540402835291602001916200261e565b820191906000526020600020905b8154815290600101906020018083116200260057829003601f168201915b50505050508152602001600382018054620026399062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620026679062009d30565b8015620026b85780601f106200268c57610100808354040283529160200191620026b8565b820191906000526020600020905b8154815290600101906020018083116200269a57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002744575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af1158015620027be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027e4919062009ddf565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b40829802878460405162002835929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b031603620028625762002862866200880a565b6040808301519051633041949b60e01b815261200591633041949b916200288f9190879060040162009d66565b600060405180830381600087803b158015620028aa57600080fd5b505af1158015620028bf573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff1615620028f657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620029285760405163b1d02c3d60e01b815260040160405180910390fd5b8362002936603f8262007ddd565b620029545760405163056e881160e01b815260040160405180910390fd5b8362002962603f8262007ddd565b620029805760405163056e881160e01b815260040160405180910390fd5b6034805460ff191660011790556000849003620029b057604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b031603620029e35760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002a4b9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002a799062009d30565b801562002aca5780601f1062002a9e5761010080835404028352916020019162002aca565b820191906000526020600020905b81548152906001019060200180831162002aac57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002af59062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002b239062009d30565b801562002b745780601f1062002b485761010080835404028352916020019162002b74565b820191906000526020600020905b81548152906001019060200180831162002b5657829003601f168201915b5050505050815260200160018201805462002b8f9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002bbd9062009d30565b801562002c0e5780601f1062002be25761010080835404028352916020019162002c0e565b820191906000526020600020905b81548152906001019060200180831162002bf057829003601f168201915b5050505050815260200160028201805462002c299062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002c579062009d30565b801562002ca85780601f1062002c7c5761010080835404028352916020019162002ca8565b820191906000526020600020905b81548152906001019060200180831162002c8a57829003601f168201915b5050505050815260200160038201805462002cc39062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002cf19062009d30565b801562002d425780601f1062002d165761010080835404028352916020019162002d42565b820191906000526020600020905b81548152906001019060200180831162002d2457829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002dce57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002e599062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002e879062009d30565b801562002ed85780601f1062002eac5761010080835404028352916020019162002ed8565b820191906000526020600020905b81548152906001019060200180831162002eba57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002f039062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002f319062009d30565b801562002f825780601f1062002f565761010080835404028352916020019162002f82565b820191906000526020600020905b81548152906001019060200180831162002f6457829003601f168201915b5050505050815260200160018201805462002f9d9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462002fcb9062009d30565b80156200301c5780601f1062002ff0576101008083540402835291602001916200301c565b820191906000526020600020905b81548152906001019060200180831162002ffe57829003601f168201915b50505050508152602001600282018054620030379062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620030659062009d30565b8015620030b65780601f106200308a57610100808354040283529160200191620030b6565b820191906000526020600020905b8154815290600101906020018083116200309857829003601f168201915b50505050508152602001600382018054620030d19062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620030ff9062009d30565b8015620031505780601f10620031245761010080835404028352916020019162003150565b820191906000526020600020905b8154815290600101906020018083116200313257829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620031dc5750505050508152505090508060e0015180156200321f5750876001600160a01b0316836001600160a01b031614155b156200323e57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af115801562003295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032bb919062009ddf565b9050603754811015620032e15760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b03161480156200337657506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa1580156200334e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003374919062009ddf565b105b1562003395576040516317b204bf60e11b815260040160405180910390fd5b6000620186a0603a5483620033ab919062009e9b565b620033b7919062009da6565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d80600081146200340c576040519150601f19603f3d011682016040523d82523d6000602084013e62003411565b606091505b505090508062003434576040516312171d8360e31b815260040160405180910390fd5b62003440828462009e85565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af115801562003496573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620034bd919062009ddf565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e858960405162003522939291909283526020830191909152604082015260600190565b60405180910390a460408051600280825260608201835260009260208301908036833701905050905086604001518160008151811062003566576200356662009eb5565b60200260200101906001600160a01b031690816001600160a01b031681525050856040015181600181518110620035a157620035a162009eb5565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620035e29084908c9060040162009ecb565b600060405180830381600087803b158015620035fd57600080fd5b505af115801562003612573d6000803e3d6000fd5b505050508a1562003684576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200364f92919062009d66565b600060405180830381600087803b1580156200366a57600080fd5b505af11580156200367f573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff1615620036c957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620036fb5760405163b1d02c3d60e01b815260040160405180910390fd5b3362003709603f8262007ddd565b620037275760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200374d90620151809062009dc9565b11156200376d57604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620037a75760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b039081169086161015620037e5576009820154620037df9086906001600160401b031662009ef7565b620037ff565b6009820154620037ff906001600160401b03168662009ef7565b60098301546001600160401b039182169250600160801b9004168111156200383a5760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b60608060606000620038b9603f62008930565b90508086101562003f2f578415620038d25784620038d4565b805b9450600085620038e5888462009e85565b11620038fd57620038f7878362009e85565b620038ff565b855b9050806001600160401b038111156200391c576200391c620095b3565b60405190808252806020026020018201604052801562003946578160200160208202803683370190505b509450806001600160401b03811115620039645762003964620095b3565b6040519080825280602002602001820160405280156200398e578160200160208202803683370190505b509350806001600160401b03811115620039ac57620039ac620095b3565b604051908082528060200260200182016040528015620039e157816020015b6060815260200190600190039081620039cb5790505b50925060005b8181101562003f2c57600062003a0b62003a02838b62009dc9565b603f906200893b565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003a789062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003aa69062009d30565b801562003af75780601f1062003acb5761010080835404028352916020019162003af7565b820191906000526020600020905b81548152906001019060200180831162003ad957829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003b229062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003b509062009d30565b801562003ba15780601f1062003b755761010080835404028352916020019162003ba1565b820191906000526020600020905b81548152906001019060200180831162003b8357829003601f168201915b5050505050815260200160018201805462003bbc9062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003bea9062009d30565b801562003c3b5780601f1062003c0f5761010080835404028352916020019162003c3b565b820191906000526020600020905b81548152906001019060200180831162003c1d57829003601f168201915b5050505050815260200160028201805462003c569062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003c849062009d30565b801562003cd55780601f1062003ca95761010080835404028352916020019162003cd5565b820191906000526020600020905b81548152906001019060200180831162003cb757829003601f168201915b5050505050815260200160038201805462003cf09062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462003d1e9062009d30565b801562003d6f5780601f1062003d435761010080835404028352916020019162003d6f565b820191906000526020600020905b81548152906001019060200180831162003d5157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162003dfb575050505050815250509050806000015188848151811062003e345762003e3462009eb5565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003ecd5780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003ea1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003ec7919062009ddf565b62003ed0565b60005b87848151811062003ee55762003ee562009eb5565b602002602001018181525050806080015186848151811062003f0b5762003f0b62009eb5565b602002602001018190525050508062003f249062009f1a565b9050620039e7565b50505b92959194509250565b60005462010000900460ff161562003f6357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562003f955760405163b1d02c3d60e01b815260040160405180910390fd5b3362003fa3603f8262007ddd565b1562003fc257604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b03888116600090815260436020526040902054161515806200400357506001600160a01b03881660009081526047602052604090205460ff165b156200402257604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b0316604588886040516200404192919062009d80565b908152604051908190036020019020546001600160a01b03161415806200408b5750604887876040516200407792919062009d80565b9081526040519081900360200190205460ff165b15620040aa576040516311fdb94760e01b815260040160405180910390fd5b6000620040b8838062009f36565b604051602001620040cb92919062009d80565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff1615620041155760405163c0bf414360e01b815260040160405180910390fd5b60006200412b670de0b6b3a76400003462009e85565b905060365481101562004151576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a166200417957604051636520611b60e11b815260040160405180910390fd5b6113886200418e604087016020880162009797565b6001600160401b03161180620041d45750620041b1604086016020870162009797565b6001600160401b0316620041c9602087018762009797565b6001600160401b0316115b80620042135750620041ed604086016020870162009797565b6001600160401b031662004208606087016040880162009797565b6001600160401b0316115b15620042325760405163dc81db8560e01b815260040160405180910390fd5b6200427d62004242858062009f36565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200894992505050565b6200429b57604051635dba5ad760e01b815260040160405180910390fd5b620042aa838a8a8a8a62008aeb565b620042c857604051631647e3cb60e11b815260040160405180910390fd5b60006200431684620042db878062009f36565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062008c1b92505050565b905062004325603f8562008d1c565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620043a58b8d8362009fde565b508560058201620043b782826200a0a6565b5087905060098201620043cb82826200a1df565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004419908e908e9062009d80565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e6040516200449c9291906200a2af565b60405180910390a460408051848152602081018590526001600160a01b0387169182916000805160206200b5b6833981519152910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816916000805160206200b5b6833981519152910160405180910390a3604051633041949b60e01b815261200590633041949b9062004540908590899060040162009d66565b600060405180830381600087803b1580156200455b57600080fd5b505af115801562004570573d6000803e3d6000fd5b50505050505050505050505050505050565b604080516060810182526000808252602082018190529181019190915281620045ad603f8262007ddd565b620045cb5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915291505b50919050565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082810191909152600484018054919491608084019190620046999062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620046c79062009d30565b8015620047185780601f10620046ec5761010080835404028352916020019162004718565b820191906000526020600020905b815481529060010190602001808311620046fa57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620047439062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620047719062009d30565b8015620047c25780601f106200479657610100808354040283529160200191620047c2565b820191906000526020600020905b815481529060010190602001808311620047a457829003601f168201915b50505050508152602001600182018054620047dd9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200480b9062009d30565b80156200485c5780601f1062004830576101008083540402835291602001916200485c565b820191906000526020600020905b8154815290600101906020018083116200483e57829003601f168201915b50505050508152602001600282018054620048779062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620048a59062009d30565b8015620048f65780601f10620048ca57610100808354040283529160200191620048f6565b820191906000526020600020905b815481529060010190602001808311620048d857829003601f168201915b50505050508152602001600382018054620049119062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200493f9062009d30565b8015620049905780601f10620049645761010080835404028352916020019162004990565b820191906000526020600020905b8154815290600101906020018083116200497257829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162004a1c5750505091909252505050608001519392505050565b336110011462004a6d57604051630f22c43960e41b8152611001600482015260240162001134565b6001600160a01b038082166000908152604360205260409020541662004a95603f8262007ddd565b62004ab35760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004b16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004b3c919062009ddf565b90506000603d544262004b50919062009dc9565b905062004b5e838262007e8a565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004b9e9392919062009e0f565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004bdc916001600160a01b031690889060040162009d66565b600060405180830381600087803b15801562004bf757600080fd5b505af115801562004c0c573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004c385750600054600160ff909116105b8062004c545750303b15801562004c54575060005460ff166001145b62004cb95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162001134565b6000805460ff19166001179055801562004cdd576000805461ff0019166101001790555b33411462004cfe5760405163022d8c9560e31b815260040160405180910390fd5b3a1562004d1e576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d60385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562278d00603e55604a5560408051610760810190915261074080825260609182916200b5d6602083013980602001905181019062004daf91906200a2eb565b915060405180611160016040528061114081526020016200bd16611140913980602001905181019062004de391906200a38f565b905060005b825181101562004e525760016047600085848151811062004e0d5762004e0d62009eb5565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562004e4a8162009f1a565b905062004de8565b5060005b815181101562004ec3576001604883838151811062004e795762004e7962009eb5565b602002602001015160405162004e9091906200a48c565b908152604051908190036020019020805491151560ff1990921691909117905562004ebb8162009f1a565b905062004e56565b5062004ee37308e68ec70fa3b629784fdb28887e206ce8561e0862008d33565b505080156200174c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b336120001462004f5657604051630f22c43960e41b8152612000600482015260240162001134565b7faa5ba621c8b3d7d05bb9e51a7506108251d4d5dbe542ca66fc7bb52aacb02b6583838360405162004f8b939291906200a4aa565b60405180910390a1505050565b600054630100000090046001600160a01b0316331462004fcb576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff161562004ff657604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b60006200503f603f8462007ddd565b6200505d5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa158015620050ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620050e0919062009ddf565b90505b92915050565b60005462010000900460ff16156200511457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620051465760405163b1d02c3d60e01b815260040160405180910390fd5b8162005154603f8262007ddd565b620051725760405163056e881160e01b815260040160405180910390fd5b6037543490811015620051985760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620052009062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200522e9062009d30565b80156200527f5780601f1062005253576101008083540402835291602001916200527f565b820191906000526020600020905b8154815290600101906020018083116200526157829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620052aa9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620052d89062009d30565b8015620053295780601f10620052fd5761010080835404028352916020019162005329565b820191906000526020600020905b8154815290600101906020018083116200530b57829003601f168201915b50505050508152602001600182018054620053449062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620053729062009d30565b8015620053c35780601f106200539757610100808354040283529160200191620053c3565b820191906000526020600020905b815481529060010190602001808311620053a557829003601f168201915b50505050508152602001600282018054620053de9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200540c9062009d30565b80156200545d5780601f1062005431576101008083540402835291602001916200545d565b820191906000526020600020905b8154815290600101906020018083116200543f57829003601f168201915b50505050508152602001600382018054620054789062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620054a69062009d30565b8015620054f75780601f10620054cb57610100808354040283529160200191620054f7565b820191906000526020600020905b815481529060010190602001808311620054d957829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620055835750505050508152505090508060e001518015620055c65750856001600160a01b0316826001600160a01b031614155b15620055e557604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562005636573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200565d919062009ddf565b9050826001600160a01b0316876001600160a01b03166000805160206200b5b683398151915283876040516200569d929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b91620056d29190879060040162009d66565b600060405180830381600087803b158015620056ed57600080fd5b505af115801562005702573d6000803e3d6000fd5b50505050851562001745576040516372f6ad8f60e11b81526120059063e5ed5b1e90620057369086908b9060040162009d66565b600060405180830381600087803b1580156200575157600080fd5b505af115801562005766573d6000803e3d6000fd5b5050505050505050505050565b6200579f6040518060800160405280606081526020016060815260200160608152602001606081525090565b81620057ad603f8262007ddd565b620057cb5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602052604090819020815160808101909252600501805482908290620058029062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620058309062009d30565b8015620058815780601f10620058555761010080835404028352916020019162005881565b820191906000526020600020905b8154815290600101906020018083116200586357829003601f168201915b505050505081526020016001820180546200589c9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620058ca9062009d30565b80156200591b5780601f10620058ef576101008083540402835291602001916200591b565b820191906000526020600020905b815481529060010190602001808311620058fd57829003601f168201915b50505050508152602001600282018054620059369062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620059649062009d30565b8015620059b55780601f106200598957610100808354040283529160200191620059b5565b820191906000526020600020905b8154815290600101906020018083116200599757829003601f168201915b50505050508152602001600382018054620059d09062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620059fe9062009d30565b801562005a4f5780601f1062005a235761010080835404028352916020019162005a4f565b820191906000526020600020905b81548152906001019060200180831162005a3157829003601f168201915b505050505081525050915050919050565b60005462010000900460ff161562005a8b57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005abd5760405163b1d02c3d60e01b815260040160405180910390fd5b62005ac9828262008dcc565b5050565b336110071462005af557604051630f22c43960e41b8152611007600482015260240162001134565b62005b626040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005c1d576020811462005b945783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005bd791858580838501838280828437600092019190915250929392505062008f359050565b90506108fc81108062005beb575061271081115b1562005c145784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60355562006927565b62005c8e6040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005d58576020811462005cc05783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005d0391858580838501838280828437600092019190915250929392505062008f359050565b9050683635c9adc5dea0000081108062005d26575069152d02c7e14af680000081115b1562005d4f5784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60365562006927565b62005dcb604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005e92576020811462005dfd5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005e4091858580838501838280828437600092019190915250929392505062008f359050565b905067016345785d8a000081108062005e605750678ac7230489e8000081115b1562005e895784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60375562006927565b62005f03604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b1562005fbb576020811462005f355783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f840181900481028201810190925282815260009162005f7891858580838501838280828437600092019190915250929392505062008f359050565b905080158062005f8957506101f481115b1562005fb25784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60385562006927565b620060246040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620060e15760208114620060565783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200609991858580838501838280828437600092019190915250929392505062008f359050565b90506203f480811080620060af575062278d0081115b15620060d85784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b60395562006927565b6200614f60405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620061fc5760208114620061815783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f8401819004810282018101909252828152600091620061c491858580838501838280828437600092019190915250929392505062008f359050565b90506064811115620061f35784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603a5562006927565b6200626c60405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b156200632d57602081146200629e5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f8401819004810282018101909252828152600091620062e191858580838501838280828437600092019190915250929392505062008f359050565b9050674563918244f40000811080620062fb5750603c5481115b15620063245784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603b5562006927565b6200639b6040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b156200645e5760208114620063cd5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200641091858580838501838280828437600092019190915250929392505062008f359050565b905068056bc75e2d631000008110806200642c5750603b548111155b15620064555784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603c5562006927565b620064cb6040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620065885760208114620064fd5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200654091858580838501838280828437600092019190915250929392505062008f359050565b90506202a300811080620065565750603e548110155b156200657f5784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603d5562006927565b620065f36040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620066b05760208114620066255783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200666891858580838501838280828437600092019190915250929392505062008f359050565b9050620d2f008110806200667e5750603d548111155b15620066a75784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b603e5562006927565b6200672a6040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620067d657602081146200675c5783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b604080516020601f84018190048102820181019092528281526000916200679f91858580838501838280828437600092019190915250929392505062008f359050565b905080600003620067cd5784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b604a5562006927565b620068446040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed89050565b15620069045760148114620068765783838383604051630a5a604160e01b81526004016200113494939291906200a4c9565b6000620068be601484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008f359050565b90506001600160a01b038116620068f25784848484604051630a5a604160e01b81526004016200113494939291906200a4c9565b620068fd8162008f3a565b5062006927565b838383836040516325ee20d560e21b81526004016200113494939291906200a4c9565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516200695e94939291906200a4c9565b60405180910390a150505050565b60005462010000900460ff16156200699757604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620069c95760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b03811115620069e757620069e7620095b3565b60405190808252806020026020018201604052801562006a11578160200160208202803683370190505b5090506000805b8381101562006b0f5762006a5a87878381811062006a3a5762006a3a62009eb5565b905060200201602081019062006a51919062009442565b603f9062007ddd565b62006a785760405163056e881160e01b815260040160405180910390fd5b6041600088888481811062006a915762006a9162009eb5565b905060200201602081019062006aa8919062009442565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006ae45762006ae462009eb5565b6001600160a01b039092166020928302919091019091015262006b078162009f1a565b905062006a18565b50604051634484077560e01b8152612005906344840775906200288f908590889060040162009ecb565b606080600062006b4a603f62008930565b90508085101562006d0e57831562006b63578362006b65565b805b935060008462006b76878462009e85565b1162006b8e5762006b88868362009e85565b62006b90565b845b9050806001600160401b0381111562006bad5762006bad620095b3565b60405190808252806020026020018201604052801562006bd7578160200160208202803683370190505b509350806001600160401b0381111562006bf55762006bf5620095b3565b60405190808252806020026020018201604052801562006c1f578160200160208202803683370190505b50925060005b8181101562006d0b5762006c3e62003a02828962009dc9565b85828151811062006c535762006c5362009eb5565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006c8c5762006c8c62009eb5565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006ce05762006ce062009eb5565b6001600160a01b039092166020928302919091019091015262006d038162009f1a565b905062006c25565b50505b9250925092565b336110011462006d3d57604051630f22c43960e41b8152611001600482015260240162001134565b60005462010000900460ff161562006d6857604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006d90603f8262007ddd565b62006dae5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006dd6620151804262009da6565b604a546000828152604b60205260409020549192501162006e0a5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006e2b90849062009dc9565b90915550506001600160a01b0384166000908152604460205260409020541580159062006e8057506001600160a01b038416600090815260446020526040902054429062006e7e90620151809062009dc9565b105b1562006e9f576040516330abb81d60e21b815260040160405180910390fd5b60008062006eaf85600062007e00565b915091508162006ed257604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562006f25573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062006f4b919062009ddf565b905062006f59858362007e8a565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600060405162006f999392919062009e0f565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162005736916001600160a01b0316908a9060040162009d66565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849384938493909291608084019190620070489062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620070769062009d30565b8015620070c75780601f106200709b57610100808354040283529160200191620070c7565b820191906000526020600020905b815481529060010190602001808311620070a957829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620070f29062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620071209062009d30565b8015620071715780601f10620071455761010080835404028352916020019162007171565b820191906000526020600020905b8154815290600101906020018083116200715357829003601f168201915b505050505081526020016001820180546200718c9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620071ba9062009d30565b80156200720b5780601f10620071df576101008083540402835291602001916200720b565b820191906000526020600020905b815481529060010190602001808311620071ed57829003601f168201915b50505050508152602001600282018054620072269062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620072549062009d30565b8015620072a55780601f106200727957610100808354040283529160200191620072a5565b820191906000526020600020905b8154815290600101906020018083116200728757829003601f168201915b50505050508152602001600382018054620072c09062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620072ee9062009d30565b80156200733f5780601f1062007313576101008083540402835291602001916200733f565b820191906000526020600020905b8154815290600101906020018083116200732157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620073cb5750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200743257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620074645760405163b1d02c3d60e01b815260040160405180910390fd5b3362007472603f8262007ddd565b620074905760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c8101544290620074b690620151809062009dc9565b1115620074d657604051631f92cdbd60e11b815260040160405180910390fd5b600581018054620074e79062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620075159062009d30565b8015620075665780601f106200753a5761010080835404028352916020019162007566565b820191906000526020600020905b8154815290600101906020018083116200754857829003601f168201915b50505082875250859160058401915081906200758390826200a4f4565b50602082015160018201906200759a90826200a4f4565b5060408201516002820190620075b190826200a4f4565b5060608201516003820190620075c890826200a4f4565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff16156200763657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620076685760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007689576040516341abc80160e01b815260040160405180910390fd5b60005b83811015620076fa57620076e7858583818110620076ae57620076ae62009eb5565b9050602002016020810190620076c5919062009442565b848484818110620076da57620076da62009eb5565b9050602002013562008dcc565b620076f28162009f1a565b90506200768c565b5050505050565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492938493909160808401916200776c9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200779a9062009d30565b8015620077eb5780601f10620077bf57610100808354040283529160200191620077eb565b820191906000526020600020905b815481529060010190602001808311620077cd57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620078169062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620078449062009d30565b8015620078955780601f10620078695761010080835404028352916020019162007895565b820191906000526020600020905b8154815290600101906020018083116200787757829003601f168201915b50505050508152602001600182018054620078b09062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620078de9062009d30565b80156200792f5780601f1062007903576101008083540402835291602001916200792f565b820191906000526020600020905b8154815290600101906020018083116200791157829003601f168201915b505050505081526020016002820180546200794a9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620079789062009d30565b8015620079c95780601f106200799d57610100808354040283529160200191620079c9565b820191906000526020600020905b815481529060010190602001808311620079ab57829003601f168201915b50505050508152602001600382018054620079e49062009d30565b80601f016020809104026020016040519081016040528092919081815260200182805462007a129062009d30565b801562007a635780601f1062007a375761010080835404028352916020019162007a63565b820191906000526020600020905b81548152906001019060200180831162007a4557829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162007aef5750505091909252505050604001519392505050565b600062007b27603f8462007ddd565b62007b455760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd906024016200509c565b60005462010000900460ff161562007bb457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007be65760405163b1d02c3d60e01b815260040160405180910390fd5b3362007bf4603f8262007ddd565b62007c125760405163056e881160e01b815260040160405180910390fd5b3362007c22818787878762008aeb565b62007c4057604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007c5f92919062009d80565b908152604051908190036020019020546001600160a01b031614158062007ca957506048868660405162007c9592919062009d80565b9081526040519081900360200190205460ff165b1562007cc8576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007cf790620151809062009dc9565b111562007d1757604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007d2d91906200a5bc565b908152604051908190036020019020556004810162007d4e87898362009fde565b5042600c820155604051829060459062007d6c908a908a9062009d80565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007dcc908a908a906200a2af565b60405180910390a250505050505050565b6001600160a01b03811660009081526001830160205260408120541515620050e0565b6000806000848460405160200162007e1a9291906200a63a565b60408051601f1981840301815291815281516020928301206000818152604c9093529120549091504281111562007e5a5760008093509350505062007e83565b603e5462007e69904262009dc9565b6000928352604c6020526040909220829055506001925090505b9250929050565b8154604051631507fdb760e11b81526001600160a01b03909116600482015261100090632a0ffb6e90602401600060405180830381600087803b15801562007ed157600080fd5b505af115801562007ee6573d6000803e3d6000fd5b505050506000600162007efa603f62008930565b62007f06919062009e85565b604954108015915062007fc45760405163d31f968d60e01b81526110006004820152600860248201526120009063d31f968d90604401602060405180830381865afa15801562007f5a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062007f80919062009e3e565b62007fc45760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b015482111562007fd957600b83018290555b600a83015460ff166200804c57600a8301805460ff19166001908117909155604980546000906200800c90849062009dc9565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845283820183905283860183905283018290528451808601865282815281018290528451808601909552855185528581019085015291928290620080c39062008fa6565b90506000805b620080d48362009019565b15620081a757806000036200810957620080f8620080f2846200903f565b620090a3565b6001600160a01b0316845262008194565b80600103620081355762008121620080f2846200903f565b6001600160a01b0316602085015262008194565b8060020362008161576200814d620080f2846200903f565b6001600160a01b0316604085015262008194565b806003036200818e576200817f62008179846200903f565b620090bb565b60608501526001915062008194565b620081a7565b6200819f8162009f1a565b9050620080c9565b5091959194509092505050565b6020808201516001600160a01b031660009081526001909152604081205460ff1680620081ec575060208201516001600160a01b0316155b15620081fa57506004919050565b81516200820a90603f9062007ddd565b6200821757506002919050565b81516001600160a01b03908116600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492939192608084019190620082839062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620082b19062009d30565b8015620083025780601f10620082d65761010080835404028352916020019162008302565b820191906000526020600020905b815481529060010190602001808311620082e457829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200832d9062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200835b9062009d30565b8015620083ac5780601f106200838057610100808354040283529160200191620083ac565b820191906000526020600020905b8154815290600101906020018083116200838e57829003601f168201915b50505050508152602001600182018054620083c79062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620083f59062009d30565b8015620084465780601f106200841a5761010080835404028352916020019162008446565b820191906000526020600020905b8154815290600101906020018083116200842857829003601f168201915b50505050508152602001600282018054620084619062009d30565b80601f01602080910402602001604051908101604052809291908181526020018280546200848f9062009d30565b8015620084e05780601f10620084b457610100808354040283529160200191620084e0565b820191906000526020600020905b815481529060010190602001808311620084c257829003601f168201915b50505050508152602001600382018054620084fb9062009d30565b80601f0160208091040260200160405190810160405280929190818152602001828054620085299062009d30565b80156200857a5780601f106200854e576101008083540402835291602001916200857a565b820191906000526020600020905b8154815290600101906020018083116200855c57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620086065750505050508152505090508060e00151801562008651575082600001516001600160a01b031683602001516001600160a01b031614155b15620086605750600392915050565b6040808201516060850151602086015192516317066a5760e21b81526001600160a01b03938416600482015260009390921691635c19a95c919060240160206040518083038185885af1158015620086bc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620086e3919062009ddf565b905083602001516001600160a01b031684600001516001600160a01b03166000805160206200b5b68339815191528387606001516040516200872f929190918252602082015260400190565b60405180910390a383602001516001600160a01b031684600001516001600160a01b03167f607b17598da6bdca05650a2fc08bd2bc8e38c3236806a0fa8e0daabc1d6cb1d883876060015160405162008792929190918252602082015260400190565b60405180910390a360408083015160208601519151633041949b60e01b815261200592633041949b92620087cc9290919060040162009d66565b600060405180830381600087803b158015620087e757600080fd5b505af1158015620087fc573d6000803e3d6000fd5b506000979650505050505050565b6001600160a01b0381166000908152604160205260409020600a81015460ff161562008834575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa15801562008884573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620088aa919062009ddf565b101562005ac957620088cc81603d5442620088c6919062009dc9565b62007e8a565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200891357600080fd5b505af115801562008928573d6000803e3d6000fd5b505050505050565b6000620050e3825490565b6000620050e0838362009193565b60008082905060038151108062008961575060098151115b15620089705750600092915050565b60418160008151811062008988576200898862009eb5565b016020015160f81c1080620089ba5750605a81600081518110620089b057620089b062009eb5565b016020015160f81c115b15620089c95750600092915050565b60015b815181101562008ae1576030828281518110620089ed57620089ed62009eb5565b016020015160f81c108062008a1e5750603982828151811062008a145762008a1462009eb5565b016020015160f81c115b801562008a6e5750604182828151811062008a3d5762008a3d62009eb5565b016020015160f81c108062008a6e5750605a82828151811062008a645762008a6462009eb5565b016020015160f81c115b801562008abe5750606182828151811062008a8d5762008a8d62009eb5565b016020015160f81c108062008abe5750607a82828151811062008ab45762008ab462009eb5565b016020015160f81c115b1562008ace575060009392505050565b62008ad98162009f1a565b9050620089cc565b5060019392505050565b600060308414158062008aff575060608214155b1562008b0e5750600062008c12565b60008686864660405160200162008b2994939291906200a678565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a60405160200162008b839594939291906200a6a5565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa62008bcd57600080fd5b5060008160008151811062008be65762008be662009eb5565b016020015160f81c90506001811462008c085760009550505050505062008c12565b6001955050505050505b95945050505050565b60008061200361dead60405162008c32906200941e565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f08015801562008c75573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b815260040162008ca99291906200a6dd565b6000604051808303818588803b15801562008cc357600080fd5b505af115801562008cd8573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b6000620050e0836001600160a01b038416620091c0565b600054610100900460ff1662008da05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001134565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008dda603f8262007ddd565b62008df85760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562008e5c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008e82919062009ddf565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd39926838360405162008eca91815260200190565b60405180910390a350505050565b60008160405160200162008eed91906200a48c565b604051602081830303815290604052805190602001208360405160200162008f1691906200a48c565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b604080516080810182526000918101828152606082018390528152602081019190915262008fd48262009212565b62008fde57600080fd5b600062008fef836020015162009245565b836020015162009000919062009dc9565b6040805180820190915293845260208401525090919050565b80518051602082015160009291620090319162009dc9565b836020015110915050919050565b60408051808201909152600080825260208201526200905e8262009019565b6200906857600080fd5b602082015160006200907a82620092d4565b905062009088818362009dc9565b60209485015260408051808201909152908152928301525090565b8051600090601514620090b557600080fd5b620050e3825b805160009015801590620090d157508151602110155b620090db57600080fd5b6000620090ec836020015162009245565b90508083600001511015620091445760405162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015260640162001134565b82516000906200915690839062009e85565b90506000808386602001516200916d919062009dc9565b90508051915060208310156200918a57826020036101000a820491505b50949350505050565b6000826000018281548110620091ad57620091ad62009eb5565b9060005260206000200154905092915050565b60008181526001830160205260408120546200920957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620050e3565b506000620050e3565b805160009081036200922657506000919050565b6020820151805160001a9060c082101562008ae1575060009392505050565b8051600090811a60808110156200925f5750600092915050565b60b88110806200927c575060c081108015906200927c575060f881105b156200928b5750600192915050565b60c0811015620092c657620092a3600160b86200a703565b620092b29060ff168262009e85565b620092bf90600162009dc9565b9392505050565b620092a3600160f86200a703565b80516000908190811a6080811015620092f1576001915062009417565b60b88110156200931d576200930860808262009e85565b6200931590600162009dc9565b915062009417565b60c08110156200939657600060b78203600186019550806020036101000a8651049150600181018201935050808310156200938f5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001134565b5062009417565b60f8811015620093ad576200930860c08262009e85565b600060f78203600186019550806020036101000a865104915060018101820193505080831015620094155760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001134565b505b5092915050565b610e96806200a72083390190565b6001600160a01b03811681146200174c57600080fd5b6000602082840312156200945557600080fd5b8135620092bf816200942c565b60008083601f8401126200947557600080fd5b5081356001600160401b038111156200948d57600080fd5b60208301915083602082850101111562007e8357600080fd5b60008060208385031215620094ba57600080fd5b82356001600160401b03811115620094d157600080fd5b620094df8582860162009462565b90969095509350505050565b6000806000604084860312156200950157600080fd5b833560ff811681146200951357600080fd5b925060208401356001600160401b038111156200952f57600080fd5b6200953d8682870162009462565b9497909650939450505050565b60005b83811015620095675781810151838201526020016200954d565b50506000910152565b600081518084526200958a8160208601602086016200954a565b601f01601f19169290920160200192915050565b602081526000620050e0602083018462009570565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620095ee57620095ee620095b3565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200961f576200961f620095b3565b604052919050565b60006001600160401b03821115620096435762009643620095b3565b50601f01601f191660200190565b600062009668620096628462009627565b620095f4565b90508281528383830111156200967d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215620096a757600080fd5b81356001600160401b03811115620096be57600080fd5b8201601f81018413620096d057600080fd5b620096e18482356020840162009651565b949350505050565b60008060408385031215620096fd57600080fd5b82356200970a816200942c565b946020939093013593505050565b80151581146200174c57600080fd5b600080600080608085870312156200973e57600080fd5b84356200974b816200942c565b935060208501356200975d816200942c565b9250604085013591506060850135620097768162009718565b939692955090935050565b6001600160401b03811681146200174c57600080fd5b600060208284031215620097aa57600080fd5b8135620092bf8162009781565b60008060408385031215620097cb57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015620098155781516001600160a01b031687529582019590820190600101620097ee565b509495945050505050565b608081526000620098356080830187620097da565b82810360208481019190915286518083528782019282019060005b818110156200986e5784518352938301939183019160010162009850565b5050848103604086015286518082528282019350600581901b8201830183890160005b83811015620098c357601f19858403018752620098b083835162009570565b9686019692509085019060010162009891565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e0811215620098f957600080fd5b883562009906816200942c565b975060208901356001600160401b03808211156200992357600080fd5b620099318c838d0162009462565b909950975060408b01359150808211156200994b57600080fd5b620099598c838d0162009462565b90975095508591506060605f19840112156200997457600080fd5b60608b01945060c08b01359250808311156200998f57600080fd5b505088016080818b031215620099a457600080fd5b8091505092959891949750929550565b60008060408385031215620099c857600080fd5b8235620099d5816200942c565b91506020830135620099e78162009718565b809150509250929050565b60208152600082516080602084015262009a1060a084018262009570565b90506020840151601f198085840301604086015262009a30838362009570565b9250604086015191508085840301606086015262009a4f838362009570565b925060608601519150808584030160808601525062008c12828262009570565b6000806000806040858703121562009a8657600080fd5b84356001600160401b038082111562009a9e57600080fd5b62009aac8883890162009462565b9096509450602087013591508082111562009ac657600080fd5b5062009ad58782880162009462565b95989497509550505050565b60008083601f84011262009af457600080fd5b5081356001600160401b0381111562009b0c57600080fd5b6020830191508360208260051b850101111562007e8357600080fd5b60008060006040848603121562009b3e57600080fd5b83356001600160401b0381111562009b5557600080fd5b62009b638682870162009ae1565b909450925050602084013562009b79816200942c565b809150509250925092565b60608152600062009b996060830186620097da565b828103602084015262009bad8186620097da565b915050826040830152949350505050565b600082601f83011262009bd057600080fd5b620050e08383356020850162009651565b60006020828403121562009bf457600080fd5b81356001600160401b038082111562009c0c57600080fd5b908301906080828603121562009c2157600080fd5b62009c2b620095c9565b82358281111562009c3b57600080fd5b62009c498782860162009bbe565b82525060208301358281111562009c5f57600080fd5b62009c6d8782860162009bbe565b60208301525060408301358281111562009c8657600080fd5b62009c948782860162009bbe565b60408301525060608301358281111562009cad57600080fd5b62009cbb8782860162009bbe565b60608301525095945050505050565b6000806000806040858703121562009ce157600080fd5b84356001600160401b038082111562009cf957600080fd5b62009d078883890162009ae1565b9096509450602087013591508082111562009d2157600080fd5b5062009ad58782880162009ae1565b600181811c9082168062009d4557607f821691505b6020821081036200462657634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b60008262009dc457634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620050e357620050e362009d90565b60006020828403121562009df257600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260208101839052606081016003831062009e305762009e3062009df9565b826040830152949350505050565b60006020828403121562009e5157600080fd5b8151620092bf8162009718565b828152604081016005831062009e785762009e7862009df9565b8260208301529392505050565b81810381811115620050e357620050e362009d90565b8082028115828204841417620050e357620050e362009d90565b634e487b7160e01b600052603260045260246000fd5b60408152600062009ee06040830185620097da565b905060018060a01b03831660208301529392505050565b6001600160401b0382811682821603908082111562009417576200941762009d90565b60006001820162009f2f5762009f2f62009d90565b5060010190565b6000808335601e1984360301811262009f4e57600080fd5b8301803591506001600160401b0382111562009f6957600080fd5b60200191503681900382131562007e8357600080fd5b601f8211156200804c57600081815260208120601f850160051c8101602086101562009fa85750805b601f850160051c820191505b81811015620089285782815560010162009fb4565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562009ff85762009ff8620095b3565b6200a010836200a009835462009d30565b8362009f7f565b6000601f8411600181146200a04357600085156200a02e5750838201355b6200a03a868262009fc9565b845550620076fa565b600083815260209020601f19861690835b828110156200a07657868501358255602094850194600190920191016200a054565b50868210156200a0945760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200a0b2828362009f36565b6001600160401b038111156200a0cc576200a0cc620095b3565b6200a0e4816200a0dd855462009d30565b8562009f7f565b6000601f8211600181146200a11757600083156200a1025750838201355b6200a10e848262009fc9565b8655506200a174565b600085815260209020601f19841690835b828110156200a14a57868501358255602094850194600190920191016200a128565b50848210156200a1685760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506200a187602083018362009f36565b6200a19781836001860162009fde565b50506200a1a8604083018362009f36565b6200a1b881836002860162009fde565b50506200a1c9606083018362009f36565b6200a1d981836003860162009fde565b50505050565b81356200a1ec8162009781565b6001600160401b03811690508154816001600160401b0319821617835560208401356200a2198162009781565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff198316841781178555908501356200a2598162009781565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000620096e16020830184866200a286565b60006001600160401b038211156200a2e1576200a2e1620095b3565b5060051b60200190565b600060208083850312156200a2ff57600080fd5b82516001600160401b038111156200a31657600080fd5b8301601f810185136200a32857600080fd5b80516200a33962009662826200a2c5565b81815260059190911b820183019083810190878311156200a35957600080fd5b928401925b828410156200a3845783516200a374816200942c565b825292840192908401906200a35e565b979650505050505050565b600060208083850312156200a3a357600080fd5b82516001600160401b03808211156200a3bb57600080fd5b818501915085601f8301126200a3d057600080fd5b81516200a3e162009662826200a2c5565b81815260059190911b830184019084810190888311156200a40157600080fd5b8585015b838110156200a47f578051858111156200a41f5760008081fd5b8601603f81018b136200a4325760008081fd5b8781015160406200a447620096628362009627565b8281528d828486010111156200a45d5760008081fd5b6200a46e838c83018487016200954a565b86525050509186019186016200a405565b5098975050505050505050565b600082516200a4a08184602087016200954a565b9190910192915050565b60ff8416815260406020820152600062008c126040830184866200a286565b6040815260006200a4df6040830186886200a286565b82810360208401526200a3848185876200a286565b81516001600160401b038111156200a510576200a510620095b3565b6200a528816200a521845462009d30565b8462009f7f565b602080601f8311600181146200a55c57600084156200a5475750858301515b6200a553858262009fc9565b86555062008928565b600085815260208120601f198616915b828110156200a58d578886015182559484019460019091019084016200a56c565b50858210156200a5ac5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200a5cc8162009d30565b600182811680156200a5e757600181146200a5fd576200a62e565b60ff19841687528215158302870194506200a62e565b8760005260208060002060005b858110156200a6255781548a8201529084019082016200a60a565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200a664576200a66462009df9565b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b600086516200a6b9818460208b016200954a565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b0383168152604060208201819052600090620096e19083018462009570565b60ff8281168282160390811115620050e357620050e362009d9056fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656424d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e0400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000038000000000000000000000000295e26495cef6f69dfa69911d9d8e4f3bbadb89b00000000000000000000000072b61c6014342d914470ec7ac2975be345796c2b0000000000000000000000002465176c461afb316ebc773c61faee85a6515daa0000000000000000000000007ae2f5b9e386cd1b50a4550696d957cb4900f03a000000000000000000000000b4dd66d7c2c7e57f628210187192fb89d4b99dd4000000000000000000000000e9ae3261a475a27bb1028f140bc2a7c843318afd000000000000000000000000ee226379db83cffc681495730c11fdde79ba4c0c0000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa10000000000000000000000008b6c8fd93d6f4cea42bbb345dbc6f0dfdb5bec73000000000000000000000000ef0274e31810c9df02f98fafde0f841f4e66a1cd000000000000000000000000a6f79b60359f141df90a0c745125b131caaffd12000000000000000000000000e2d3a739effcd3a99387d015e260eefac72ebea100000000000000000000000061dd481a114a2e761c554b641742c973867899d3000000000000000000000000cc8e6d00c17eb431350c6c50d8b8f05176b90b11000000000000000000000000ea0a6e3c511bbd10f4519ece37dc24887e11b55d0000000000000000000000002d4c407bbe49438ed859fe965b140dcf1aab71a9000000000000000000000000685b1ded8013785d6623cc18d214320b6bb64759000000000000000000000000d1d6bf74282782b0b3eb1413c901d6ecf02e8e2800000000000000000000000070f657164e5b75689b64b7fd1fa275f334f28e18000000000000000000000000be807dddb074639cd9fa61b47676c064fc50d62c000000000000000000000000b218c5d6af1f979ac42bc68d98a5a0d796c6ab010000000000000000000000009f8ccdafcc39f3c7d6ebf637c9151673cbc36b88000000000000000000000000d93dbfb27e027f5e9e6da52b9e1c413ce35adc11000000000000000000000000ce2fd7544e0b2cc94692d4a704debef7bcb613280000000000000000000000000bac492386862ad3df4b666bc096b0505bb694da000000000000000000000000733fda7714a05960b7536330be4dbb135bef0ed600000000000000000000000035ebb5849518aff370ca25e19e1072cc1a9fabca000000000000000000000000ebe0b55ad7bb78309180cada12427d120fdbcc3a0000000000000000000000006488aa4d1955ee33403f8ccb1d4de5fb97c7ade20000000000000000000000004396e28197653d0c244d95f8c1e57da902a72b4e000000000000000000000000702be18040aa2a9b1af9219941469f1a435854fc00000000000000000000000012d810c13e42811e9907c02e02d1fad46cfa18ba0000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e2000000000000000000000000b8f7166496996a7da21cf1f1b04d9b3e26a3d0770000000000000000000000009bb832254baf4e8b4cc26bd2b52b31389b56e98b0000000000000000000000004430b3230294d12c6ab2aac5c2cd68e80b16b581000000000000000000000000c2be4ec20253b8642161bc3f444f53679c1f3d47000000000000000000000000ee01c3b1283aa067c58eab4709f85e99d46de5fe0000000000000000000000009ef9f4360c606c7ab4db26b016007d3ad0ab86a00000000000000000000000002f7be8361c80a4c1e7e9aaf001d0877f1cfde21800000000000000000000000035e7a025f4da968de7e4d7e4004197917f4070f1000000000000000000000000d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000008c4d90829ce8f72d0163c1d5cf348a862d55063000000000000000000000000068bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d00000000000000000000000082012708dafc9e1b880fd083b32182b869be8e090000000000000000000000006bbad7cf34b5fa511d8e963dbba288b1960e75d600000000000000000000000022b81f8e175ffde54d797fe11eb03f9e3bf75f1d00000000000000000000000078f3adfc719c99674c072166708589033e2d9afe00000000000000000000000029a97c6effb8a411dabc6adeefaa84f5067c8bbe000000000000000000000000aacf6a8119f7e11623b5a43da638e91f669a130f0000000000000000000000002b3a6c089311b478bf629c29d790a7a6db3fc1b9000000000000000000000000fe6e72b223f6d6cf4edc6bff92f30e84b8258249000000000000000000000000a6503279e8b5c7bb5cf4defd3ec8abf3e009a80b0000000000000000000000004ee63a09170c3f2207aeca56134fc2bee1b28e3c000000000000000000000000ac0e15a038eedfc68ba3c35c73fed5be4a07afb500000000000000000000000069c77a677c40c7fbea129d4b171a39b7a8ddabfa00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000030977cf58294f7239d515e15b24cfeb82494056cf691eaf729b165f32c9757c429dba5051155903067e56ebe3698678e9100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003081db0422a5fd08e40db1fc2368d2245e4b18b1d0b85c921aaaafd2e341760e29fc613edd39f71254614e2055c3287a510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a923564c6ffd37fb2fe9f118ef88092e8762c7addb526ab7eb1e772baef85181f892c731be0c1891a50e6b06262c816000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b84f83ff2df44193496793b847f64e9d6db1b3953682bb95edd096eb1e69bbd357c200992ca78050d0cbe180cfaa018e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0de8472be0308918c8bdb369bf5a67525210daffa053c52224c1d2ef4f5b38e4ecfcd06a1cc51c39c3a7dccfcb6b507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ae7bc6faa3f0cc3e6093b633fd7ee4f86970926958d0b7ec80437f936acf212b78f0cd095f4565fff144fd458d233a5b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003084248a459464eec1a21e7fc7b71a053d9644e9bb8da4853b8f872cd7c1d6b324bf1922829830646ceadfb658d3de009a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a8a257074e82b881cfa06ef3eb4efeca060c2531359abd0eab8af1e3edfa2025fca464ac9c3fd123f6c24a0d7886948500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003098cbf822e4bc29f1701ac0350a3d042cd0756e9f74822c6481773ceb000641c51b870a996fe0f6a844510b1061f38cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b772e180fbf38a051c97dabc8aaa0126a233a9e828cdafcc7422c4bb1f4030a56ba364c54103f26bad91508b5220b741000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030956c470ddff48cb49300200b5f83497f3a3ccb3aeb83c5edd9818569038e61d197184f4aa6939ea5e9911e3e98ac6d210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a80967d39e406a0a9642d41e9007a27fc1150a267d143a9f786cd2b5eecbdcc4036273705225b956d5e2f8f5eb95d25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b3a3d4feb825ae9702711566df5dbf38e82add4dd1b573b95d2466fa6501ccb81e9d26a352b96150ccbf7b697fd0a419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2d4c6283c44a1c7bd503aaba7666e9f0c830e0ff016c1c750a5e48757a713d0836b1cabfd5c281b1de3b77d1c19218300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003093c1f7f6929d1fe2a17b4e14614ef9fc5bdc713d6631d675403fbeefac55611bf612700b1b65f4744861b80b0f7d6ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308a60f82a7bcf74b4cb053b9bfe83d0ed02a84ebb10865dfdd8e26e7535c43a1cccd268e860f502216b379dfc9971d358000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030939e8fb41b682372335be8070199ad3e8621d1743bcac4cc9d8f0f6e10f41e56461385c8eb5daac804fe3f2bca6ce73900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096a26afa1295da81418593bd12814463d9f6e45c36a0e47eb4cd3e5b6af29c41e2a3a5636430155a466e216585af3ba7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1f2c71577def3144fabeb75a8a1c8cb5b51d1d1b4a05eec67988b8685008baa17459ec425dbaebc852f496dc92196cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b659ad0fbd9f515893fdd740b29ba0772dbde9b4635921dd91bd2963a0fc855e31f6338f45b211c4e9dedb7f2eb09de70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308819ec5ec3e97e1f03bbb4bb6055c7a5feac8f4f259df58349a32bb5cb377e2cb1f362b77f1dd398cfd3e9dba46138c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b313f9cba57c63a84edb4079140e6dbd7829e5023c9532fce57e9fe602400a2953f4bf7dab66cca16e97be95d4de7044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b64abe25614c9cfd32e456b4d521f29c8357f4af4606978296c9be93494072ac05fa86e3d27cc8d66e65000f8ba33fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0bec348681af766751cb839576e9c515a09c8bffa30a46296ccc56612490eb480d03bf948e10005bbcc0421f90b3d4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b0245c33bc556cfeb013cd3643b30dbdef6df61a0be3ba00cae104b3c587083852e28f8911689c7033f7021a8a1774c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a7f3e2c0b4b16ad183c473bafe30a36e39fa4a143657e229cd23c77f8fbc8e4e4e241695dd3d248d1e51521eee6619140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308fdf49777b22f927d460fa3fcdd7f2ba0cf200634a3dfb5197d7359f2f88aaf496ef8c93a065de0f376d164ff2b6db9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308ab17a9148339ef40aed8c177379c4db0bb5efc6f5c57a5d1a6b58b84d4b562e227196c79bda9a136830ed0c09f378130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308dd20979bd63c14df617a6939c3a334798149151577dd3f1fadb2bd1c1b496bf84c25c879da5f0f9dfdb88c6dd17b1e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b679cbab0276ac30ff5f198e5e1dedf6b84959129f70fe7a07fcdf13444ba45b5dbaa7b1f650adf8b0acbecd04e2675b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308974616fe8ab950a3cded19b1d16ff49c97bf5af65154b3b097d5523eb213f3d35fc5c57e7276c7f2d83be87ebfdcdf9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030ab764a39ff81dad720d5691b852898041a3842e09ecbac8025812d51b32223d8420e6ae51a01582220a10f7722de67c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309025b6715c8eaabac0bfccdb2f25d651c9b69b0a184011a4a486b0b2080319d2396e7ca337f2abdf01548b2de1b3ba06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b2317f59d86abfaf690850223d90e9e7593d91a29331dfc2f84d5adecc75fc39ecab4632c1b4400a3dd1e1298835bcca00000000000000000000000000000000a164736f6c6343000811000a".to_string()) } -} \ No newline at end of file +} diff --git a/crates/revm/src/processor.rs b/crates/revm/src/processor.rs index 4a4114ac4..877c98773 100644 --- a/crates/revm/src/processor.rs +++ b/crates/revm/src/processor.rs @@ -1,16 +1,20 @@ #[cfg(not(feature = "optimism"))] use revm::DatabaseCommit; +use reth_primitives::system_contracts; use revm::{ db::StateDBBox, inspector_handle_register, - interpreter::Host, - primitives::{CfgEnvWithHandlerCfg, ResultAndState}, + interpreter::{instructions::system, Host}, + primitives::{AccountInfo, CfgEnvWithHandlerCfg, ResultAndState}, Evm, State, }; use std::{sync::Arc, time::Instant}; #[cfg(not(feature = "optimism"))] use tracing::{debug, trace}; +#[cfg(feature = "bsc")] +use reth_primitives::system_contract; + use reth_evm::ConfigureEvm; use reth_interfaces::executor::{BlockExecutionError, BlockValidationError}; #[cfg(feature = "optimism")] @@ -204,7 +208,6 @@ where .increment_balances(balance_increments) .map_err(|_| BlockValidationError::IncrementBalanceFailed)?; - Ok(()) } @@ -271,7 +274,7 @@ where gas: GotExpected { got: cumulative_gas_used, expected: block.gas_used }, gas_spent_by_tx: receipts.gas_spent_by_tx()?, } - .into()) + .into()); } let time = Instant::now(); self.apply_post_execution_state_change(block, total_difficulty)?; @@ -302,6 +305,7 @@ where &mut self, block: &BlockWithSenders, total_difficulty: U256, + parent_block_timestamp: u64, ) -> Result<(), BlockExecutionError> { // execute block let receipts = self.execute_inner(block, total_difficulty)?; @@ -316,11 +320,26 @@ where verify_receipt(block.header.receipts_root, block.header.logs_bloom, receipts.iter()) { debug!(target: "evm", %error, ?receipts, "receipts verification failed"); - return Err(error) + return Err(error); }; self.stats.receipt_root_duration += time.elapsed(); } + match system_contracts::get_upgrade_system_contracts( + &self.chain_spec, + block.number, + parent_block_timestamp, + block.header.timestamp, + ) { + Ok(contracts) => { + contracts.iter().for_each(|(k, v)| { + let account = AccountInfo { code: v.clone(), ..Default::default() }; + self.db_mut().insert_account(*k, account); + }); + } + Err(e) => return Err(BlockExecutionError::CanonicalCommit { inner: e.to_string() }), + }; + self.batch_record.save_receipts(receipts)?; Ok(()) } @@ -334,7 +353,7 @@ where // perf: do not execute empty blocks if block.body.is_empty() { - return Ok((Vec::new(), 0)) + return Ok((Vec::new(), 0)); } let mut cumulative_gas_used = 0; @@ -349,7 +368,7 @@ where transaction_gas_limit: transaction.gas_limit(), block_available_gas, } - .into()) + .into()); } // Execute transaction. let ResultAndState { result, state } = self.transact(transaction, *sender)?; @@ -446,14 +465,14 @@ pub fn compare_receipts_root_and_logs_bloom( return Err(BlockValidationError::ReceiptRootDiff( GotExpected { got: calculated_receipts_root, expected: expected_receipts_root }.into(), ) - .into()) + .into()); } if calculated_logs_bloom != expected_logs_bloom { return Err(BlockValidationError::BloomLogDiff( GotExpected { got: calculated_logs_bloom, expected: expected_logs_bloom }.into(), ) - .into()) + .into()); } Ok(()) @@ -527,6 +546,7 @@ mod tests { senders: vec![], }, U256::ZERO, + 0, ) .expect_err( "Executing cancun block without parent beacon block root field should fail", @@ -623,6 +643,7 @@ mod tests { senders: vec![], }, U256::ZERO, + 0, ) .expect( "Executing a block with no transactions while cancun is active should not fail", @@ -679,6 +700,7 @@ mod tests { senders: vec![], }, U256::ZERO, + 0, ) .expect( "Executing a block with no transactions while cancun is active should not fail", @@ -724,6 +746,7 @@ mod tests { senders: vec![], }, U256::ZERO, + 0, ) .expect_err( "Executing genesis cancun block with non-zero parent beacon block root field should fail", diff --git a/crates/stages/src/stages/execution.rs b/crates/stages/src/stages/execution.rs index 7f22ecaef..b986371f1 100644 --- a/crates/stages/src/stages/execution.rs +++ b/crates/stages/src/stages/execution.rs @@ -191,6 +191,30 @@ impl ExecutionStage { let mut cumulative_gas = 0; let batch_start = Instant::now(); + let mut parent_block_timestamp = 0u64; + + // get parent block timestamp for execution + if start_block > 0 { + let parent_block_number = start_block - 1 as u64; + let parent_header = match static_file_provider.header_by_number(parent_block_number) { + Ok(Some(header)) => header, + _ => return Err(StageError::DatabaseIntegrity(ProviderError::HeaderNotFound(parent_block_number.into()))), + }; + parent_block_timestamp = parent_header.timestamp; + } + + let mut parent_block_timestamp = 0u64; + // get parent block timestamp for execution + if start_block > 0 { + let parent_block_number = start_block - 1 as u64; + let parent_header = match static_file_provider.header_by_number(parent_block_number) { + Ok(Some(header)) => header, + _ => return Err(StageError::DatabaseIntegrity(ProviderError::HeaderNotFound(parent_block_number.into()))), + }; + parent_block_timestamp = parent_header.timestamp; + } + + let mut blocks = Vec::new(); for block_number in start_block..=max_block { // Fetch the block @@ -214,7 +238,7 @@ impl ExecutionStage { // Execute the block let execute_start = Instant::now(); - executor.execute_and_verify_receipt(&block, td).map_err(|error| StageError::Block { + executor.execute_and_verify_receipt(&block, td, parent_block_timestamp).map_err(|error| StageError::Block { block: Box::new(block.header.clone().seal_slow()), error: BlockErrorKind::Execution(error), })?; @@ -244,6 +268,9 @@ impl ExecutionStage { ) { break } + + // Update parent block timestamp for next block + parent_block_timestamp = block.header.timestamp; } let time = Instant::now(); let state = executor.take_output_state(); diff --git a/crates/storage/provider/src/test_utils/executor.rs b/crates/storage/provider/src/test_utils/executor.rs index 8ac963e93..3478b2793 100644 --- a/crates/storage/provider/src/test_utils/executor.rs +++ b/crates/storage/provider/src/test_utils/executor.rs @@ -17,6 +17,7 @@ impl BlockExecutor for TestExecutor { &mut self, _block: &BlockWithSenders, _total_difficulty: U256, + _parent_block_timestamper: u64, ) -> Result<(), BlockExecutionError> { if self.0.is_none() { return Err(BlockExecutionError::UnavailableForTest) diff --git a/crates/storage/provider/src/traits/executor.rs b/crates/storage/provider/src/traits/executor.rs index f12d64169..cfc2874a3 100644 --- a/crates/storage/provider/src/traits/executor.rs +++ b/crates/storage/provider/src/traits/executor.rs @@ -30,6 +30,7 @@ pub trait BlockExecutor { &mut self, block: &BlockWithSenders, total_difficulty: U256, + parent_block_timestamp: u64, ) -> Result<(), Self::Error>; /// Runs the provided transactions and commits their state to the run-time database.