diff --git a/CHANGELOG.md b/CHANGELOG.md index 548c99acfa..8aafcd9de4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,33 @@ # Changelog +## v1.4.3 +### FEATURE +* [\#2241](https://github.com/bnb-chain/bsc/pull/2241) cmd/utils, core/rawdb, triedb/pathdb: flip hash to path scheme +* [\#2312](https://github.com/bnb-chain/bsc/pull/2312) cmd/utils, node: switch to Pebble as the default db if none exists + +### IMPROVEMENT +* [\#2228](https://github.com/bnb-chain/bsc/pull/2228) core: rephrase TriesInMemory log +* [\#2234](https://github.com/bnb-chain/bsc/pull/2234) cmd/utils: disable snap protocol for fast node +* [\#2236](https://github.com/bnb-chain/bsc/pull/2236) build(deps): bump github.com/quic-go/quic-go from 0.39.3 to 0.39.4 +* [\#2240](https://github.com/bnb-chain/bsc/pull/2240) core/state: fix taskResult typo + +* [\#2280](https://github.com/bnb-chain/bsc/pull/2280) cmd/utils, core: only full sync for fast nodes +* [\#2298](https://github.com/bnb-chain/bsc/pull/2298) cmd, node: initialize ports with --instance +* [\#2302](https://github.com/bnb-chain/bsc/pull/2302) cmd/geth, core/rawdb: add dbDeleteTrieState +* [\#2304](https://github.com/bnb-chain/bsc/pull/2304) eth/ethconfig: remove overridekepler and overrideshanghai +* [\#2307](https://github.com/bnb-chain/bsc/pull/2307) internal/ethapi: add net_nodeInfo +* [\#2311](https://github.com/bnb-chain/bsc/pull/2311) Port cancun related changes from unreleased v1.14.0 +* [\#2313](https://github.com/bnb-chain/bsc/pull/2313) tests/truffle: use hbss to run test +* [\#2314](https://github.com/bnb-chain/bsc/pull/2314) cmd/jsutil: dump MinGasPrice for validator +* [\#2317](https://github.com/bnb-chain/bsc/pull/2317) feat: add mev metrics + +### BUGFIX +* [\#2272](https://github.com/bnb-chain/bsc/pull/2272) parlia: add state prepare for internal SC transaction +* [\#2277](https://github.com/bnb-chain/bsc/pull/2277) fix: systemTx should be always at the end of block +* [\#2299](https://github.com/bnb-chain/bsc/pull/2299) fix: add FeynmanFix upgrade for a testnet issue +* [\#2310](https://github.com/bnb-chain/bsc/pull/2310) core/vm: fix PrecompiledContractsCancun + ## v1.4.2 -### Feature +### FEATURE * [\#2021](https://github.com/bnb-chain/bsc/pull/2021) feat: support separate trie database * [\#2224](https://github.com/bnb-chain/bsc/pull/2224) feat: support MEV @@ -120,6 +147,10 @@ NA [event: fix Resubscribe deadlock when unsubscribing after inner sub ends (#28359)](https://github.com/bnb-chain/bsc/commit/ffc6a0f36edda396a8421cf7a3c0feb88be20d0b) [all: replace log15 with slog (#28187)](https://github.com/bnb-chain/bsc/commit/28e73717016cdc9ebdb5fdb3474cfbd3bd2d2524) +## v1.3.11 +BUGFIX +* [\#2288](https://github.com/bnb-chain/bsc/pull/2288) fix: add FeynmanFix upgrade for a testnet issue + ## v1.3.10 FEATURE * [\#2047](https://github.com/bnb-chain/bsc/pull/2047) feat: add new fork block and precompile contract for BEP294 and BEP299 diff --git a/beacon/engine/types.go b/beacon/engine/types.go index 60accc3c79..7ccc0d5b37 100644 --- a/beacon/engine/types.go +++ b/beacon/engine/types.go @@ -263,7 +263,7 @@ func ExecutableDataToBlock(params ExecutableData, versionedHashes []common.Hash, // BlockToExecutableData constructs the ExecutableData structure by filling the // fields from the given block. It assumes the given block is post-merge block. -func BlockToExecutableData(block *types.Block, fees *big.Int, sidecars []*types.BlobTxSidecar) *ExecutionPayloadEnvelope { +func BlockToExecutableData(block *types.Block, fees *big.Int, sidecars types.BlobSidecars) *ExecutionPayloadEnvelope { data := &ExecutableData{ BlockHash: block.Hash(), ParentHash: block.ParentHash(), diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index ca1590833e..1decb81934 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -169,7 +169,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, // Calculate the BlobBaseFee var excessBlobGas uint64 if pre.Env.ExcessBlobGas != nil { - excessBlobGas := *pre.Env.ExcessBlobGas + excessBlobGas = *pre.Env.ExcessBlobGas vmContext.BlobBaseFee = eip4844.CalcBlobFee(excessBlobGas) } else { // If it is not explicitly defined, but we have the parent values, we try diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 6f7250aee1..bee0f768d1 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -26,6 +26,8 @@ import ( "strings" "unicode" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/external" "github.com/ethereum/go-ethereum/accounts/keystore" @@ -183,14 +185,6 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { params.RialtoGenesisHash = common.HexToHash(v) } - if ctx.IsSet(utils.OverrideShanghai.Name) { - v := ctx.Uint64(utils.OverrideShanghai.Name) - cfg.Eth.OverrideShanghai = &v - } - if ctx.IsSet(utils.OverrideKepler.Name) { - v := ctx.Uint64(utils.OverrideKepler.Name) - cfg.Eth.OverrideKepler = &v - } if ctx.IsSet(utils.OverrideCancun.Name) { v := ctx.Uint64(utils.OverrideCancun.Name) cfg.Eth.OverrideCancun = &v @@ -203,6 +197,20 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { v := ctx.Uint64(utils.OverrideFeynman.Name) cfg.Eth.OverrideFeynman = &v } + if ctx.IsSet(utils.OverrideFeynmanFix.Name) { + v := ctx.Uint64(utils.OverrideFeynmanFix.Name) + cfg.Eth.OverrideFeynmanFix = &v + } + if ctx.IsSet(utils.OverrideFullImmutabilityThreshold.Name) { + params.FullImmutabilityThreshold = ctx.Uint64(utils.OverrideFullImmutabilityThreshold.Name) + downloader.FullMaxForkAncestry = ctx.Uint64(utils.OverrideFullImmutabilityThreshold.Name) + } + if ctx.IsSet(utils.OverrideMinBlocksForBlobRequests.Name) { + params.MinBlocksForBlobRequests = ctx.Uint64(utils.OverrideMinBlocksForBlobRequests.Name) + } + if ctx.IsSet(utils.OverrideDefaultExtraReserveForBlobRequests.Name) { + params.DefaultExtraReserveForBlobRequests = ctx.Uint64(utils.OverrideDefaultExtraReserveForBlobRequests.Name) + } if ctx.IsSet(utils.SeparateDBFlag.Name) && !stack.IsSeparatedDB() { utils.Fatalf("Failed to locate separate database subdirectory when separatedb parameter has been set") } diff --git a/cmd/geth/dbcmd.go b/cmd/geth/dbcmd.go index f6015eca22..c50ab32e2f 100644 --- a/cmd/geth/dbcmd.go +++ b/cmd/geth/dbcmd.go @@ -76,6 +76,7 @@ Remove blockchain and state databases`, dbCompactCmd, dbGetCmd, dbDeleteCmd, + dbDeleteTrieStateCmd, dbInspectTrieCmd, dbPutCmd, dbGetSlotsCmd, @@ -206,6 +207,15 @@ corruption if it is aborted during execution'!`, Description: `This command deletes the specified database key from the database. WARNING: This is a low-level operation which may cause database corruption!`, } + dbDeleteTrieStateCmd = &cli.Command{ + Action: dbDeleteTrieState, + Name: "delete-trie-state", + Usage: "Delete all trie state key-value pairs from the database and the ancient state. Does not support hash-based state scheme.", + Flags: flags.Merge([]cli.Flag{ + utils.SyncModeFlag, + }, utils.NetworkFlags, utils.DatabaseFlags), + Description: `This command deletes all trie state key-value pairs from the database and the ancient state.`, + } dbPutCmd = &cli.Command{ Action: dbPut, Name: "put", @@ -810,6 +820,82 @@ func dbDelete(ctx *cli.Context) error { return nil } +// dbDeleteTrieState deletes all trie state related key-value pairs from the database and the ancient state store. +func dbDeleteTrieState(ctx *cli.Context) error { + if ctx.NArg() > 0 { + return fmt.Errorf("no arguments required") + } + + stack, config := makeConfigNode(ctx) + defer stack.Close() + + db := utils.MakeChainDatabase(ctx, stack, false, false) + defer db.Close() + + var ( + err error + start = time.Now() + ) + + // If separate trie db exists, delete all files in the db folder + if db.StateStore() != nil { + statePath := filepath.Join(stack.ResolvePath("chaindata"), "state") + log.Info("Removing separate trie database", "path", statePath) + err = filepath.Walk(statePath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if path != statePath { + fileInfo, err := os.Lstat(path) + if err != nil { + return err + } + if !fileInfo.IsDir() { + os.Remove(path) + } + } + return nil + }) + log.Info("Separate trie database deleted", "err", err, "elapsed", common.PrettyDuration(time.Since(start))) + return err + } + + // Delete KV pairs from the database + err = rawdb.DeleteTrieState(db) + if err != nil { + return err + } + + // Remove the full node ancient database + dbPath := config.Eth.DatabaseFreezer + switch { + case dbPath == "": + dbPath = filepath.Join(stack.ResolvePath("chaindata"), "ancient/state") + case !filepath.IsAbs(dbPath): + dbPath = config.Node.ResolvePath(dbPath) + } + + if !common.FileExist(dbPath) { + return nil + } + + log.Info("Removing ancient state database", "path", dbPath) + start = time.Now() + filepath.Walk(dbPath, func(path string, info os.FileInfo, err error) error { + if dbPath == path { + return nil + } + if !info.IsDir() { + os.Remove(path) + return nil + } + return filepath.SkipDir + }) + log.Info("State database successfully deleted", "path", dbPath, "elapsed", common.PrettyDuration(time.Since(start))) + + return nil +} + // dbPut overwrite a value in the database func dbPut(ctx *cli.Context) error { if ctx.NArg() != 2 { diff --git a/cmd/geth/genesis_test.go b/cmd/geth/genesis_test.go index 54ab7e434d..6a76781112 100644 --- a/cmd/geth/genesis_test.go +++ b/cmd/geth/genesis_test.go @@ -151,8 +151,8 @@ func TestCustomBackend(t *testing.T) { return nil } for i, tt := range []backendTest{ - { // When not specified, it should default to leveldb - execArgs: []string{"--db.engine", "leveldb"}, + { // When not specified, it should default to pebble + execArgs: []string{"--db.engine", "pebble"}, execExpect: "0x0000000000001338", }, { // Explicit leveldb diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 86fe2b6665..582213e587 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -70,11 +70,13 @@ var ( utils.USBFlag, utils.SmartCardDaemonPathFlag, utils.RialtoHash, - utils.OverrideShanghai, - utils.OverrideKepler, utils.OverrideCancun, utils.OverrideVerkle, utils.OverrideFeynman, + utils.OverrideFeynmanFix, + utils.OverrideFullImmutabilityThreshold, + utils.OverrideMinBlocksForBlobRequests, + utils.OverrideDefaultExtraReserveForBlobRequests, utils.EnablePersonal, utils.TxPoolLocalsFlag, utils.TxPoolNoLocalsFlag, @@ -144,6 +146,7 @@ var ( utils.NoDiscoverFlag, utils.DiscoveryV4Flag, utils.DiscoveryV5Flag, + utils.InstanceFlag, utils.LegacyDiscoveryV5Flag, // deprecated utils.NetrestrictFlag, utils.NodeKeyFileFlag, @@ -172,6 +175,7 @@ var ( utils.VoteJournalDirFlag, utils.LogDebugFlag, utils.LogBacktraceAtFlag, + utils.BlobExtraReserveFlag, }, utils.NetworkFlags, utils.DatabaseFlags) rpcFlags = []cli.Flag{ diff --git a/cmd/jsutils/README.md b/cmd/jsutils/README.md index 30d512860a..6fd4dcdf34 100644 --- a/cmd/jsutils/README.md +++ b/cmd/jsutils/README.md @@ -11,6 +11,7 @@ Install node.js dependency: npm install ``` ## Run +### 1.Get Validator's Information: Version, MinGasPrice mainnet validators version ```bash npm run startMainnet @@ -19,7 +20,8 @@ testnet validators version ```bash npm run startTestnet ``` -Transaction count + +### 2.Get Transaction Count ```bash node gettxcount.js --rpc ${url} --startNum ${start} --endNum ${end} --miner ${miner} (optional) ``` \ No newline at end of file diff --git a/cmd/jsutils/gettxcount.js b/cmd/jsutils/gettxcount.js index 921f801247..8bc7f2bdd9 100644 --- a/cmd/jsutils/gettxcount.js +++ b/cmd/jsutils/gettxcount.js @@ -4,6 +4,9 @@ import program from "commander"; program.option("--rpc ", "Rpc"); program.option("--startNum ", "start num") program.option("--endNum ", "end num") +// --miner: +// specified: find the max txCounter from the specified validator +// not specified: find the max txCounter from all validators program.option("--miner ", "miner", "") program.parse(process.argv); diff --git a/cmd/jsutils/getvalidatorversion.js b/cmd/jsutils/getvalidatorversion.js index d0d9fc3d90..495b913f43 100644 --- a/cmd/jsutils/getvalidatorversion.js +++ b/cmd/jsutils/getvalidatorversion.js @@ -12,10 +12,23 @@ const main = async () => { console.log(blockNum); for (let i = 0; i < program.Num; i++) { let blockData = await provider.getBlock(blockNum - i); + // 1.get Geth client version let major = ethers.toNumber(ethers.dataSlice(blockData.extraData, 2, 3)) let minor = ethers.toNumber(ethers.dataSlice(blockData.extraData, 3, 4)) let patch = ethers.toNumber(ethers.dataSlice(blockData.extraData, 4, 5)) - console.log(blockData.miner, "version =", major + "." + minor + "." + patch) + + // 2.get minimum txGasPrice based on the last non-zero-gasprice transaction + let lastGasPrice = 0 + for (let txIndex = blockData.transactions.length - 1; txIndex >= 0; txIndex--) { + let txHash = blockData.transactions[txIndex] + let txData = await provider.getTransaction(txHash); + if (txData.gasPrice == 0) { + continue + } + lastGasPrice = txData.gasPrice + break + } + console.log(blockData.miner, "version =", major + "." + minor + "." + patch, " MinGasPrice = " + lastGasPrice) } }; main().then(() => process.exit(0)) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 18c0167eee..088f2155f1 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -150,6 +150,12 @@ var ( Usage: "Minimum free disk space in MB, once reached triggers auto shut down (default = --cache.gc converted to MB, 0 = disabled)", Category: flags.EthCategory, } + InstanceFlag = &cli.IntFlag{ + Name: "instance", + Usage: "Configures the ports to avoid conflicts when running multiple nodes on the same machine. Maximum is 200. Only applicable for: port, authrpc.port, discovery,port, http.port, ws.port", + Value: 1, + Category: flags.EthCategory, + } KeyStoreDirFlag = &flags.DirectoryFlag{ Name: "keystore", Usage: "Directory for the keystore (default = inside the datadir)", @@ -299,16 +305,6 @@ var ( Usage: "Manually specify the Rialto Genesis Hash, to trigger builtin network logic", Category: flags.EthCategory, } - OverrideShanghai = &cli.Uint64Flag{ - Name: "override.shanghai", - Usage: "Manually specify the Shanghai fork timestamp, overriding the bundled setting", - Category: flags.EthCategory, - } - OverrideKepler = &cli.Uint64Flag{ - Name: "override.kepler", - Usage: "Manually specify the Kepler fork timestamp, overriding the bundled setting", - Category: flags.EthCategory, - } OverrideCancun = &cli.Uint64Flag{ Name: "override.cancun", Usage: "Manually specify the Cancun fork timestamp, overriding the bundled setting", @@ -324,6 +320,28 @@ var ( Usage: "Manually specify the Feynman fork timestamp, overriding the bundled setting", Category: flags.EthCategory, } + OverrideFeynmanFix = &cli.Uint64Flag{ + Name: "override.feynmanfix", + Usage: "Manually specify the FeynmanFix fork timestamp, overriding the bundled setting", + } + OverrideFullImmutabilityThreshold = &cli.Uint64Flag{ + Name: "override.immutabilitythreshold", + Usage: "It is the number of blocks after which a chain segment is considered immutable, only for testing purpose", + Value: params.FullImmutabilityThreshold, + Category: flags.EthCategory, + } + OverrideMinBlocksForBlobRequests = &cli.Uint64Flag{ + Name: "override.minforblobrequest", + Usage: "It keeps blob data available for min blocks in local, only for testing purpose", + Value: params.MinBlocksForBlobRequests, + Category: flags.EthCategory, + } + OverrideDefaultExtraReserveForBlobRequests = &cli.Uint64Flag{ + Name: "override.defaultextrareserve", + Usage: "It adds more extra time for expired blobs for some request cases, only for testing purpose", + Value: params.DefaultExtraReserveForBlobRequests, + Category: flags.EthCategory, + } SyncModeFlag = &flags.TextMarshalerFlag{ Name: "syncmode", Usage: `Blockchain sync mode ("snap" or "full")`, @@ -1100,6 +1118,14 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server. Usage: "Path for the voteJournal dir in fast finality feature (default = inside the datadir)", Category: flags.FastFinalityCategory, } + + // Blob setting + BlobExtraReserveFlag = &cli.Uint64Flag{ + Name: "blob.extra-reserve", + Usage: "Extra reserve threshold for blob, blob never expires when 0 is set, default 28800", + Value: params.DefaultExtraReserveForBlobRequests, + Category: flags.MiscCategory, + } ) var ( @@ -1542,6 +1568,7 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) { // SetNodeConfig applies node-related command line flags to the config. func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { + setInstance(ctx, cfg) SetP2PConfig(ctx, &cfg.P2P) setIPC(ctx, cfg) setHTTP(ctx, cfg) @@ -1938,6 +1965,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { if ctx.String(GCModeFlag.Name) == "archive" && cfg.TransactionHistory != 0 { cfg.TransactionHistory = 0 log.Warn("Disabled transaction unindexing for archive node") + + cfg.StateScheme = rawdb.HashScheme + log.Warn("Forcing hash state-scheme for archive mode") } if ctx.IsSet(CacheFlag.Name) || ctx.IsSet(CacheTrieFlag.Name) { cfg.TrieCleanCache = ctx.Int(CacheFlag.Name) * ctx.Int(CacheTrieFlag.Name) / 100 @@ -1955,6 +1985,16 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { if cfg.TriesVerifyMode.NeedRemoteVerify() { cfg.EnableTrustProtocol = true } + // A node without trie is not able to provide snap data, so it should disable snap protocol. + if cfg.TriesVerifyMode != core.LocalVerify { + log.Info("Automatically disables snap protocol due to verify mode", "mode", cfg.TriesVerifyMode) + cfg.DisableSnapProtocol = true + } + + if cfg.SyncMode == downloader.SnapSync && cfg.TriesVerifyMode.NoTries() { + log.Warn("Only local TriesVerifyMode can support snap sync, resetting to full sync", "mode", cfg.TriesVerifyMode) + cfg.SyncMode = downloader.FullSync + } } if ctx.IsSet(CacheFlag.Name) || ctx.IsSet(CacheSnapshotFlag.Name) { cfg.SnapshotCache = ctx.Int(CacheFlag.Name) * ctx.Int(CacheSnapshotFlag.Name) / 100 @@ -2086,7 +2126,7 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { if rawdb.ReadCanonicalHash(chaindb, 0) != (common.Hash{}) { cfg.Genesis = nil // fallback to db content - //validate genesis has PoS enabled in block 0 + // validate genesis has PoS enabled in block 0 genesis, err := core.ReadGenesis(chaindb) if err != nil { Fatalf("Could not read genesis from database: %v", err) @@ -2119,6 +2159,18 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { if err := kzg4844.UseCKZG(ctx.String(CryptoKZGFlag.Name) == "ckzg"); err != nil { Fatalf("Failed to set KZG library implementation to %s: %v", ctx.String(CryptoKZGFlag.Name), err) } + + // blob setting + if ctx.IsSet(OverrideDefaultExtraReserveForBlobRequests.Name) { + cfg.BlobExtraReserve = ctx.Uint64(OverrideDefaultExtraReserveForBlobRequests.Name) + } + if ctx.IsSet(BlobExtraReserveFlag.Name) { + extraReserve := ctx.Uint64(BlobExtraReserveFlag.Name) + if extraReserve > 0 && extraReserve < params.DefaultExtraReserveForBlobRequests { + extraReserve = params.DefaultExtraReserveForBlobRequests + } + cfg.BlobExtraReserve = extraReserve + } } // SetDNSDiscoveryDefaults configures DNS discovery with the given URL if @@ -2528,3 +2580,24 @@ func ParseCLIAndConfigStateScheme(cliScheme, cfgScheme string) (string, error) { } return "", fmt.Errorf("incompatible state scheme, CLI: %s, config: %s", cliScheme, cfgScheme) } + +// setInstance configures the port numbers for the given instance. +func setInstance(ctx *cli.Context, cfg *node.Config) { + if ctx.IsSet(InstanceFlag.Name) { + cfg.Instance = ctx.Int(InstanceFlag.Name) + } + + if cfg.Instance > 200 { + Fatalf("Instance number %d is too high, maximum is 200", cfg.Instance) + } + + if cfg.Instance == 1 { // using default ports + return + } + + cfg.AuthPort = node.DefaultConfig.AuthPort + cfg.Instance*100 - 100 + cfg.HTTPPort = node.DefaultHTTPPort - cfg.Instance + 1 + cfg.WSPort = node.DefaultWSPort + cfg.Instance*2 - 2 + cfg.P2P.ListenAddr = fmt.Sprintf(":%d", node.DefaultListenPort+cfg.Instance-1) + cfg.P2P.DiscAddr = fmt.Sprintf(":%d", node.DefaultDiscPort+cfg.Instance-1) +} diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index bad64b24af..ddacbc2e6e 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -407,7 +407,7 @@ func (c *Clique) snapshot(chain consensus.ChainHeaderReader, number uint64, hash // at a checkpoint block without a parent (light client CHT), or we have piled // up more headers than allowed to be reorged (chain reinit from a freezer), // consider the checkpoint trusted and snapshot it. - if number == 0 || (number%c.config.Epoch == 0 && (len(headers) > params.FullImmutabilityThreshold || chain.GetHeaderByNumber(number-1) == nil)) { + if number == 0 || (number%c.config.Epoch == 0 && (len(headers) > int(params.FullImmutabilityThreshold) || chain.GetHeaderByNumber(number-1) == nil)) { checkpoint := chain.GetHeaderByNumber(number) if checkpoint != nil { hash := checkpoint.Hash() diff --git a/consensus/consensus.go b/consensus/consensus.go index 0ac5b70ece..84c07ae27b 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -58,6 +58,9 @@ type ChainHeaderReader interface { // GetHighestVerifiedHeader retrieves the highest header verified. GetHighestVerifiedHeader() *types.Header + + // ChasingHead return the best chain head of peers. + ChasingHead() *types.Header } type VotePool interface { diff --git a/consensus/parlia/parlia.go b/consensus/parlia/parlia.go index 4186cbcde1..7c9d0ea8a5 100644 --- a/consensus/parlia/parlia.go +++ b/consensus/parlia/parlia.go @@ -583,14 +583,6 @@ func (p *Parlia) verifyHeader(chain consensus.ChainHeaderReader, header *types.H return err } - // Verify existence / non-existence of withdrawalsHash. - if header.WithdrawalsHash != nil { - return fmt.Errorf("invalid withdrawalsHash: have %x, expected nil", header.WithdrawalsHash) - } - // Verify the existence / non-existence of cancun-specific header fields - if header.ParentBeaconRoot != nil { - return fmt.Errorf("invalid parentBeaconRoot, have %#x, expected nil", header.ParentBeaconRoot) - } cancun := chain.Config().IsCancun(header.Number, header.Time) if !cancun { switch { @@ -598,8 +590,20 @@ func (p *Parlia) verifyHeader(chain consensus.ChainHeaderReader, header *types.H return fmt.Errorf("invalid excessBlobGas: have %d, expected nil", header.ExcessBlobGas) case header.BlobGasUsed != nil: return fmt.Errorf("invalid blobGasUsed: have %d, expected nil", header.BlobGasUsed) + case header.ParentBeaconRoot != nil: + return fmt.Errorf("invalid parentBeaconRoot, have %#x, expected nil", header.ParentBeaconRoot) + case header.WithdrawalsHash != nil: + return fmt.Errorf("invalid WithdrawalsHash, have %#x, expected nil", header.WithdrawalsHash) } } else { + switch { + case header.ParentBeaconRoot != nil: + return fmt.Errorf("invalid parentBeaconRoot, have %#x, expected nil", header.ParentBeaconRoot) + // types.EmptyWithdrawalsHash represents a empty value when EIP-4895 enabled, + // here, EIP-4895 still be disabled, value expected to be `common.Hash{}` is only to feet the demand of rlp encode/decode + case header.WithdrawalsHash == nil || *header.WithdrawalsHash != common.Hash{}: + return errors.New("header has wrong WithdrawalsHash") + } if err := eip4844.VerifyEIP4844Header(parent, header); err != nil { return err } @@ -700,7 +704,7 @@ func (p *Parlia) snapshot(chain consensus.ChainHeaderReader, number uint64, hash // If we're at the genesis, snapshot the initial state. Alternatively if we have // piled up more headers than allowed to be reorged (chain reinit from a freezer), // consider the checkpoint trusted and snapshot it. - if number == 0 || (number%p.config.Epoch == 0 && (len(headers) > params.FullImmutabilityThreshold/10)) { + if number == 0 || (number%p.config.Epoch == 0 && (len(headers) > int(params.FullImmutabilityThreshold)/10)) { checkpoint := chain.GetHeaderByNumber(number) if checkpoint != nil { // get checkpoint data @@ -1999,16 +2003,19 @@ func applyMessage( chainConfig *params.ChainConfig, chainContext core.ChainContext, ) (uint64, error) { - // TODO(Nathan): state.Prepare should be called here, now accessList related EIP not affect systemtxs - // EIP1153 may cause a critical issue in the future // Create a new context to be used in the EVM environment context := core.NewEVMBlockContext(header, chainContext, nil) // Create a new environment which holds all relevant information // about the transaction and calling mechanisms. vmenv := vm.NewEVM(context, vm.TxContext{Origin: msg.From(), GasPrice: big.NewInt(0)}, state, chainConfig, vm.Config{}) // Apply the transaction to the current state (included in the env) + if chainConfig.IsCancun(header.Number, header.Time) { + rules := vmenv.ChainConfig().Rules(vmenv.Context.BlockNumber, vmenv.Context.Random != nil, vmenv.Context.Time) + state.Prepare(rules, msg.From(), vmenv.Context.Coinbase, msg.To(), vm.ActivePrecompiles(rules), msg.AccessList) + } // Increment the nonce for the next transaction state.SetNonce(msg.From(), state.GetNonce(msg.From())+1) + ret, returnGas, err := vmenv.Call( vm.AccountRef(msg.From()), *msg.To(), diff --git a/core/block_validator.go b/core/block_validator.go index ce4b95f6c4..8bd5071f12 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -96,7 +96,7 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { }, func() error { // Withdrawals are present after the Shanghai fork. - if header.WithdrawalsHash != nil { + if !header.EmptyWithdrawalsHash() { // Withdrawals list must be present in body after Shanghai. if block.Withdrawals() == nil { return errors.New("missing withdrawals in block body") @@ -104,7 +104,7 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { if hash := types.DeriveSha(block.Withdrawals(), trie.NewStackTrie(nil)); hash != *header.WithdrawalsHash { return fmt.Errorf("withdrawals root hash mismatch (header value %x, calculated %x)", *header.WithdrawalsHash, hash) } - } else if block.Withdrawals() != nil { + } else if len(block.Withdrawals()) != 0 { // Withdrawals turn into empty from nil when BlockBody has Sidecars // Withdrawals are not allowed prior to shanghai fork return errors.New("withdrawals present in block body") } diff --git a/core/blockchain.go b/core/blockchain.go index 62b1e56f60..0045932e9d 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -110,6 +110,7 @@ const ( blockCacheLimit = 256 diffLayerCacheLimit = 1024 receiptsCacheLimit = 10000 + sidecarsCacheLimit = 1024 txLookupCacheLimit = 1024 maxBadBlockLimit = 16 maxFutureBlocks = 256 @@ -271,12 +272,14 @@ type BlockChain struct { highestVerifiedHeader atomic.Pointer[types.Header] currentBlock atomic.Pointer[types.Header] // Current head of the chain currentSnapBlock atomic.Pointer[types.Header] // Current head of snap-sync + chasingHead atomic.Pointer[types.Header] bodyCache *lru.Cache[common.Hash, *types.Body] bodyRLPCache *lru.Cache[common.Hash, rlp.RawValue] receiptsCache *lru.Cache[common.Hash, []*types.Receipt] blockCache *lru.Cache[common.Hash, *types.Block] txLookupCache *lru.Cache[common.Hash, txLookup] + sidecarsCache *lru.Cache[common.Hash, types.BlobSidecars] // future blocks are blocks added for later processing futureBlocks *lru.Cache[common.Hash, *types.Block] @@ -316,9 +319,9 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis if cacheConfig == nil { cacheConfig = defaultCacheConfig } - if cacheConfig.TriesInMemory != 128 { - log.Warn("TriesInMemory isn't the default value(128), you need specify exact same TriesInMemory when prune data", - "triesInMemory", cacheConfig.TriesInMemory) + if cacheConfig.StateScheme == rawdb.HashScheme && cacheConfig.TriesInMemory != 128 { + log.Warn("TriesInMemory isn't the default value (128), you need specify the same TriesInMemory when pruning data", + "triesInMemory", cacheConfig.TriesInMemory, "scheme", cacheConfig.StateScheme) } diffLayerCache, _ := exlru.New(diffLayerCacheLimit) @@ -359,6 +362,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis bodyCache: lru.NewCache[common.Hash, *types.Body](bodyCacheLimit), bodyRLPCache: lru.NewCache[common.Hash, rlp.RawValue](bodyCacheLimit), receiptsCache: lru.NewCache[common.Hash, []*types.Receipt](receiptsCacheLimit), + sidecarsCache: lru.NewCache[common.Hash, types.BlobSidecars](sidecarsCacheLimit), blockCache: lru.NewCache[common.Hash, *types.Block](blockCacheLimit), txLookupCache: lru.NewCache[common.Hash, txLookup](txLookupCacheLimit), futureBlocks: lru.NewCache[common.Hash, *types.Block](maxFutureBlocks), @@ -390,6 +394,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis bc.highestVerifiedHeader.Store(nil) bc.currentBlock.Store(nil) bc.currentSnapBlock.Store(nil) + bc.chasingHead.Store(nil) // Update chain info data metrics chainInfoGauge.Update(metrics.GaugeInfoValue{"chain_id": bc.chainConfig.ChainID.String()}) @@ -646,6 +651,9 @@ func (bc *BlockChain) cacheDiffLayer(diffLayer *types.DiffLayer, diffLayerCh cha func (bc *BlockChain) cacheBlock(hash common.Hash, block *types.Block) { bc.blockCache.Add(hash, block) + if bc.chainConfig.IsCancun(block.Number(), block.Time()) { + bc.sidecarsCache.Add(hash, block.Sidecars()) + } } // empty returns an indicator whether the blockchain is empty. @@ -990,6 +998,7 @@ func (bc *BlockChain) setHeadBeyondRoot(head uint64, time uint64, root common.Ha bc.bodyCache.Purge() bc.bodyRLPCache.Purge() bc.receiptsCache.Purge() + bc.sidecarsCache.Purge() bc.blockCache.Purge() bc.txLookupCache.Purge() bc.futureBlocks.Purge() @@ -1034,6 +1043,16 @@ func (bc *BlockChain) SnapSyncCommitHead(hash common.Hash) error { return nil } +// UpdateChasingHead update remote best chain head, used by DA check now. +func (bc *BlockChain) UpdateChasingHead(head *types.Header) { + bc.chasingHead.Store(head) +} + +// ChasingHead return the best chain head of peers. +func (bc *BlockChain) ChasingHead() *types.Header { + return bc.chasingHead.Load() +} + // Reset purges the entire blockchain, restoring it to its genesis state. func (bc *BlockChain) Reset() error { return bc.ResetWithGenesisBlock(bc.genesisBlock) @@ -1317,6 +1336,14 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ } } + // check DA after cancun + lastBlk := blockChain[len(blockChain)-1] + if bc.chainConfig.Parlia != nil && bc.chainConfig.IsCancun(lastBlk.Number(), lastBlk.Time()) { + if _, err := CheckDataAvailableInBatch(bc, blockChain); err != nil { + return 0, err + } + } + var ( stats = struct{ processed, ignored int32 }{} start = time.Now() @@ -1378,6 +1405,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ // Write all chain data to ancients. td := bc.GetTd(first.Hash(), first.NumberU64()) writeSize, err := rawdb.WriteAncientBlocks(bc.db, blockChain, receiptChain, td) + if err != nil { log.Error("Error importing chain data to ancients", "err", err) return 0, err @@ -1455,6 +1483,9 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ // Write all the data out into the database rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()) rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receiptChain[i]) + if bc.chainConfig.IsCancun(block.Number(), block.Time()) { + rawdb.WriteBlobSidecars(batch, block.Hash(), block.NumberU64(), block.Sidecars()) + } // Write everything belongs to the blocks into the database. So that // we can ensure all components of body is completed(body, receipts) @@ -1524,6 +1555,10 @@ func (bc *BlockChain) writeBlockWithoutState(block *types.Block, td *big.Int) (e batch := bc.db.NewBatch() rawdb.WriteTd(batch, block.Hash(), block.NumberU64(), td) rawdb.WriteBlock(batch, block) + // if cancun is enabled, here need to write sidecars too + if bc.chainConfig.IsCancun(block.Number(), block.Time()) { + rawdb.WriteBlobSidecars(batch, block.Hash(), block.NumberU64(), block.Sidecars()) + } if err := batch.Write(); err != nil { log.Crit("Failed to write block into disk", "err", err) } @@ -1566,6 +1601,10 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. rawdb.WriteTd(blockBatch, block.Hash(), block.NumberU64(), externTd) rawdb.WriteBlock(blockBatch, block) rawdb.WriteReceipts(blockBatch, block.Hash(), block.NumberU64(), receipts) + // if cancun is enabled, here need to write sidecars too + if bc.chainConfig.IsCancun(block.Number(), block.Time()) { + rawdb.WriteBlobSidecars(blockBatch, block.Hash(), block.NumberU64(), block.Sidecars()) + } rawdb.WritePreimages(blockBatch, state.Preimages()) if err := blockBatch.Write(); err != nil { log.Crit("Failed to write block into disk", "err", err) @@ -1828,6 +1867,14 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error) } } }() + + // check block data available first + if bc.chainConfig.Parlia != nil { + if index, err := CheckDataAvailableInBatch(bc, chain); err != nil { + return index, err + } + } + // Start the parallel header verifier headers := make([]*types.Header, len(chain)) for i, block := range chain { @@ -1985,6 +2032,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error) if parent == nil { parent = bc.GetHeader(block.ParentHash(), block.NumberU64()-1) } + statedb, err := state.NewWithSharedPool(parent.Root, bc.stateCache, bc.snaps) if err != nil { return it.index, err @@ -2008,7 +2056,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error) go throwaway.TriePrefetchInAdvance(block, signer) } - //Process block using the parent state as reference point + // Process block using the parent state as reference point if bc.pipeCommit { statedb.EnablePipeCommit() } @@ -2286,7 +2334,9 @@ func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (i if block == nil { log.Crit("Importing heavy sidechain block is nil", "hash", hashes[i], "number", numbers[i]) } - + if bc.chainConfig.IsCancun(block.Number(), block.Time()) { + block = block.WithSidecars(bc.GetSidecarsByHash(hashes[i])) + } blocks = append(blocks, block) memory += block.Size() @@ -2358,6 +2408,9 @@ func (bc *BlockChain) recoverAncestors(block *types.Block) (common.Hash, error) } else { b = bc.GetBlock(hashes[i], numbers[i]) } + if bc.chainConfig.IsCancun(b.Number(), b.Time()) { + b = b.WithSidecars(bc.GetSidecarsByHash(b.Hash())) + } if _, err := bc.insertChain(types.Blocks{b}, false); err != nil { return b.ParentHash(), err } @@ -2804,6 +2857,7 @@ func (bc *BlockChain) isCachedBadBlock(block *types.Block) bool { } // reportBlock logs a bad block error. +// bad block need not save receipts & sidecars. func (bc *BlockChain) reportBlock(block *types.Block, receipts types.Receipts, err error) { rawdb.WriteBadBlock(bc.db, block) log.Error(summarizeBadBlock(block, receipts, bc.Config(), err)) diff --git a/core/blockchain_reader.go b/core/blockchain_reader.go index 36cc1f5514..227da1eb69 100644 --- a/core/blockchain_reader.go +++ b/core/blockchain_reader.go @@ -247,6 +247,23 @@ func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts { return receipts } +// GetSidecarsByHash retrieves the sidecars for all transactions in a given block. +func (bc *BlockChain) GetSidecarsByHash(hash common.Hash) types.BlobSidecars { + if sidecars, ok := bc.sidecarsCache.Get(hash); ok { + return sidecars + } + number := rawdb.ReadHeaderNumber(bc.db, hash) + if number == nil { + return nil + } + sidecars := rawdb.ReadRawBlobSidecars(bc.db, hash, *number) + if sidecars == nil { + return nil + } + bc.sidecarsCache.Add(hash, sidecars) + return sidecars +} + // GetUnclesInChain retrieves all the uncles from a given block backwards until // a specific distance is reached. func (bc *BlockChain) GetUnclesInChain(block *types.Block, length int) []*types.Header { diff --git a/core/blockchain_test.go b/core/blockchain_test.go index e0b5a64f4b..43357713ef 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -17,6 +17,7 @@ package core import ( + "crypto/ecdsa" "errors" "fmt" "math/big" @@ -26,6 +27,10 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/consensus" @@ -3585,10 +3590,20 @@ func TestEIP2718TransitionWithTestChainConfig(t *testing.T) { testEIP2718TransitionWithConfig(t, rawdb.HashScheme, params.TestChainConfig) } +func preShanghaiConfig() *params.ChainConfig { + config := *params.ParliaTestChainConfig + config.ShanghaiTime = nil + config.KeplerTime = nil + config.FeynmanTime = nil + config.FeynmanFixTime = nil + config.CancunTime = nil + return &config +} + // TestEIP2718TransitionWithParliaConfig tests EIP-2718 with Parlia Config. func TestEIP2718TransitionWithParliaConfig(t *testing.T) { - testEIP2718TransitionWithConfig(t, rawdb.HashScheme, params.ParliaTestChainConfig) - testEIP2718TransitionWithConfig(t, rawdb.PathScheme, params.ParliaTestChainConfig) + testEIP2718TransitionWithConfig(t, rawdb.HashScheme, preShanghaiConfig()) + testEIP2718TransitionWithConfig(t, rawdb.PathScheme, preShanghaiConfig()) } // testEIP2718TransitionWithConfig tests EIP02718 with given ChainConfig. @@ -4418,3 +4433,134 @@ func TestEIP3651(t *testing.T) { t.Fatalf("sender balance incorrect: expected %d, got %d", expected, actual) } } + +type mockParlia struct { + consensus.Engine +} + +func (c *mockParlia) Author(header *types.Header) (common.Address, error) { + return header.Coinbase, nil +} + +func (c *mockParlia) VerifyUncles(chain consensus.ChainReader, block *types.Block) error { + return nil +} + +func (c *mockParlia) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header) error { + return nil +} + +func (c *mockParlia) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header) (chan<- struct{}, <-chan error) { + abort := make(chan<- struct{}) + results := make(chan error, len(headers)) + for i := 0; i < len(headers); i++ { + results <- nil + } + return abort, results +} + +func (c *mockParlia) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, _ *[]*types.Transaction, uncles []*types.Header, withdrawals []*types.Withdrawal, + _ *[]*types.Receipt, _ *[]*types.Transaction, _ *uint64) (err error) { + return +} + +func (c *mockParlia) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, + uncles []*types.Header, receipts []*types.Receipt, withdrawals []*types.Withdrawal) (*types.Block, []*types.Receipt, error) { + // Finalize block + c.Finalize(chain, header, state, &txs, uncles, nil, nil, nil, nil) + + // Assign the final state root to header. + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + + // Header seems complete, assemble into a block and return + return types.NewBlock(header, txs, uncles, receipts, trie.NewStackTrie(nil)), receipts, nil +} + +func (c *mockParlia) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, parent *types.Header) *big.Int { + return big.NewInt(1) +} + +func TestParliaBlobFeeReward(t *testing.T) { + // Have N headers in the freezer + frdir := t.TempDir() + db, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "", false, false, false, false) + if err != nil { + t.Fatalf("failed to create database with ancient backend") + } + config := params.ParliaTestChainConfig + gspec := &Genesis{ + Config: config, + Alloc: types.GenesisAlloc{testAddr: {Balance: new(big.Int).SetUint64(10 * params.Ether)}}, + } + engine := &mockParlia{} + chain, _ := NewBlockChain(db, nil, gspec, nil, engine, vm.Config{}, nil, nil) + signer := types.LatestSigner(config) + + _, bs, _ := GenerateChainWithGenesis(gspec, engine, 1, func(i int, gen *BlockGen) { + tx, _ := makeMockTx(config, signer, testKey, gen.TxNonce(testAddr), gen.BaseFee().Uint64(), eip4844.CalcBlobFee(gen.ExcessBlobGas()).Uint64(), false) + gen.AddTxWithChain(chain, tx) + tx, sidecar := makeMockTx(config, signer, testKey, gen.TxNonce(testAddr), gen.BaseFee().Uint64(), eip4844.CalcBlobFee(gen.ExcessBlobGas()).Uint64(), true) + gen.AddTxWithChain(chain, tx) + gen.AddBlobSidecar(&types.BlobSidecar{ + BlobTxSidecar: *sidecar, + TxIndex: 1, + TxHash: tx.Hash(), + }) + }) + if _, err := chain.InsertChain(bs); err != nil { + panic(err) + } + + stateDB, err := chain.State() + if err != nil { + panic(err) + } + expect := new(big.Int) + for _, block := range bs { + receipts := chain.GetReceiptsByHash(block.Hash()) + for _, receipt := range receipts { + if receipt.BlobGasPrice != nil { + blob := receipt.BlobGasPrice.Mul(receipt.BlobGasPrice, new(big.Int).SetUint64(receipt.BlobGasUsed)) + expect.Add(expect, blob) + } + plain := receipt.EffectiveGasPrice.Mul(receipt.EffectiveGasPrice, new(big.Int).SetUint64(receipt.GasUsed)) + expect.Add(expect, plain) + } + } + actual := stateDB.GetBalance(params.SystemAddress) + require.Equal(t, expect.Uint64(), actual.Uint64()) +} + +func makeMockTx(config *params.ChainConfig, signer types.Signer, key *ecdsa.PrivateKey, nonce uint64, baseFee uint64, blobBaseFee uint64, isBlobTx bool) (*types.Transaction, *types.BlobTxSidecar) { + if !isBlobTx { + raw := &types.DynamicFeeTx{ + ChainID: config.ChainID, + Nonce: nonce, + GasTipCap: big.NewInt(10), + GasFeeCap: new(big.Int).SetUint64(baseFee + 10), + Gas: params.TxGas, + To: &common.Address{0x00}, + Value: big.NewInt(0), + } + tx, _ := types.SignTx(types.NewTx(raw), signer, key) + return tx, nil + } + sidecar := &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof}, + } + raw := &types.BlobTx{ + ChainID: uint256.MustFromBig(config.ChainID), + Nonce: nonce, + GasTipCap: uint256.NewInt(10), + GasFeeCap: uint256.NewInt(baseFee + 10), + Gas: params.TxGas, + To: common.Address{0x00}, + Value: uint256.NewInt(0), + BlobFeeCap: uint256.NewInt(blobBaseFee), + BlobHashes: sidecar.BlobHashes(), + } + tx, _ := types.SignTx(types.NewTx(raw), signer, key) + return tx, sidecar +} diff --git a/core/chain_makers.go b/core/chain_makers.go index 263310929f..544b8d33f0 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -52,6 +52,9 @@ type BlockGen struct { withdrawals []*types.Withdrawal engine consensus.Engine + + // extra data of block + sidecars types.BlobSidecars } // SetCoinbase sets the coinbase of the generated block. @@ -171,6 +174,11 @@ func (b *BlockGen) AddUncheckedTx(tx *types.Transaction) { b.txs = append(b.txs, tx) } +// AddBlobSidecar add block's blob sidecar for DA checking. +func (b *BlockGen) AddBlobSidecar(sidecar *types.BlobSidecar) { + b.sidecars = append(b.sidecars, sidecar) +} + // Number returns the block number of the block being generated. func (b *BlockGen) Number() *big.Int { return new(big.Int).Set(b.header.Number) @@ -186,6 +194,15 @@ func (b *BlockGen) BaseFee() *big.Int { return new(big.Int).Set(b.header.BaseFee) } +// ExcessBlobGas returns the EIP-4844 ExcessBlobGas of the block. +func (b *BlockGen) ExcessBlobGas() uint64 { + excessBlobGas := b.header.ExcessBlobGas + if excessBlobGas == nil { + return 0 + } + return *excessBlobGas +} + // Gas returns the amount of gas left in the current block. func (b *BlockGen) Gas() uint64 { return b.header.GasLimit - b.header.GasUsed @@ -355,6 +372,13 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse if err != nil { panic(err) } + if config.IsCancun(block.Number(), block.Time()) { + for _, s := range b.sidecars { + s.BlockNumber = block.Number() + s.BlockHash = block.Hash() + } + block = block.WithSidecars(b.sidecars) + } // Write state changes to db root, _, err := statedb.Commit(b.header.Number.Uint64(), nil) @@ -456,6 +480,9 @@ func (cm *chainMaker) makeHeader(parent *types.Block, state *state.StateDB, engi excessBlobGas := eip4844.CalcExcessBlobGas(parentExcessBlobGas, parentBlobGasUsed) header.ExcessBlobGas = &excessBlobGas header.BlobGasUsed = new(uint64) + if cm.config.Parlia != nil { + header.WithdrawalsHash = new(common.Hash) + } if cm.config.Parlia == nil { header.ParentBeaconRoot = new(common.Hash) } @@ -590,3 +617,7 @@ func (cm *chainMaker) GetTd(hash common.Hash, number uint64) *big.Int { func (cm *chainMaker) GetHighestVerifiedHeader() *types.Header { panic("not supported") } + +func (cm *chainMaker) ChasingHead() *types.Header { + panic("not supported") +} diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index b46b898afb..a2ec9e6507 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -47,8 +47,8 @@ func TestGeneratePOSChain(t *testing.T) { gspec = &Genesis{ Config: &config, Alloc: types.GenesisAlloc{ - address: {Balance: funds}, - params.BeaconRootsStorageAddress: {Balance: common.Big0, Code: asm4788}, + address: {Balance: funds}, + params.BeaconRootsAddress: {Balance: common.Big0, Code: asm4788}, }, BaseFee: big.NewInt(params.InitialBaseFee), Difficulty: common.Big1, @@ -180,7 +180,7 @@ func TestGeneratePOSChain(t *testing.T) { } state, _ := blockchain.State() idx := block.Time()%8191 + 8191 - got := state.GetState(params.BeaconRootsStorageAddress, common.BigToHash(new(big.Int).SetUint64(idx))) + got := state.GetState(params.BeaconRootsAddress, common.BigToHash(new(big.Int).SetUint64(idx))) if got != want { t.Fatalf("block %d, wrong parent beacon root in state: got %s, want %s", i, got, want) } diff --git a/core/data_availability.go b/core/data_availability.go new file mode 100644 index 0000000000..bd807e3541 --- /dev/null +++ b/core/data_availability.go @@ -0,0 +1,154 @@ +package core + +import ( + "crypto/sha256" + "errors" + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/gopool" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +// validateBlobSidecar it is same as validateBlobSidecar in core/txpool/validation.go +func validateBlobSidecar(hashes []common.Hash, sidecar *types.BlobSidecar) error { + if len(sidecar.Blobs) != len(hashes) { + return fmt.Errorf("invalid number of %d blobs compared to %d blob hashes", len(sidecar.Blobs), len(hashes)) + } + if len(sidecar.Commitments) != len(hashes) { + return fmt.Errorf("invalid number of %d blob commitments compared to %d blob hashes", len(sidecar.Commitments), len(hashes)) + } + if len(sidecar.Proofs) != len(hashes) { + return fmt.Errorf("invalid number of %d blob proofs compared to %d blob hashes", len(sidecar.Proofs), len(hashes)) + } + // Blob quantities match up, validate that the provers match with the + // transaction hash before getting to the cryptography + hasher := sha256.New() + for i, vhash := range hashes { + computed := kzg4844.CalcBlobHashV1(hasher, &sidecar.Commitments[i]) + if vhash != computed { + return fmt.Errorf("blob %d: computed hash %#x mismatches transaction one %#x", i, computed, vhash) + } + } + // Blob commitments match with the hashes in the transaction, verify the + // blobs themselves via KZG + for i := range sidecar.Blobs { + if err := kzg4844.VerifyBlobProof(sidecar.Blobs[i], sidecar.Commitments[i], sidecar.Proofs[i]); err != nil { + return fmt.Errorf("invalid blob %d: %v", i, err) + } + } + return nil +} + +// IsDataAvailable it checks that the blobTx block has available blob data +func IsDataAvailable(chain consensus.ChainHeaderReader, block *types.Block) (err error) { + // refer logic in ValidateBody + if !chain.Config().IsCancun(block.Number(), block.Time()) { + if block.Sidecars() == nil { + return nil + } else { + return errors.New("sidecars present in block body before cancun") + } + } else if block.Sidecars() == nil { + return errors.New("missing sidecars in block body after cancun") + } + + // only required to check within MinBlocksForBlobRequests block's DA + highest := chain.ChasingHead() + current := chain.CurrentHeader() + if highest == nil || highest.Number.Cmp(current.Number) < 0 { + highest = current + } + defer func() { + log.Info("IsDataAvailable", "block", block.Number(), "hash", block.Hash(), "highest", highest.Number, "sidecars", len(block.Sidecars()), "err", err) + }() + if block.NumberU64()+params.MinBlocksForBlobRequests < highest.Number.Uint64() { + // if we needn't check DA of this block, just clean it + block.CleanSidecars() + return nil + } + + sidecars := block.Sidecars() + for _, s := range sidecars { + if err := s.SanityCheck(block.Number(), block.Hash()); err != nil { + return err + } + } + // alloc block's blobTx + blobTxs := make([]*types.Transaction, 0, len(sidecars)) + blobTxIndexes := make([]uint64, 0, len(sidecars)) + for i, tx := range block.Transactions() { + if tx.Type() != types.BlobTxType { + continue + } + blobTxs = append(blobTxs, tx) + blobTxIndexes = append(blobTxIndexes, uint64(i)) + } + if len(blobTxs) != len(sidecars) { + return fmt.Errorf("blob info mismatch: sidecars %d, versionedHashes:%d", len(sidecars), len(blobTxs)) + } + + // check blob amount + blobCnt := 0 + for _, s := range sidecars { + blobCnt += len(s.Blobs) + } + if blobCnt > params.MaxBlobGasPerBlock/params.BlobTxBlobGasPerBlob { + return fmt.Errorf("too many blobs in block: have %d, permitted %d", blobCnt, params.MaxBlobGasPerBlock/params.BlobTxBlobGasPerBlob) + } + + // check blob and versioned hash + for i, tx := range blobTxs { + // check sidecar tx related + if sidecars[i].TxHash != tx.Hash() { + return fmt.Errorf("sidecar's TxHash mismatch with expected transaction, want: %v, have: %v", sidecars[i].TxHash, tx.Hash()) + } + if sidecars[i].TxIndex != blobTxIndexes[i] { + return fmt.Errorf("sidecar's TxIndex mismatch with expected transaction, want: %v, have: %v", sidecars[i].TxIndex, blobTxIndexes[i]) + } + if err := validateBlobSidecar(tx.BlobHashes(), sidecars[i]); err != nil { + return err + } + } + + return nil +} + +func CheckDataAvailableInBatch(chainReader consensus.ChainHeaderReader, chain types.Blocks) (int, error) { + if len(chain) == 1 { + return 0, IsDataAvailable(chainReader, chain[0]) + } + + var ( + wg sync.WaitGroup + errs sync.Map + ) + + for i := range chain { + wg.Add(1) + func(index int, block *types.Block) { + gopool.Submit(func() { + defer wg.Done() + errs.Store(index, IsDataAvailable(chainReader, block)) + }) + }(i, chain[i]) + } + + wg.Wait() + for i := range chain { + val, exist := errs.Load(i) + if !exist || val == nil { + continue + } + err := val.(error) + if err != nil { + return i, err + } + } + return 0, nil +} diff --git a/core/data_availability_test.go b/core/data_availability_test.go new file mode 100644 index 0000000000..153f9b948b --- /dev/null +++ b/core/data_availability_test.go @@ -0,0 +1,350 @@ +package core + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" + "github.com/stretchr/testify/require" +) + +var ( + emptyBlob = kzg4844.Blob{} + emptyBlobCommit, _ = kzg4844.BlobToCommitment(emptyBlob) + emptyBlobProof, _ = kzg4844.ComputeBlobProof(emptyBlob, emptyBlobCommit) +) + +func TestIsDataAvailable(t *testing.T) { + hr := NewMockDAHeaderReader(params.ParliaTestChainConfig) + tests := []struct { + block *types.Block + chasingHead uint64 + withSidecar bool + err bool + }{ + { + block: types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + }, nil), + chasingHead: 1, + withSidecar: true, + err: false, + }, + { + block: types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), nil), + }, nil), + chasingHead: 1, + withSidecar: true, + err: false, + }, + { + block: types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + }, nil), + chasingHead: 1, + withSidecar: false, + err: true, + }, + { + block: types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof}, + }), + }, nil), + chasingHead: 1, + withSidecar: true, + err: false, + }, + + { + block: types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob, emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit, emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof, emptyBlobProof, emptyBlobProof}, + }), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob, emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit, emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof, emptyBlobProof, emptyBlobProof}, + }), + }, nil), + chasingHead: params.MinBlocksForBlobRequests + 1, + withSidecar: true, + err: true, + }, + { + block: types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(0), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + }, nil), + chasingHead: params.MinBlocksForBlobRequests + 1, + withSidecar: false, + err: true, + }, + } + + for i, item := range tests { + if item.withSidecar { + item.block = item.block.WithSidecars(collectBlobsFromTxs(item.block.Header(), item.block.Transactions())) + } + hr.setChasingHead(item.chasingHead) + err := IsDataAvailable(hr, item.block) + if item.err { + require.Error(t, err, i) + t.Log(err) + continue + } + require.NoError(t, err, i) + } +} + +func TestCheckDataAvailableInBatch(t *testing.T) { + hr := NewMockDAHeaderReader(params.ParliaTestChainConfig) + tests := []struct { + chain types.Blocks + err bool + index int + }{ + { + chain: types.Blocks{ + types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof}, + }), + }, nil), + types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(2), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof}, + }), + }, nil), + }, + err: false, + }, + { + chain: types.Blocks{ + types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + }, nil), + types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(2), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + }, nil), + types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(3), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }), + }, nil), + }, + err: true, + index: 1, + }, + { + chain: types.Blocks{ + types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), + }).WithBody(types.Transactions{ + createMockDATx(hr.Config(), nil), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob, emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit, emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof, emptyBlobProof, emptyBlobProof}, + }), + createMockDATx(hr.Config(), &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob, emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit, emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof, emptyBlobProof, emptyBlobProof}, + }), + }, nil), + }, + err: true, + index: 0, + }, + } + + for i, item := range tests { + for j, block := range item.chain { + item.chain[j] = block.WithSidecars(collectBlobsFromTxs(block.Header(), block.Transactions())) + } + index, err := CheckDataAvailableInBatch(hr, item.chain) + if item.err { + t.Log(index, err) + require.Error(t, err, i) + require.Equal(t, item.index, index, i) + continue + } + require.NoError(t, err, i) + } +} + +func collectBlobsFromTxs(header *types.Header, txs types.Transactions) types.BlobSidecars { + sidecars := make(types.BlobSidecars, 0, len(txs)) + for i, tx := range txs { + sidecar := types.NewBlobSidecarFromTx(tx) + if sidecar == nil { + continue + } + sidecar.TxIndex = uint64(i) + sidecar.TxHash = tx.Hash() + sidecar.BlockNumber = header.Number + sidecar.BlockHash = header.Hash() + sidecars = append(sidecars, sidecar) + } + return sidecars +} + +type mockDAHeaderReader struct { + config *params.ChainConfig + chasingHead uint64 +} + +func NewMockDAHeaderReader(config *params.ChainConfig) *mockDAHeaderReader { + return &mockDAHeaderReader{ + config: config, + chasingHead: 0, + } +} + +func (r *mockDAHeaderReader) setChasingHead(h uint64) { + r.chasingHead = h +} + +func (r *mockDAHeaderReader) Config() *params.ChainConfig { + return r.config +} + +func (r *mockDAHeaderReader) CurrentHeader() *types.Header { + return &types.Header{ + Number: new(big.Int).SetUint64(r.chasingHead), + } +} + +func (r *mockDAHeaderReader) ChasingHead() *types.Header { + return &types.Header{ + Number: new(big.Int).SetUint64(r.chasingHead), + } +} + +func (r *mockDAHeaderReader) GenesisHeader() *types.Header { + panic("not supported") +} + +func (r *mockDAHeaderReader) GetHeader(hash common.Hash, number uint64) *types.Header { + panic("not supported") +} + +func (r *mockDAHeaderReader) GetHeaderByNumber(number uint64) *types.Header { + panic("not supported") +} + +func (r *mockDAHeaderReader) GetHeaderByHash(hash common.Hash) *types.Header { + panic("not supported") +} + +func (r *mockDAHeaderReader) GetTd(hash common.Hash, number uint64) *big.Int { + panic("not supported") +} + +func (r *mockDAHeaderReader) GetHighestVerifiedHeader() *types.Header { + panic("not supported") +} + +func createMockDATx(config *params.ChainConfig, sidecar *types.BlobTxSidecar) *types.Transaction { + if sidecar == nil { + tx := &types.DynamicFeeTx{ + ChainID: config.ChainID, + Nonce: 0, + GasTipCap: big.NewInt(22), + GasFeeCap: big.NewInt(5), + Gas: 25000, + To: &common.Address{0x03, 0x04, 0x05}, + Value: big.NewInt(99), + Data: make([]byte, 50), + } + return types.NewTx(tx) + } + tx := &types.BlobTx{ + ChainID: uint256.MustFromBig(config.ChainID), + Nonce: 5, + GasTipCap: uint256.NewInt(22), + GasFeeCap: uint256.NewInt(5), + Gas: 25000, + To: common.Address{0x03, 0x04, 0x05}, + Value: uint256.NewInt(99), + Data: make([]byte, 50), + BlobFeeCap: uint256.NewInt(15), + BlobHashes: sidecar.BlobHashes(), + Sidecar: sidecar, + } + return types.NewTx(tx) +} diff --git a/core/eip3529tests/eip3529_parlia_test.go b/core/eip3529tests/eip3529_parlia_test.go index 517b39d057..a5b86e162d 100644 --- a/core/eip3529tests/eip3529_parlia_test.go +++ b/core/eip3529tests/eip3529_parlia_test.go @@ -9,8 +9,13 @@ import ( "github.com/ethereum/go-ethereum/params" ) -func postHertzConfig() *params.ChainConfig { +func postHertzPreShanghaiConfig() *params.ChainConfig { config := *params.ParliaTestChainConfig + config.ShanghaiTime = nil + config.KeplerTime = nil + config.FeynmanTime = nil + config.FeynmanFixTime = nil + config.CancunTime = nil return &config } @@ -20,6 +25,11 @@ func preHertzConfig() *params.ChainConfig { config.BerlinBlock = nil config.HertzBlock = nil config.HertzfixBlock = nil + config.ShanghaiTime = nil + config.KeplerTime = nil + config.FeynmanTime = nil + config.FeynmanFixTime = nil + config.CancunTime = nil return &config } @@ -91,7 +101,7 @@ func TestSelfDestructGasPostHertz(t *testing.T) { // Expected gas is intrinsic + pc + cold load (due to legacy tx) + SelfDestructGas // i.e. No refund expectedGasUsed := params.TxGas + vm.GasQuickStep + params.ColdAccountAccessCostEIP2929 + params.SelfdestructGasEIP150 - TestGasUsage(t, postHertzConfig(), ethash.NewFaker(), bytecode, nil, 60_000, expectedGasUsed) + TestGasUsage(t, postHertzPreShanghaiConfig(), ethash.NewFaker(), bytecode, nil, 60_000, expectedGasUsed) } func TestSstoreGasPostHertz(t *testing.T) { @@ -103,7 +113,7 @@ func TestSstoreGasPostHertz(t *testing.T) { // Expected gas is intrinsic + 2*pushGas + cold load (due to legacy tx) + SstoreGas // i.e. No refund expectedGasUsed := params.TxGas + 2*vm.GasFastestStep + params.ColdSloadCostEIP2929 + params.SstoreSetGasEIP2200 - TestGasUsage(t, postHertzConfig(), ethash.NewFaker(), bytecode, nil, 60_000, expectedGasUsed) + TestGasUsage(t, postHertzPreShanghaiConfig(), ethash.NewFaker(), bytecode, nil, 60_000, expectedGasUsed) } func TestSstoreModifyGasPostHertz(t *testing.T) { @@ -120,7 +130,7 @@ func TestSstoreModifyGasPostHertz(t *testing.T) { // Expected gas is intrinsic + 2*pushGas + cold load (due to legacy tx) + SstoreReset (a->b such that a!=0) // i.e. No refund expectedGasUsed := params.TxGas + 2*vm.GasFastestStep + params.SstoreResetGasEIP2200 - TestGasUsage(t, postHertzConfig(), ethash.NewFaker(), bytecode, initialStorage, 60_000, expectedGasUsed) + TestGasUsage(t, postHertzPreShanghaiConfig(), ethash.NewFaker(), bytecode, initialStorage, 60_000, expectedGasUsed) } func TestSstoreClearGasPostHertz(t *testing.T) { @@ -137,5 +147,5 @@ func TestSstoreClearGasPostHertz(t *testing.T) { // Expected gas is intrinsic + 2*pushGas + SstoreReset (a->b such that a!=0) - sstoreClearGasRefund expectedGasUsage := params.TxGas + 2*vm.GasFastestStep + params.SstoreResetGasEIP2200 - params.SstoreClearsScheduleRefundEIP3529 - TestGasUsage(t, postHertzConfig(), ethash.NewFaker(), bytecode, initialStorage, 60_000, expectedGasUsage) + TestGasUsage(t, postHertzPreShanghaiConfig(), ethash.NewFaker(), bytecode, initialStorage, 60_000, expectedGasUsage) } diff --git a/core/gen_genesis.go b/core/gen_genesis.go index b8acf9df7c..2028f98edc 100644 --- a/core/gen_genesis.go +++ b/core/gen_genesis.go @@ -19,21 +19,21 @@ var _ = (*genesisSpecMarshaling)(nil) // MarshalJSON marshals as JSON. func (g Genesis) MarshalJSON() ([]byte, error) { type Genesis struct { - Config *params.ChainConfig `json:"config"` - Nonce math.HexOrDecimal64 `json:"nonce"` - Timestamp math.HexOrDecimal64 `json:"timestamp"` - ExtraData hexutil.Bytes `json:"extraData"` - GasLimit math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` - Difficulty *math.HexOrDecimal256 `json:"difficulty" gencodec:"required"` - Mixhash common.Hash `json:"mixHash"` - Coinbase common.Address `json:"coinbase"` + Config *params.ChainConfig `json:"config"` + Nonce math.HexOrDecimal64 `json:"nonce"` + Timestamp math.HexOrDecimal64 `json:"timestamp"` + ExtraData hexutil.Bytes `json:"extraData"` + GasLimit math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` + Difficulty *math.HexOrDecimal256 `json:"difficulty" gencodec:"required"` + Mixhash common.Hash `json:"mixHash"` + Coinbase common.Address `json:"coinbase"` Alloc map[common.UnprefixedAddress]types.Account `json:"alloc" gencodec:"required"` - Number math.HexOrDecimal64 `json:"number"` - GasUsed math.HexOrDecimal64 `json:"gasUsed"` - ParentHash common.Hash `json:"parentHash"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` - BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` + Number math.HexOrDecimal64 `json:"number"` + GasUsed math.HexOrDecimal64 `json:"gasUsed"` + ParentHash common.Hash `json:"parentHash"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` + ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` + BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` } var enc Genesis enc.Config = g.Config @@ -62,21 +62,21 @@ func (g Genesis) MarshalJSON() ([]byte, error) { // UnmarshalJSON unmarshals from JSON. func (g *Genesis) UnmarshalJSON(input []byte) error { type Genesis struct { - Config *params.ChainConfig `json:"config"` - Nonce *math.HexOrDecimal64 `json:"nonce"` - Timestamp *math.HexOrDecimal64 `json:"timestamp"` - ExtraData *hexutil.Bytes `json:"extraData"` - GasLimit *math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` - Difficulty *math.HexOrDecimal256 `json:"difficulty" gencodec:"required"` - Mixhash *common.Hash `json:"mixHash"` - Coinbase *common.Address `json:"coinbase"` + Config *params.ChainConfig `json:"config"` + Nonce *math.HexOrDecimal64 `json:"nonce"` + Timestamp *math.HexOrDecimal64 `json:"timestamp"` + ExtraData *hexutil.Bytes `json:"extraData"` + GasLimit *math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` + Difficulty *math.HexOrDecimal256 `json:"difficulty" gencodec:"required"` + Mixhash *common.Hash `json:"mixHash"` + Coinbase *common.Address `json:"coinbase"` Alloc map[common.UnprefixedAddress]types.Account `json:"alloc" gencodec:"required"` - Number *math.HexOrDecimal64 `json:"number"` - GasUsed *math.HexOrDecimal64 `json:"gasUsed"` - ParentHash *common.Hash `json:"parentHash"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` - BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` + Number *math.HexOrDecimal64 `json:"number"` + GasUsed *math.HexOrDecimal64 `json:"gasUsed"` + ParentHash *common.Hash `json:"parentHash"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` + ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` + BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` } var dec Genesis if err := json.Unmarshal(input, &dec); err != nil { diff --git a/core/genesis.go b/core/genesis.go index d0ec4e0f77..09f9c6757c 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -216,11 +216,10 @@ func (e *GenesisMismatchError) Error() string { // ChainOverrides contains the changes to chain config // Typically, these modifications involve hardforks that are not enabled on the BSC mainnet, intended for testing purposes. type ChainOverrides struct { - OverrideShanghai *uint64 - OverrideKepler *uint64 - OverrideCancun *uint64 - OverrideVerkle *uint64 - OverrideFeynman *uint64 + OverrideCancun *uint64 + OverrideVerkle *uint64 + OverrideFeynman *uint64 + OverrideFeynmanFix *uint64 } // SetupGenesisBlock writes or updates the genesis block in db. @@ -246,12 +245,6 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *triedb.Database, g } applyOverrides := func(config *params.ChainConfig) { if config != nil { - if overrides != nil && overrides.OverrideShanghai != nil { - config.ShanghaiTime = overrides.OverrideShanghai - } - if overrides != nil && overrides.OverrideKepler != nil { - config.KeplerTime = overrides.OverrideKepler - } if overrides != nil && overrides.OverrideCancun != nil { config.CancunTime = overrides.OverrideCancun } @@ -261,6 +254,9 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *triedb.Database, g if overrides != nil && overrides.OverrideFeynman != nil { config.FeynmanTime = overrides.OverrideFeynman } + if overrides != nil && overrides.OverrideFeynmanFix != nil { + config.FeynmanFixTime = overrides.OverrideFeynmanFix + } } } // Just commit the new block if there is no stored genesis block. @@ -285,7 +281,7 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *triedb.Database, g // is initialized with an external ancient store. Commit genesis state // in this case. header := rawdb.ReadHeader(db, stored, 0) - if header.Root != types.EmptyRootHash && !triedb.Initialized(header.Root) { + if header.Root != types.EmptyRootHash && !triedb.Initialized(header.Root) && !triedb.Config().NoTries { if genesis == nil { genesis = DefaultBSCGenesisBlock() } @@ -449,6 +445,10 @@ func (g *Genesis) ToBlock() *types.Block { withdrawals = make([]*types.Withdrawal, 0) } if conf.IsCancun(num, g.Timestamp) { + if conf.Parlia != nil { + head.WithdrawalsHash = new(common.Hash) + } + // EIP-4788: The parentBeaconBlockRoot of the genesis block is always // the zero hash. This is because the genesis block does not have a parent // by definition. diff --git a/core/headerchain.go b/core/headerchain.go index 93aad2b56b..2aa507d6ae 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -436,6 +436,10 @@ func (hc *HeaderChain) GetHighestVerifiedHeader() *types.Header { return nil } +func (hc *HeaderChain) ChasingHead() *types.Header { + return nil +} + // GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or // a close ancestor of it is canonical. maxNonCanonical points to a downwards counter limiting the // number of blocks to be individually checked before we reach the canonical chain. diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index 1a7552d698..9cd37899dd 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -360,6 +360,20 @@ func ReadHeader(db ethdb.Reader, hash common.Hash, number uint64) *types.Header return header } +// ReadHeaderAndRaw retrieves the block header corresponding to the hash. +func ReadHeaderAndRaw(db ethdb.Reader, hash common.Hash, number uint64) (*types.Header, rlp.RawValue) { + data := ReadHeaderRLP(db, hash, number) + if len(data) == 0 { + return nil, nil + } + header := new(types.Header) + if err := rlp.DecodeBytes(data, header); err != nil { + log.Error("Invalid block header RLP", "hash", hash, "err", err) + return nil, nil + } + return header, data +} + // WriteHeader stores a block header into the database and also stores the hash- // to-number mapping. func WriteHeader(db ethdb.KeyValueWriter, header *types.Header) { @@ -786,6 +800,20 @@ func WriteBlock(db ethdb.KeyValueWriter, block *types.Block) { // WriteAncientBlocks writes entire block data into ancient store and returns the total written size. func WriteAncientBlocks(db ethdb.AncientWriter, blocks []*types.Block, receipts []types.Receipts, td *big.Int) (int64, error) { + cancunIndex := -1 + for i, block := range blocks { + if block.Sidecars() != nil { + cancunIndex = i + break + } + } + log.Info("WriteAncientBlocks", "startAt", blocks[0].Number(), "cancunIndex", cancunIndex, "len", len(blocks)) + if cancunIndex >= 0 { + if err := ResetEmptyBlobAncientTable(db, blocks[cancunIndex].NumberU64()); err != nil { + return 0, err + } + } + var ( tdSum = new(big.Int).Set(td) stReceipts []*types.ReceiptForStorage @@ -809,6 +837,56 @@ func WriteAncientBlocks(db ethdb.AncientWriter, blocks []*types.Block, receipts }) } +// ReadBlobSidecarsRLP retrieves all the transaction blobs belonging to a block in RLP encoding. +func ReadBlobSidecarsRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + var data []byte + db.ReadAncients(func(reader ethdb.AncientReaderOp) error { + // Check if the data is in ancients + if isCanon(reader, number, hash) { + data, _ = reader.Ancient(ChainFreezerBlobSidecarTable, number) + return nil + } + // If not, try reading from leveldb + data, _ = db.Get(blockBlobSidecarsKey(number, hash)) + return nil + }) + return data +} + +// ReadRawBlobSidecars retrieves all the transaction blobs belonging to a block. +func ReadRawBlobSidecars(db ethdb.Reader, hash common.Hash, number uint64) types.BlobSidecars { + data := ReadBlobSidecarsRLP(db, hash, number) + if len(data) == 0 { + return nil + } + var ret types.BlobSidecars + if err := rlp.DecodeBytes(data, &ret); err != nil { + log.Error("Invalid blob array RLP", "hash", hash, "err", err) + return nil + } + return ret +} + +// WriteBlobSidecars stores all the transaction blobs belonging to a block. +// It could input nil for empty blobs. +func WriteBlobSidecars(db ethdb.KeyValueWriter, hash common.Hash, number uint64, blobs types.BlobSidecars) { + data, err := rlp.EncodeToBytes(blobs) + if err != nil { + log.Crit("Failed to encode block blobs", "err", err) + } + // Store the flattened receipt slice + if err := db.Put(blockBlobSidecarsKey(number, hash), data); err != nil { + log.Crit("Failed to store block blobs", "err", err) + } +} + +// DeleteBlobSidecars removes all blob data associated with a block hash. +func DeleteBlobSidecars(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + if err := db.Delete(blockBlobSidecarsKey(number, hash)); err != nil { + log.Crit("Failed to delete block blobs", "err", err) + } +} + func writeAncientBlock(op ethdb.AncientWriteOp, block *types.Block, header *types.Header, receipts []*types.ReceiptForStorage, td *big.Int) error { num := block.NumberU64() if err := op.AppendRaw(ChainFreezerHashTable, num, block.Hash().Bytes()); err != nil { @@ -826,6 +904,11 @@ func writeAncientBlock(op ethdb.AncientWriteOp, block *types.Block, header *type if err := op.Append(ChainFreezerDifficultyTable, num, td); err != nil { return fmt.Errorf("can't append block %d total difficulty: %v", num, err) } + if block.Sidecars() != nil { + if err := op.Append(ChainFreezerBlobSidecarTable, num, block.Sidecars()); err != nil { + return fmt.Errorf("can't append block %d blobs: %v", num, err) + } + } return nil } @@ -835,6 +918,7 @@ func DeleteBlock(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { DeleteHeader(db, hash, number) DeleteBody(db, hash, number) DeleteTd(db, hash, number) + DeleteBlobSidecars(db, hash, number) // it is safe to delete non-exist blob } // DeleteBlockWithoutNumber removes all block data associated with a hash, except @@ -844,6 +928,7 @@ func DeleteBlockWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number deleteHeaderWithoutNumber(db, hash, number) DeleteBody(db, hash, number) DeleteTd(db, hash, number) + DeleteBlobSidecars(db, hash, number) } const badBlockToKeep = 10 diff --git a/core/rawdb/accessors_chain_test.go b/core/rawdb/accessors_chain_test.go index 6b93e3d66e..01f5a823ba 100644 --- a/core/rawdb/accessors_chain_test.go +++ b/core/rawdb/accessors_chain_test.go @@ -18,14 +18,21 @@ package rawdb import ( "bytes" + rand2 "crypto/rand" "encoding/hex" "fmt" + "io" "math/big" "math/rand" "os" "reflect" "testing" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/holiman/uint256" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -412,6 +419,62 @@ func TestBlockReceiptStorage(t *testing.T) { } } +func TestBlockBlobSidecarsStorage(t *testing.T) { + db := NewMemoryDatabase() + + // Create a live block since we need metadata to reconstruct the receipt + genBlobs := makeBlkSidecars(1, 2) + tx1 := types.NewTx(&types.BlobTx{ + ChainID: new(uint256.Int).SetUint64(1), + GasTipCap: new(uint256.Int), + GasFeeCap: new(uint256.Int), + Gas: 0, + Value: new(uint256.Int), + Data: nil, + BlobFeeCap: new(uint256.Int), + BlobHashes: []common.Hash{common.HexToHash("0x34ec6e64f9cda8fe0451a391e4798085a3ef51a65ed1bfb016e34fc1a2028f8f"), common.HexToHash("0xb9a412e875f29fac436acde234f954e91173c4cf79814f6dcf630d8a6345747f")}, + Sidecar: genBlobs[0], + V: new(uint256.Int), + R: new(uint256.Int), + S: new(uint256.Int), + }) + tx2 := types.NewTx(&types.DynamicFeeTx{ + ChainID: new(big.Int).SetUint64(1), + GasTipCap: new(big.Int), + GasFeeCap: new(big.Int), + Gas: 0, + Value: new(big.Int), + Data: nil, + V: new(big.Int), + R: new(big.Int), + S: new(big.Int), + }) + + blkHash := common.BytesToHash([]byte{0x03, 0x14}) + body := &types.Body{Transactions: types.Transactions{tx1, tx2}} + sidecars := types.BlobSidecars{types.NewBlobSidecarFromTx(tx1)} + + // Check that no sidecars entries are in a pristine database + if bs := ReadRawBlobSidecars(db, blkHash, 0); len(bs) != 0 { + t.Fatalf("non existent sidecars returned: %v", bs) + } + WriteBody(db, blkHash, 0, body) + WriteBlobSidecars(db, blkHash, 0, sidecars) + + if bs := ReadRawBlobSidecars(db, blkHash, 0); len(bs) == 0 { + t.Fatalf("no sidecars returned") + } else { + if err := checkBlobSidecarsRLP(bs, sidecars); err != nil { + t.Fatalf(err.Error()) + } + } + + DeleteBlobSidecars(db, blkHash, 0) + if bs := ReadRawBlobSidecars(db, blkHash, 0); len(bs) != 0 { + t.Fatalf("deleted sidecars returned: %v", bs) + } +} + func checkReceiptsRLP(have, want types.Receipts) error { if len(have) != len(want) { return fmt.Errorf("receipts sizes mismatch: have %d, want %d", len(have), len(want)) @@ -432,6 +495,26 @@ func checkReceiptsRLP(have, want types.Receipts) error { return nil } +func checkBlobSidecarsRLP(have, want types.BlobSidecars) error { + if len(have) != len(want) { + return fmt.Errorf("blobs sizes mismatch: have %d, want %d", len(have), len(want)) + } + for i := 0; i < len(want); i++ { + rlpHave, err := rlp.EncodeToBytes(have[i]) + if err != nil { + return err + } + rlpWant, err := rlp.EncodeToBytes(want[i]) + if err != nil { + return err + } + if !bytes.Equal(rlpHave, rlpWant) { + return fmt.Errorf("blob #%d: receipt mismatch: have %s, want %s", i, hex.EncodeToString(rlpHave), hex.EncodeToString(rlpWant)) + } + } + return nil +} + func TestAncientStorage(t *testing.T) { // Freezer style fast import the chain. frdir := t.TempDir() @@ -465,7 +548,8 @@ func TestAncientStorage(t *testing.T) { } // Write and verify the header in the database - WriteAncientBlocks(db, []*types.Block{block}, []types.Receipts{nil}, big.NewInt(100)) + _, err = WriteAncientBlocks(db, []*types.Block{block}, []types.Receipts{nil}, big.NewInt(100)) + require.NoError(t, err) if blob := ReadHeaderRLP(db, hash, number); len(blob) == 0 { t.Fatalf("no header returned") @@ -586,6 +670,7 @@ func BenchmarkWriteAncientBlocks(b *testing.B) { const blockTxs = 20 allBlocks := makeTestBlocks(b.N, blockTxs) batchReceipts := makeTestReceipts(batchSize, blockTxs) + batchSidecars := makeTestSidecars(batchSize, blockTxs) b.ResetTimer() // The benchmark loop writes batches of blocks, but note that the total block count is @@ -601,6 +686,9 @@ func BenchmarkWriteAncientBlocks(b *testing.B) { blocks := allBlocks[i : i+length] receipts := batchReceipts[:length] + for j := 0; j < length; j++ { + blocks[i+j].WithSidecars(batchSidecars[j]) + } writeSize, err := WriteAncientBlocks(db, blocks, receipts, td) if err != nil { b.Fatal(err) @@ -663,6 +751,43 @@ func makeTestReceipts(n int, nPerBlock int) []types.Receipts { return allReceipts } +func makeBlkSidecars(n, nPerTx int) []*types.BlobTxSidecar { + if n <= 0 { + return nil + } + ret := make([]*types.BlobTxSidecar, n) + for i := 0; i < n; i++ { + blobs := make([]kzg4844.Blob, nPerTx) + commitments := make([]kzg4844.Commitment, nPerTx) + proofs := make([]kzg4844.Proof, nPerTx) + for i := 0; i < nPerTx; i++ { + io.ReadFull(rand2.Reader, blobs[i][:]) + commitments[i], _ = kzg4844.BlobToCommitment(blobs[i]) + proofs[i], _ = kzg4844.ComputeBlobProof(blobs[i], commitments[i]) + } + ret[i] = &types.BlobTxSidecar{ + Blobs: blobs, + Commitments: commitments, + Proofs: proofs, + } + } + return ret +} + +// makeTestSidecars creates fake blobs for the ancient write benchmark. +func makeTestSidecars(n int, nPerBlock int) []types.BlobSidecars { + allBlobs := make([]types.BlobSidecars, n) + for i := 0; i < n; i++ { + raws := makeBlkSidecars(nPerBlock, i%3) + var sidecars types.BlobSidecars + for _, s := range raws { + sidecars = append(sidecars, &types.BlobSidecar{BlobTxSidecar: *s}) + } + allBlobs[i] = sidecars + } + return allBlobs +} + type fullLogRLP struct { Address common.Address Topics []common.Hash diff --git a/core/rawdb/accessors_trie.go b/core/rawdb/accessors_trie.go index 35ede96643..886c1c469b 100644 --- a/core/rawdb/accessors_trie.go +++ b/core/rawdb/accessors_trie.go @@ -324,7 +324,7 @@ func ValidateStateScheme(stateScheme string) bool { // the stored state. // // - If the provided scheme is none, use the scheme consistent with persistent -// state, or fallback to hash-based scheme if state is empty. +// state, or fallback to path-based scheme if state is empty. // // - If the provided scheme is hash, use hash-based scheme or error out if not // compatible with persistent state scheme. @@ -338,10 +338,8 @@ func ParseStateScheme(provided string, disk ethdb.Database) (string, error) { stored := ReadStateScheme(disk) if provided == "" { if stored == "" { - // use default scheme for empty database, flip it when - // path mode is chosen as default - log.Info("State scheme set to default", "scheme", "hash") - return HashScheme, nil + log.Info("State scheme set to default", "scheme", "path") + return PathScheme, nil // use default scheme for empty database } log.Info("State scheme set to already existing disk db", "scheme", stored) return stored, nil // reuse scheme of persistent scheme diff --git a/core/rawdb/ancient_scheme.go b/core/rawdb/ancient_scheme.go index 2dc1eae24f..ee71dc7cd6 100644 --- a/core/rawdb/ancient_scheme.go +++ b/core/rawdb/ancient_scheme.go @@ -34,18 +34,24 @@ const ( // ChainFreezerDifficultyTable indicates the name of the freezer total difficulty table. ChainFreezerDifficultyTable = "diffs" + + // ChainFreezerBlobSidecarTable indicates the name of the freezer total blob table. + ChainFreezerBlobSidecarTable = "blobs" ) // chainFreezerNoSnappy configures whether compression is disabled for the ancient-tables. // Hashes and difficulties don't compress well. var chainFreezerNoSnappy = map[string]bool{ - ChainFreezerHeaderTable: false, - ChainFreezerHashTable: true, - ChainFreezerBodiesTable: false, - ChainFreezerReceiptTable: false, - ChainFreezerDifficultyTable: true, + ChainFreezerHeaderTable: false, + ChainFreezerHashTable: true, + ChainFreezerBodiesTable: false, + ChainFreezerReceiptTable: false, + ChainFreezerDifficultyTable: true, + ChainFreezerBlobSidecarTable: false, } +var additionTables = []string{ChainFreezerBlobSidecarTable} + const ( // stateHistoryTableSize defines the maximum size of freezer data files. stateHistoryTableSize = 2 * 1000 * 1000 * 1000 diff --git a/core/rawdb/chain_freezer.go b/core/rawdb/chain_freezer.go index c0bd64ef08..2da59a3960 100644 --- a/core/rawdb/chain_freezer.go +++ b/core/rawdb/chain_freezer.go @@ -18,10 +18,13 @@ package rawdb import ( "fmt" + "math/big" "sync" "sync/atomic" "time" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" @@ -49,6 +52,8 @@ type chainFreezer struct { quit chan struct{} wg sync.WaitGroup trigger chan chan struct{} // Manual blocking freeze trigger, test determinism + + freezeEnv atomic.Value } // newChainFreezer initializes the freezer for ancient chain data. @@ -156,7 +161,8 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore) { if limit-first > freezerBatchLimit { limit = first + freezerBatchLimit } - ancients, err := f.freezeRange(nfdb, first, limit) + + ancients, err := f.freezeRangeWithBlobs(nfdb, first, limit) if err != nil { log.Error("Error in block freeze operation", "err", err) backoff = true @@ -243,6 +249,12 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore) { } log.Debug("Deep froze chain segment", context...) + env, _ := f.freezeEnv.Load().(*ethdb.FreezerEnv) + // try prune blob data after cancun fork + if isCancun(env, head.Number, head.Time) { + f.tryPruneBlobAncient(env, *number) + } + // Avoid database thrashing with tiny writes if frozen-first < freezerBatchLimit { backoff = true @@ -250,9 +262,100 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore) { } } +func (f *chainFreezer) tryPruneBlobAncient(env *ethdb.FreezerEnv, num uint64) { + extraReserve := getBlobExtraReserveFromEnv(env) + // It means that there is no need for pruning + if extraReserve == 0 { + return + } + reserveThreshold := params.MinBlocksForBlobRequests + extraReserve + if num <= reserveThreshold { + return + } + expectTail := num - reserveThreshold + h, err := f.TableAncients(ChainFreezerBlobSidecarTable) + if err != nil { + log.Error("Cannot get blob ancient head when prune", "block", num) + return + } + start := time.Now() + if err = f.ResetTable(ChainFreezerBlobSidecarTable, expectTail, h, false); err != nil { + log.Error("Cannot prune blob ancient", "block", num, "expectTail", expectTail, "err", err) + return + } + log.Info("Chain freezer prune useless blobs, now ancient data is", "from", expectTail, "to", num, "cost", common.PrettyDuration(time.Since(start))) +} + +func getBlobExtraReserveFromEnv(env *ethdb.FreezerEnv) uint64 { + if env == nil { + return params.DefaultExtraReserveForBlobRequests + } + return env.BlobExtraReserve +} + +func (f *chainFreezer) freezeRangeWithBlobs(nfdb *nofreezedb, number, limit uint64) (hashes []common.Hash, err error) { + defer func() { + log.Info("freezeRangeWithBlobs", "from", number, "to", limit, "err", err) + }() + lastHash := ReadCanonicalHash(nfdb, limit) + if lastHash == (common.Hash{}) { + return nil, fmt.Errorf("canonical hash missing, can't freeze block %d", limit) + } + last, _ := ReadHeaderAndRaw(nfdb, lastHash, limit) + if last == nil { + return nil, fmt.Errorf("block header missing, can't freeze block %d", limit) + } + env, _ := f.freezeEnv.Load().(*ethdb.FreezerEnv) + if !isCancun(env, last.Number, last.Time) { + return f.freezeRange(nfdb, number, limit) + } + + var ( + cancunNumber uint64 + found bool + ) + + for i := number; i <= limit; i++ { + hash := ReadCanonicalHash(nfdb, i) + if hash == (common.Hash{}) { + return nil, fmt.Errorf("canonical hash missing, can't freeze block %d", i) + } + h, header := ReadHeaderAndRaw(nfdb, hash, i) + if len(header) == 0 { + return nil, fmt.Errorf("block header missing, can't freeze block %d", i) + } + if isCancun(env, h.Number, h.Time) { + cancunNumber = i + found = true + break + } + } + if !found { + return f.freezeRange(nfdb, number, limit) + } + + // freeze pre cancun + preHashes, err := f.freezeRange(nfdb, number, cancunNumber-1) + if err != nil { + return preHashes, err + } + + if err = ResetEmptyBlobAncientTable(f, cancunNumber); err != nil { + return preHashes, err + } + // freeze post cancun + postHashes, err := f.freezeRange(nfdb, cancunNumber, limit) + hashes = append(preHashes, postHashes...) + return hashes, err +} + func (f *chainFreezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hashes []common.Hash, err error) { - hashes = make([]common.Hash, 0, limit-number) + if number > limit { + return nil, nil + } + env, _ := f.freezeEnv.Load().(*ethdb.FreezerEnv) + hashes = make([]common.Hash, 0, limit-number) _, err = f.ModifyAncients(func(op ethdb.AncientWriteOp) error { for ; number <= limit; number++ { // Retrieve all the components of the canonical block. @@ -260,7 +363,7 @@ func (f *chainFreezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hash if hash == (common.Hash{}) { return fmt.Errorf("canonical hash missing, can't freeze block %d", number) } - header := ReadHeaderRLP(nfdb, hash, number) + h, header := ReadHeaderAndRaw(nfdb, hash, number) if len(header) == 0 { return fmt.Errorf("block header missing, can't freeze block %d", number) } @@ -276,6 +379,14 @@ func (f *chainFreezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hash if len(td) == 0 { return fmt.Errorf("total difficulty missing, can't freeze block %d", number) } + // blobs is nil before cancun fork + var sidecars rlp.RawValue + if isCancun(env, h.Number, h.Time) { + sidecars = ReadBlobSidecarsRLP(nfdb, hash, number) + if len(sidecars) == 0 { + return fmt.Errorf("block blobs missing, can't freeze block %d", number) + } + } // Write to the batch. if err := op.AppendRaw(ChainFreezerHashTable, number, hash[:]); err != nil { @@ -293,6 +404,11 @@ func (f *chainFreezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hash if err := op.AppendRaw(ChainFreezerDifficultyTable, number, td); err != nil { return fmt.Errorf("can't write td to Freezer: %v", err) } + if isCancun(env, h.Number, h.Time) { + if err := op.AppendRaw(ChainFreezerBlobSidecarTable, number, sidecars); err != nil { + return fmt.Errorf("can't write blobs to Freezer: %v", err) + } + } hashes = append(hashes, hash) } @@ -301,3 +417,20 @@ func (f *chainFreezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hash return hashes, err } + +func (f *chainFreezer) SetupFreezerEnv(env *ethdb.FreezerEnv) error { + f.freezeEnv.Store(env) + return nil +} + +func isCancun(env *ethdb.FreezerEnv, num *big.Int, time uint64) bool { + if env == nil || env.ChainCfg == nil { + return false + } + + return env.ChainCfg.IsCancun(num, time) +} + +func ResetEmptyBlobAncientTable(db ethdb.AncientWriter, next uint64) error { + return db.ResetTable(ChainFreezerBlobSidecarTable, next, next, true) +} diff --git a/core/rawdb/database.go b/core/rawdb/database.go index 80082830f9..a0db10eb6e 100644 --- a/core/rawdb/database.go +++ b/core/rawdb/database.go @@ -41,6 +41,7 @@ type freezerdb struct { ancientRoot string ethdb.KeyValueStore ethdb.AncientStore + ethdb.AncientFreezer diffStore ethdb.KeyValueStore stateStore ethdb.Database } @@ -125,6 +126,10 @@ func (frdb *freezerdb) Freeze(threshold uint64) error { return nil } +func (frdb *freezerdb) SetupFreezerEnv(env *ethdb.FreezerEnv) error { + return frdb.AncientFreezer.SetupFreezerEnv(env) +} + // nofreezedb is a database wrapper that disables freezer data retrievals. type nofreezedb struct { ethdb.KeyValueStore @@ -172,6 +177,10 @@ func (db *nofreezedb) ModifyAncients(func(ethdb.AncientWriteOp) error) (int64, e return 0, errNotSupported } +func (db *nofreezedb) ResetTable(kind string, tail uint64, head uint64, onlyEmpty bool) error { + return errNotSupported +} + // TruncateHead returns an error as we don't have a backing chain freezer. func (db *nofreezedb) TruncateHead(items uint64) (uint64, error) { return 0, errNotSupported @@ -241,6 +250,10 @@ func (db *nofreezedb) AncientDatadir() (string, error) { return "", errNotSupported } +func (db *nofreezedb) SetupFreezerEnv(env *ethdb.FreezerEnv) error { + return nil +} + // NewDatabase creates a high level database on top of a given key-value data // store without a freezer moving immutable chain segments into cold storage. func NewDatabase(db ethdb.KeyValueStore) ethdb.Database { @@ -307,9 +320,10 @@ func NewDatabaseWithFreezer(db ethdb.KeyValueStore, ancient string, namespace st WriteAncientType(db, PruneFreezerType) } return &freezerdb{ - ancientRoot: ancient, - KeyValueStore: db, - AncientStore: frdb, + ancientRoot: ancient, + KeyValueStore: db, + AncientStore: frdb, + AncientFreezer: frdb, }, nil } @@ -422,9 +436,10 @@ func NewDatabaseWithFreezer(db ethdb.KeyValueStore, ancient string, namespace st }() } return &freezerdb{ - ancientRoot: ancient, - KeyValueStore: db, - AncientStore: frdb, + ancientRoot: ancient, + KeyValueStore: db, + AncientStore: frdb, + AncientFreezer: frdb, }, nil } @@ -506,7 +521,7 @@ type OpenOptions struct { // // type == null type != null // +---------------------------------------- -// db is non-existent | leveldb default | specified type +// db is non-existent | pebble default | specified type // db is existent | from db | specified type (if compatible) func openKeyValueDatabase(o OpenOptions) (ethdb.Database, error) { // Reject any unsupported database type @@ -527,12 +542,9 @@ func openKeyValueDatabase(o OpenOptions) (ethdb.Database, error) { log.Info("Using leveldb as the backing database") return NewLevelDBDatabase(o.Directory, o.Cache, o.Handles, o.Namespace, o.ReadOnly) } - // No pre-existing database, no user-requested one either. Default to Pebble - // on supported platforms and LevelDB on anything else. - // log.Info("Defaulting to pebble as the backing database") - // return NewPebbleDBDatabase(o.Directory, o.Cache, o.Handles, o.Namespace, o.ReadOnly) - log.Info("Defaulting to leveldb as the backing database") - return NewLevelDBDatabase(o.Directory, o.Cache, o.Handles, o.Namespace, o.ReadOnly) + // No pre-existing database, no user-requested one either. Default to Pebble. + log.Info("Defaulting to pebble as the backing database") + return NewPebbleDBDatabase(o.Directory, o.Cache, o.Handles, o.Namespace, o.ReadOnly, o.Ephemeral) } // Open opens both a disk-based key-value database such as leveldb or pebble, but also @@ -887,6 +899,62 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error { return nil } +func DeleteTrieState(db ethdb.Database) error { + var ( + it ethdb.Iterator + batch = db.NewBatch() + start = time.Now() + logged = time.Now() + count int64 + key []byte + ) + + prefixKeys := map[string]func([]byte) bool{ + string(trieNodeAccountPrefix): IsAccountTrieNode, + string(trieNodeStoragePrefix): IsStorageTrieNode, + string(stateIDPrefix): func(key []byte) bool { return len(key) == len(stateIDPrefix)+common.HashLength }, + } + + for prefix, isValid := range prefixKeys { + it = db.NewIterator([]byte(prefix), nil) + + for it.Next() { + key = it.Key() + if !isValid(key) { + continue + } + + batch.Delete(it.Key()) + if batch.ValueSize() > ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + it.Release() + return err + } + batch.Reset() + } + + count++ + if time.Since(logged) > 8*time.Second { + log.Info("Deleting trie state", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + + it.Release() + } + + if batch.ValueSize() > 0 { + if err := batch.Write(); err != nil { + return err + } + batch.Reset() + } + + log.Info("Deleted trie state", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + + return nil +} + // printChainMetadata prints out chain metadata to stderr. func printChainMetadata(db ethdb.KeyValueStore) { fmt.Fprintf(os.Stderr, "Chain metadata\n") diff --git a/core/rawdb/freezer.go b/core/rawdb/freezer.go index 89ad12ffa9..33603b973f 100644 --- a/core/rawdb/freezer.go +++ b/core/rawdb/freezer.go @@ -26,6 +26,8 @@ import ( "sync/atomic" "time" + "golang.org/x/exp/slices" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" @@ -88,6 +90,7 @@ func NewChainFreezer(datadir string, namespace string, readonly bool, offset uin // // The 'tables' argument defines the data tables. If the value of a map // entry is true, snappy compression is disabled for the table. +// additionTables indicates the new add tables for freezerDB, it has some special rules. func NewFreezer(datadir string, namespace string, readonly bool, offset uint64, maxTableSize uint32, tables map[string]bool) (*Freezer, error) { // Create the initial freezer object var ( @@ -128,7 +131,15 @@ func NewFreezer(datadir string, namespace string, readonly bool, offset uint64, // Create the tables. for name, disableSnappy := range tables { - table, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy, readonly) + var ( + table *freezerTable + err error + ) + if slices.Contains(additionTables, name) { + table, err = openAdditionTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy, readonly) + } else { + table, err = newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy, readonly) + } if err != nil { for _, table := range freezer.tables { table.Close() @@ -167,6 +178,20 @@ func NewFreezer(datadir string, namespace string, readonly bool, offset uint64, return freezer, nil } +// openAdditionTable create table, it will auto create new files when it was first initialized +func openAdditionTable(datadir, name string, readMeter, writeMeter metrics.Meter, sizeGauge metrics.Gauge, maxTableSize uint32, disableSnappy, readonly bool) (*freezerTable, error) { + if readonly { + f, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy, false) + if err != nil { + return nil, err + } + if err = f.Close(); err != nil { + return nil, err + } + } + return newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy, readonly) +} + // Close terminates the chain freezer, unmapping all the data files. func (f *Freezer) Close() error { f.writeLock.Lock() @@ -224,6 +249,12 @@ func (f *Freezer) Ancients() (uint64, error) { return f.frozen.Load(), nil } +func (f *Freezer) TableAncients(kind string) (uint64, error) { + f.writeLock.RLock() + defer f.writeLock.RUnlock() + return f.tables[kind].items.Load(), nil +} + // ItemAmountInAncient returns the actual length of current ancientDB. func (f *Freezer) ItemAmountInAncient() (uint64, error) { return f.frozen.Load() - atomic.LoadUint64(&f.offset), nil @@ -308,8 +339,23 @@ func (f *Freezer) TruncateHead(items uint64) (uint64, error) { if oitems <= items { return oitems, nil } - for _, table := range f.tables { - if err := table.truncateHead(items - f.offset); err != nil { + for kind, table := range f.tables { + err := table.truncateHead(items - f.offset) + if err == errTruncationBelowTail { + // This often happens in chain rewinds, but the blob table is special. + // It has the same head, but a different tail from other tables (like bodies, receipts). + // So if the chain is rewound to head below the blob's tail, it needs to reset again. + if kind != ChainFreezerBlobSidecarTable { + return 0, err + } + nt, err := table.resetItems(items-f.offset, items-f.offset) + if err != nil { + return 0, err + } + f.tables[kind] = nt + continue + } + if err != nil { return 0, err } } @@ -365,6 +411,10 @@ func (f *Freezer) validate() error { ) // Hack to get boundary of any table for kind, table := range f.tables { + // addition tables is special cases + if slices.Contains(additionTables, kind) { + continue + } head = table.items.Load() tail = table.itemHidden.Load() name = kind @@ -372,6 +422,21 @@ func (f *Freezer) validate() error { } // Now check every table against those boundaries. for kind, table := range f.tables { + // check addition tables, try to align with exist tables + if slices.Contains(additionTables, kind) { + // if the table is empty, just skip + if EmptyTable(table) { + continue + } + // otherwise, just align head + if head != table.items.Load() { + return fmt.Errorf("freezer tables %s and %s have differing head: %d != %d", kind, name, table.items.Load(), head) + } + if tail > table.itemHidden.Load() { + return fmt.Errorf("freezer tables %s and %s have differing tail: %d != %d", kind, name, table.itemHidden.Load(), tail) + } + continue + } if head != table.items.Load() { return fmt.Errorf("freezer tables %s and %s have differing head: %d != %d", kind, name, table.items.Load(), head) } @@ -390,7 +455,18 @@ func (f *Freezer) repair() error { head = uint64(math.MaxUint64) tail = uint64(0) ) - for _, table := range f.tables { + for kind, table := range f.tables { + // addition tables only align head + if slices.Contains(additionTables, kind) { + if EmptyTable(table) { + continue + } + items := table.items.Load() + if head > items { + head = items + } + continue + } items := table.items.Load() if head > items { head = items @@ -400,8 +476,27 @@ func (f *Freezer) repair() error { tail = hidden } } - for _, table := range f.tables { - if err := table.truncateHead(head); err != nil { + for kind, table := range f.tables { + // try to align with exist tables, skip empty table + if slices.Contains(additionTables, kind) && EmptyTable(table) { + continue + } + err := table.truncateHead(head) + if err == errTruncationBelowTail { + // This often happens in chain rewinds, but the blob table is special. + // It has the same head, but a different tail from other tables (like bodies, receipts). + // So if the chain is rewound to head below the blob's tail, it needs to reset again. + if kind != ChainFreezerBlobSidecarTable { + return err + } + nt, err := table.resetItems(head, head) + if err != nil { + return err + } + f.tables[kind] = nt + continue + } + if err != nil { return err } if err := table.truncateTail(tail); err != nil { @@ -602,3 +697,49 @@ func (f *Freezer) MigrateTable(kind string, convert convertLegacyFn) error { } return nil } + +// only used for ChainFreezerBlobSidecarTable now +func (f *Freezer) ResetTable(kind string, tail, head uint64, onlyEmpty bool) error { + if f.readonly { + return errReadOnly + } + if err := f.Sync(); err != nil { + return err + } + + f.writeLock.Lock() + defer f.writeLock.Unlock() + if tail < f.offset || head < f.offset { + return errors.New("the input tail&head is less than offset") + } + if _, exist := f.tables[kind]; !exist { + return errors.New("you reset a non-exist table") + } + // if you reset a non empty table just skip + if onlyEmpty && !EmptyTable(f.tables[kind]) { + return nil + } + + nt, err := f.tables[kind].resetItems(tail-f.offset, head-f.offset) + if err != nil { + return err + } + f.tables[kind] = nt + + if err := f.repair(); err != nil { + for _, table := range f.tables { + table.Close() + } + return err + } + + f.frozen.Add(f.offset) + f.tail.Add(f.offset) + f.writeBatch = newFreezerBatch(f) + log.Info("Reset Table", "kind", kind, "tail", f.tables[kind].itemHidden.Load(), "frozen", f.tables[kind].items.Load()) + return nil +} + +func EmptyTable(t *freezerTable) bool { + return t.items.Load() == 0 +} diff --git a/core/rawdb/freezer_batch.go b/core/rawdb/freezer_batch.go index 3e1a8143a6..6f15fcd74b 100644 --- a/core/rawdb/freezer_batch.go +++ b/core/rawdb/freezer_batch.go @@ -20,6 +20,8 @@ import ( "fmt" "sync/atomic" + "golang.org/x/exp/slices" + "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/rlp" "github.com/golang/snappy" @@ -65,6 +67,10 @@ func (batch *freezerBatch) commit() (item uint64, writeSize int64, err error) { // Check that count agrees on all batches. item = uint64(math.MaxUint64) for name, tb := range batch.tables { + // skip empty addition tables + if slices.Contains(additionTables, name) && EmptyTable(tb.t) { + continue + } if item < math.MaxUint64 && tb.curItem != item { return 0, 0, fmt.Errorf("table %s is at item %d, want %d", name, tb.curItem, item) } diff --git a/core/rawdb/freezer_resettable.go b/core/rawdb/freezer_resettable.go index 67565530e1..1bbc39d7f5 100644 --- a/core/rawdb/freezer_resettable.go +++ b/core/rawdb/freezer_resettable.go @@ -187,6 +187,13 @@ func (f *ResettableFreezer) ModifyAncients(fn func(ethdb.AncientWriteOp) error) return f.freezer.ModifyAncients(fn) } +func (f *ResettableFreezer) ResetTable(kind string, tail uint64, head uint64, onlyEmpty bool) error { + f.lock.RLock() + defer f.lock.RUnlock() + + return f.freezer.ResetTable(kind, tail, head, onlyEmpty) +} + // TruncateHead discards any recent data above the provided threshold number. // It returns the previous head number. func (f *ResettableFreezer) TruncateHead(items uint64) (uint64, error) { diff --git a/core/rawdb/freezer_table.go b/core/rawdb/freezer_table.go index 5bd0d54c66..8dd99d4f49 100644 --- a/core/rawdb/freezer_table.go +++ b/core/rawdb/freezer_table.go @@ -44,6 +44,8 @@ var ( // errNotSupported is returned if the database doesn't support the required operation. errNotSupported = errors.New("this operation is not supported") + + errTruncationBelowTail = errors.New("truncation below tail") ) // indexEntry contains the number/id of the file that the data resides in, as well as the @@ -406,7 +408,7 @@ func (t *freezerTable) truncateHead(items uint64) error { return nil } if items < t.itemHidden.Load() { - return errors.New("truncation below tail") + return errTruncationBelowTail } // We need to truncate, save the old size for metrics tracking oldSize, err := t.sizeNolock() @@ -1026,3 +1028,55 @@ func (t *freezerTable) ResetItemsOffset(virtualTail uint64) error { return nil } + +// resetItems reset freezer table head & tail +// only used for ChainFreezerBlobSidecarTable now +func (t *freezerTable) resetItems(tail, head uint64) (*freezerTable, error) { + if t.readonly { + return nil, errors.New("resetItems in readonly mode") + } + itemHidden := t.itemHidden.Load() + items := t.items.Load() + if tail != head && (itemHidden > tail || items < head) { + return nil, errors.New("cannot reset to non-exist range") + } + + var err error + if tail != head { + if err = t.truncateHead(head); err != nil { + return nil, err + } + if err = t.truncateTail(tail); err != nil { + return nil, err + } + return t, nil + } + + // if tail == head, it means table reset to 0 item + t.releaseFilesAfter(t.tailId-1, true) + t.head.Close() + os.Remove(t.head.Name()) + t.index.Close() + os.Remove(t.index.Name()) + t.meta.Close() + os.Remove(t.meta.Name()) + + var idxName string + if t.noCompression { + idxName = fmt.Sprintf("%s.ridx", t.name) // raw index file + } else { + idxName = fmt.Sprintf("%s.cidx", t.name) // compressed index file + } + index, err := openFreezerFileForAppend(filepath.Join(t.path, idxName)) + if err != nil { + return nil, err + } + tailIndex := indexEntry{ + offset: uint32(tail), + } + if _, err = index.Write(tailIndex.append(nil)); err != nil { + return nil, err + } + + return newFreezerTable(t.path, t.name, t.noCompression, t.readonly) +} diff --git a/core/rawdb/freezer_table_test.go b/core/rawdb/freezer_table_test.go index 49cdf0d89e..da8520fb3e 100644 --- a/core/rawdb/freezer_table_test.go +++ b/core/rawdb/freezer_table_test.go @@ -1370,3 +1370,98 @@ func TestRandom(t *testing.T) { t.Fatal(err) } } + +func TestResetItems(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("truncate-tail-%d", rand.Uint64()) + + // Fill table + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) + if err != nil { + t.Fatal(err) + } + + // Write 7 x 20 bytes, splitting out into four files + batch := f.newBatch(0) + require.NoError(t, batch.AppendRaw(0, getChunk(20, 0xFF))) + require.NoError(t, batch.AppendRaw(1, getChunk(20, 0xEE))) + require.NoError(t, batch.AppendRaw(2, getChunk(20, 0xdd))) + require.NoError(t, batch.AppendRaw(3, getChunk(20, 0xcc))) + require.NoError(t, batch.AppendRaw(4, getChunk(20, 0xbb))) + require.NoError(t, batch.AppendRaw(5, getChunk(20, 0xaa))) + require.NoError(t, batch.AppendRaw(6, getChunk(20, 0x11))) + require.NoError(t, batch.commit()) + + // nothing to do, all the items should still be there. + f, err = f.resetItems(0, 7) + require.NoError(t, err) + fmt.Println(f.dumpIndexString(0, 1000)) + checkRetrieve(t, f, map[uint64][]byte{ + 0: getChunk(20, 0xFF), + 1: getChunk(20, 0xEE), + 2: getChunk(20, 0xdd), + 3: getChunk(20, 0xcc), + 4: getChunk(20, 0xbb), + 5: getChunk(20, 0xaa), + 6: getChunk(20, 0x11), + }) + + f, err = f.resetItems(1, 5) + require.NoError(t, err) + _, err = f.resetItems(0, 5) + require.Error(t, err) + _, err = f.resetItems(1, 6) + require.Error(t, err) + + fmt.Println(f.dumpIndexString(0, 1000)) + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + }) + checkRetrieve(t, f, map[uint64][]byte{ + 1: getChunk(20, 0xEE), + 2: getChunk(20, 0xdd), + 3: getChunk(20, 0xcc), + 4: getChunk(20, 0xbb), + }) + + f, err = f.resetItems(4, 4) + require.NoError(t, err) + checkRetrieveError(t, f, map[uint64]error{ + 4: errOutOfBounds, + }) + + batch = f.newBatch(0) + require.Error(t, batch.AppendRaw(0, getChunk(20, 0xa0))) + require.NoError(t, batch.AppendRaw(4, getChunk(20, 0xa4))) + require.NoError(t, batch.AppendRaw(5, getChunk(20, 0xa5))) + require.NoError(t, batch.commit()) + fmt.Println(f.dumpIndexString(0, 1000)) + + // Reopen the table, the deletion information should be persisted as well + f.Close() + f, err = newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) + if err != nil { + t.Fatal(err) + } + fmt.Println(f.dumpIndexString(0, 1000)) + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + }) + checkRetrieve(t, f, map[uint64][]byte{ + 4: getChunk(20, 0xa4), + 5: getChunk(20, 0xa5), + }) + + // truncate all, the entire freezer should be deleted + f.truncateTail(6) + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + 1: errOutOfBounds, + 2: errOutOfBounds, + 3: errOutOfBounds, + 4: errOutOfBounds, + 5: errOutOfBounds, + 6: errOutOfBounds, + }) +} diff --git a/core/rawdb/freezer_test.go b/core/rawdb/freezer_test.go index 5be7f09330..60103ab675 100644 --- a/core/rawdb/freezer_test.go +++ b/core/rawdb/freezer_test.go @@ -334,6 +334,73 @@ func TestFreezerConcurrentReadonly(t *testing.T) { } } +func TestFreezer_AdditionTables(t *testing.T) { + dir := t.TempDir() + // Open non-readonly freezer and fill individual tables + // with different amount of data. + f, err := NewFreezer(dir, "", false, 0, 2049, map[string]bool{"o1": true, "o2": true}) + if err != nil { + t.Fatal("can't open freezer", err) + } + + var item = make([]byte, 1024) + _, err = f.ModifyAncients(func(op ethdb.AncientWriteOp) error { + if err := op.AppendRaw("o1", 0, item); err != nil { + return err + } + if err := op.AppendRaw("o1", 1, item); err != nil { + return err + } + if err := op.AppendRaw("o2", 0, item); err != nil { + return err + } + if err := op.AppendRaw("o2", 1, item); err != nil { + return err + } + return nil + }) + require.NoError(t, err) + require.NoError(t, f.Close()) + + // check read only + additionTables = []string{"a1"} + f, err = NewFreezer(dir, "", true, 0, 2049, map[string]bool{"o1": true, "o2": true, "a1": true}) + require.NoError(t, err) + require.NoError(t, f.Close()) + + f, err = NewFreezer(dir, "", false, 0, 2049, map[string]bool{"o1": true, "o2": true, "a1": true}) + require.NoError(t, err) + frozen, _ := f.Ancients() + f.ResetTable("a1", frozen, frozen, true) + _, err = f.ModifyAncients(func(op ethdb.AncientWriteOp) error { + if err := op.AppendRaw("o1", 2, item); err != nil { + return err + } + if err := op.AppendRaw("o2", 2, item); err != nil { + return err + } + if err := op.AppendRaw("a1", 2, item); err != nil { + return err + } + return nil + }) + require.NoError(t, err) + _, err = f.Ancient("a1", 1) + require.Error(t, err) + actual, err := f.Ancient("a1", 2) + require.NoError(t, err) + require.Equal(t, item, actual) + require.NoError(t, f.Close()) + + // reopen and read + f, err = NewFreezer(dir, "", true, 0, 2049, map[string]bool{"o1": true, "o2": true, "a1": true}) + require.NoError(t, err) + actual, err = f.Ancient("a1", 2) + require.NoError(t, err) + require.Equal(t, item, actual) + require.NoError(t, f.Close()) +} + func newFreezerForTesting(t *testing.T, tables map[string]bool) (*Freezer, string) { t.Helper() diff --git a/core/rawdb/prunedfreezer.go b/core/rawdb/prunedfreezer.go index ddc77cd49a..992d7802ed 100644 --- a/core/rawdb/prunedfreezer.go +++ b/core/rawdb/prunedfreezer.go @@ -312,6 +312,10 @@ func (f *prunedfreezer) freeze() { } } +func (f *prunedfreezer) SetupFreezerEnv(env *ethdb.FreezerEnv) error { + return nil +} + func (f *prunedfreezer) ReadAncients(fn func(ethdb.AncientReaderOp) error) (err error) { return fn(f) } @@ -323,3 +327,7 @@ func (f *prunedfreezer) AncientRange(kind string, start, count, maxBytes uint64) func (f *prunedfreezer) ModifyAncients(func(ethdb.AncientWriteOp) error) (int64, error) { return 0, errNotSupported } + +func (f *prunedfreezer) ResetTable(kind string, tail uint64, head uint64, onlyEmpty bool) error { + return errNotSupported +} diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go index 02a41c6903..601e89adcd 100644 --- a/core/rawdb/schema.go +++ b/core/rawdb/schema.go @@ -149,6 +149,8 @@ var ( CliqueSnapshotPrefix = []byte("clique-") ParliaSnapshotPrefix = []byte("parlia-") + BlockBlobSidecarsPrefix = []byte("blobs") + preimageCounter = metrics.NewRegisteredCounter("db/preimage/total", nil) preimageHitCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil) ) @@ -203,6 +205,11 @@ func blockReceiptsKey(number uint64, hash common.Hash) []byte { return append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash.Bytes()...) } +// blockBlobSidecarsKey = BlockBlobSidecarsPrefix + blockNumber (uint64 big endian) + blockHash +func blockBlobSidecarsKey(number uint64, hash common.Hash) []byte { + return append(append(BlockBlobSidecarsPrefix, encodeBlockNumber(number)...), hash.Bytes()...) +} + // diffLayerKey = diffLayerKeyPrefix + hash func diffLayerKey(hash common.Hash) []byte { return append(diffLayerPrefix, hash.Bytes()...) diff --git a/core/rawdb/table.go b/core/rawdb/table.go index dc49d526c3..6d594dfa14 100644 --- a/core/rawdb/table.go +++ b/core/rawdb/table.go @@ -101,6 +101,10 @@ func (t *table) ModifyAncients(fn func(ethdb.AncientWriteOp) error) (int64, erro return t.db.ModifyAncients(fn) } +func (t *table) ResetTable(kind string, tail uint64, head uint64, onlyEmpty bool) error { + return t.db.ResetTable(kind, tail, head, onlyEmpty) +} + func (t *table) ReadAncients(fn func(reader ethdb.AncientReaderOp) error) (err error) { return t.db.ReadAncients(fn) } @@ -237,6 +241,10 @@ func (t *table) NewSnapshot() (ethdb.Snapshot, error) { return t.db.NewSnapshot() } +func (t *table) SetupFreezerEnv(env *ethdb.FreezerEnv) error { + return nil +} + // tableBatch is a wrapper around a database batch that prefixes each key access // with a pre-configured string. type tableBatch struct { diff --git a/core/remote_state_verifier.go b/core/remote_state_verifier.go index c2c10c2be3..7baa5abe47 100644 --- a/core/remote_state_verifier.go +++ b/core/remote_state_verifier.go @@ -444,6 +444,10 @@ func (mode VerifyMode) NeedRemoteVerify() bool { return mode == FullVerify || mode == InsecureVerify } +func (mode VerifyMode) NoTries() bool { + return mode != LocalVerify +} + func newVerifyMsgTypeGauge(msgType uint16, peerId string) metrics.Gauge { m := fmt.Sprintf("verifymanager/message/%d/peer/%s", msgType, peerId) return metrics.GetOrRegisterGauge(m, nil) diff --git a/core/state/pruner/pruner.go b/core/state/pruner/pruner.go index 8c28ad7011..6adfbbede7 100644 --- a/core/state/pruner/pruner.go +++ b/core/state/pruner/pruner.go @@ -453,6 +453,9 @@ func (p *BlockPruner) backUpOldDb(name string, cache, handles int, namespace str if td == nil { return consensus.ErrUnknownAncestor } + // if there has blobs, it needs to back up too. + blobs := rawdb.ReadRawBlobSidecars(chainDb, blockHash, blockNumber) + block.WithSidecars(blobs) // Write into new ancient_back db. if _, err := rawdb.WriteAncientBlocks(frdbBack, []*types.Block{block}, []types.Receipts{receipts}, td); err != nil { log.Error("failed to write new ancient", "error", err) diff --git a/core/state/statedb.go b/core/state/statedb.go index 038bc7899f..ae0c20c076 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -1535,11 +1535,11 @@ func (s *StateDB) Commit(block uint64, failPostCommitFunc func(), postCommitFunc } tasks := make(chan func()) - type tastResult struct { + type taskResult struct { err error nodeSet *trienode.NodeSet } - taskResults := make(chan tastResult, len(s.stateObjectsDirty)) + taskResults := make(chan taskResult, len(s.stateObjectsDirty)) tasksNum := 0 finishCh := make(chan struct{}) @@ -1566,13 +1566,13 @@ func (s *StateDB) Commit(block uint64, failPostCommitFunc func(), postCommitFunc // Write any storage changes in the state object to its storage trie if !s.noTrie { if set, err := obj.commit(); err != nil { - taskResults <- tastResult{err, nil} + taskResults <- taskResult{err, nil} return } else { - taskResults <- tastResult{nil, set} + taskResults <- taskResult{nil, set} } } else { - taskResults <- tastResult{nil, nil} + taskResults <- taskResult{nil, nil} } } tasksNum++ diff --git a/core/state_processor.go b/core/state_processor.go index da66e1747e..2af0d514fe 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -113,6 +113,12 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg continue } } + if p.config.IsCancun(block.Number(), block.Time()) { + if len(systemTxs) > 0 { + // systemTxs should be always at the end of block. + return statedb, nil, nil, 0, fmt.Errorf("normal tx %d [%v] after systemTx", i, tx.Hash().Hex()) + } + } msg, err := TransactionToMessage(tx, signer, header.BaseFee) if err != nil { @@ -233,11 +239,11 @@ func ProcessBeaconBlockRoot(beaconRoot common.Hash, vmenv *vm.EVM, statedb *stat GasPrice: common.Big0, GasFeeCap: common.Big0, GasTipCap: common.Big0, - To: ¶ms.BeaconRootsStorageAddress, + To: ¶ms.BeaconRootsAddress, Data: beaconRoot[:], } vmenv.Reset(NewEVMTxContext(msg), statedb) - statedb.AddAddressToAccessList(params.BeaconRootsStorageAddress) + statedb.AddAddressToAccessList(params.BeaconRootsAddress) _, _, _ = vmenv.Call(vm.AccountRef(msg.From), *msg.To, msg.Data, 30_000_000, common.U2560) statedb.Finalise(true) } diff --git a/core/state_transition.go b/core/state_transition.go index e5323005e3..f3f7b0f976 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -465,6 +465,13 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { // consensus engine is parlia if st.evm.ChainConfig().Parlia != nil { st.state.AddBalance(consensus.SystemAddress, fee) + // add extra blob fee reward + if rules.IsCancun { + blobFee := new(big.Int).SetUint64(st.blobGasUsed()) + blobFee.Mul(blobFee, st.evm.Context.BlobBaseFee) + blobFeeU256, _ := uint256.FromBig(blobFee) + st.state.AddBalance(consensus.SystemAddress, blobFeeU256) + } } else { st.state.AddBalance(st.evm.Context.Coinbase, fee) } diff --git a/core/systemcontracts/upgrade.go b/core/systemcontracts/upgrade.go index 973c023e16..0efb62485d 100644 --- a/core/systemcontracts/upgrade.go +++ b/core/systemcontracts/upgrade.go @@ -59,6 +59,8 @@ var ( keplerUpgrade = make(map[string]*Upgrade) feynmanUpgrade = make(map[string]*Upgrade) + + feynmanFixUpgrade = make(map[string]*Upgrade) ) func init() { @@ -604,66 +606,93 @@ func init() { Configs: []*UpgradeConfig{ { ContractAddr: common.HexToAddress(ValidatorContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", - Code: "6080604052600436106104fb5760003560e01c806388b32f111161028c578063c6d339451161015a578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d2d578063f9a2bbc714610d42578063fc3e590814610d57578063fccc281314610d6c578063fd4ad81f14610d81578063fd6a687914610db057610502565b8063e40716a114610c9b578063ea321e4914610cb0578063eb57e20214610cd0578063eda5868c14610cf0578063f1fad10414610d05578063f340fa0114610d1a57610502565b8063d86222d51161011e578063d86222d514610c1d578063daacdb6614610c32578063dc927faf14610c47578063df8079e914610c5c578063e086c7b114610c71578063e1c7392a14610c8657610502565b8063c6d3394514610bbe578063c81b166214610bd3578063c8509d811461098d578063ce910b0c14610be8578063d68fb56a14610c0857610502565b8063a78abc16116101fe578063ad3c9da6116101b7578063ad3c9da614610b3d578063aef198a914610b5d578063b7ab4db514610b72578063b8cf4ef114610b94578063bf9f4995146106fe578063c466689d14610ba957610502565b8063a78abc1614610ab4578063aa82dce114610ac9578063aad5606314610ade578063aaf5eb6814610af3578063ab51bb9614610b08578063ac43175114610b1d57610502565b806396713da91161025057806396713da914610a365780639dc0926214610a4b5780639fe0f81614610a60578063a0dc275814610a75578063a1a11bf514610a8a578063a5422d5c14610a9f57610502565b806388b32f11146109c25780638a7beb01146109d75780638b5ad0c9146109ec5780638d19a41014610a015780639369d7de14610a2157610502565b806351b4dce3116103c957806370fd5bad1161033b5780637e434d54116102f45780637e434d541461094e57806381650b6214610963578063820dcaa814610978578063831d65d11461098d578063853230aa1461090f57806386249882146109ad57610502565b806370fd5bad146108d0578063718a8aa8146108e557806375d47a0a146108fa57806378dfed4a1461090f5780637942fd05146109245780637a84ca2a1461093957610502565b80635d77156c1161038d5780635d77156c1461082a5780635de1e22c1461083f57806360eba4fe1461085457806362b72cf5146108745780636969a25c146108895780636e47b482146108bb57610502565b806351b4dce3146107ab57806351e80672146107c057806355614fcc146107d5578063565c56b3146107f55780635667515a1461081557610502565b8063300c35671161046d57806343756e5c1161042657806343756e5c1461072057806345cf9daf14610735578063493279b11461074a5780634bf6c8821461076c5780634df6e0c3146107815780635192c82c1461079657610502565b8063300c35671461065b578063321d398a1461067b5780633365af3a1461069b57806335409f7f146106bb5780633b071dcc146106db5780633dffc387146106fe57610502565b8063152ad3b8116104bf578063152ad3b8146105ba5780631e4c1524146105dc5780631ff18069146105fc578063219f22d51461061157806328087028146106265780632a0ffb6e1461063b57610502565b806304c4fec61461050757806307a568471461051e5780630bee7a67146105495780630e2374a51461056b5780631182b8751461058d57610502565b3661050257005b600080fd5b34801561051357600080fd5b5061051c610dc5565b005b34801561052a57600080fd5b50610533610e37565b6040516105409190618fa3565b60405180910390f35b34801561055557600080fd5b5061055e610e3d565b6040516105409190618fcd565b34801561057757600080fd5b50610580610e42565b60405161054091906182b6565b34801561059957600080fd5b506105ad6105a836600461819c565b610e48565b6040516105409190618449565b3480156105c657600080fd5b506105cf611144565b604051610540919061843e565b3480156105e857600080fd5b5061051c6105f7366004617faa565b61114d565b34801561060857600080fd5b50610533611823565b34801561061d57600080fd5b5061055e611829565b34801561063257600080fd5b5061058061182e565b34801561064757600080fd5b5061051c610656366004617f0a565b611834565b34801561066757600080fd5b5061051c610676366004617f42565b6118e1565b34801561068757600080fd5b506105cf610696366004618149565b611c2a565b3480156106a757600080fd5b506105cf6106b6366004618149565b611cf9565b3480156106c757600080fd5b5061051c6106d6366004617f0a565b611daa565b3480156106e757600080fd5b506106f0611f0f565b604051610540929190618354565b34801561070a57600080fd5b506107136121eb565b6040516105409190618fde565b34801561072c57600080fd5b506105806121f0565b34801561074157600080fd5b506105336121f6565b34801561075657600080fd5b5061075f6121fc565b6040516105409190618f94565b34801561077857600080fd5b50610713612202565b34801561078d57600080fd5b506106f0612207565b3480156107a257600080fd5b50610533612393565b3480156107b757600080fd5b50610580612399565b3480156107cc57600080fd5b5061058061239f565b3480156107e157600080fd5b506105cf6107f0366004617f0a565b6123a5565b34801561080157600080fd5b50610533610810366004617f0a565b6123da565b34801561082157600080fd5b5061071361242b565b34801561083657600080fd5b5061055e612430565b34801561084b57600080fd5b50610533612435565b34801561086057600080fd5b506105ad61086f366004618149565b61243b565b34801561088057600080fd5b506105336124e1565b34801561089557600080fd5b506108a96108a4366004618149565b6124e7565b604051610540969594939291906182e3565b3480156108c757600080fd5b5061058061254b565b3480156108dc57600080fd5b50610713612551565b3480156108f157600080fd5b50610713612556565b34801561090657600080fd5b5061058061255b565b34801561091b57600080fd5b50610533612561565b34801561093057600080fd5b50610713612567565b34801561094557600080fd5b5061053361256c565b34801561095a57600080fd5b50610580612572565b34801561096f57600080fd5b5061055e612578565b34801561098457600080fd5b5061053361257d565b34801561099957600080fd5b5061051c6109a836600461819c565b612583565b3480156109b957600080fd5b506105336125e4565b3480156109ce57600080fd5b506105336125ea565b3480156109e357600080fd5b506105cf6125f0565b3480156109f857600080fd5b506105336125f9565b348015610a0d57600080fd5b50610533610a1c366004617f0a565b6125ff565b348015610a2d57600080fd5b5061051c61263f565b348015610a4257600080fd5b50610713612753565b348015610a5757600080fd5b50610580612758565b348015610a6c57600080fd5b5061053361275e565b348015610a8157600080fd5b50610533612763565b348015610a9657600080fd5b50610580612768565b348015610aab57600080fd5b506105ad61276e565b348015610ac057600080fd5b506105cf61278a565b348015610ad557600080fd5b50610580612793565b348015610aea57600080fd5b50610580612799565b348015610aff57600080fd5b5061053361279f565b348015610b1457600080fd5b5061055e61242b565b348015610b2957600080fd5b5061051c610b383660046180ed565b6127a8565b348015610b4957600080fd5b50610533610b58366004617f0a565b613061565b348015610b6957600080fd5b50610533613073565b348015610b7e57600080fd5b50610b87613080565b6040516105409190618341565b348015610ba057600080fd5b5061053361316c565b348015610bb557600080fd5b50610533613171565b348015610bca57600080fd5b50610533612551565b348015610bdf57600080fd5b50610580613177565b348015610bf457600080fd5b506105ad610c03366004618149565b61317d565b348015610c1457600080fd5b5061053361318a565b348015610c2957600080fd5b506105336131c9565b348015610c3e57600080fd5b506105336131d5565b348015610c5357600080fd5b506105806131db565b348015610c6857600080fd5b506105806131e1565b348015610c7d57600080fd5b50610533610e3d565b348015610c9257600080fd5b5061051c6131e7565b348015610ca757600080fd5b50610533613478565b348015610cbc57600080fd5b506105cf610ccb3660046180ae565b61347e565b348015610cdc57600080fd5b5061051c610ceb366004617f0a565b613604565b348015610cfc57600080fd5b5061055e613708565b348015610d1157600080fd5b5061071361370d565b61051c610d28366004617f0a565b613712565b348015610d3957600080fd5b50610533613a91565b348015610d4e57600080fd5b50610580613a97565b348015610d6357600080fd5b5061071361275e565b348015610d7857600080fd5b50610580613a9d565b348015610d8d57600080fd5b50610da1610d9c366004618149565b613aa3565b60405161054093929190618fac565b348015610dbc57600080fd5b50610580613b65565b6000610dd0336125ff565b9050600b8181548110610ddf57fe5b600091825260209091206001601690920201015460ff16610e1b5760405162461bcd60e51b8152600401610e1290618baf565b60405180910390fd5b6000610e2561318a565b9050610e32338383613b6b565b505050565b60095481565b606481565b61200181565b60005460609060ff16610e6d5760405162461bcd60e51b8152600401610e1290618670565b600b54610f2b57610e7c617ab6565b60015460005b81811015610f2757600b805460018101825560009190915283516000805160206190b083398151915260169092029182019081556020808601516000805160206190f08339815191528401805460ff1916911515919091179055604086015180518794610f03936000805160206190d0833981519152909101920190617ae5565b506060820151610f199060038301906013617b5f565b505050806001019050610e82565b5050505b610f33617b8c565b6000610f7485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e3c92505050565b9150915080610f9057610f876064613ff8565b9250505061113d565b815160009060ff16610fb557610fae83602001518460400151614059565b9050611109565b825160ff166001141561110557826020015151600114610ffa57600080516020619090833981519152604051610fea90618a68565b60405180910390a1506067611100565b6000836020015160008151811061100d57fe5b602090810291909101810151516001600160a01b0381166000908152600490925260409091205490915080158061106e575060018082038154811061104e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b156110ac576040516001600160a01b038316907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26110f9565b60006110bb836001840361521b565b9050806110f7576040516001600160a01b038416907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a25b505b6000925050505b611109565b5060655b63ffffffff811661112e575050604080516000815260208101909152915061113d9050565b61113781613ff8565b93505050505b9392505050565b60075460ff1681565b33411461116c5760405162461bcd60e51b8152600401610e1290618dff565b3a1561118a5760405162461bcd60e51b8152600401610e1290618aee565b82516040805182815260208084028201019091526060908280156111c857816020015b6111b5617bb0565b8152602001906001900390816111ad5790505b50905060005b82811015611272576040518060c001604052808783815181106111ed57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200186838151811061122f57fe5b60200260200101516001600160401b03168152602001600015158152602001600081525082828151811061125f57fe5b60209081029190910101526001016111ce565b5060405163d31f968d60e01b81526120009063d31f968d9061129d9061100090600890600401618325565b60206040518083038186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ed919061808e565b156116105780516015548181111561138f57815b8181101561138d57601580548061131457fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055601680548061136757fe5b6001900381819060005260206000200160006113839190617be5565b9055600101611301565b505b60005b828110156115cf578181106114b75760158482815181106113af57fe5b602090810291909101810151825460018181018555600094855293839020825160049092020180546001600160a01b039283166001600160a01b0319918216178255938301519481018054958316958516959095179094556040820151600285018054606085015160808601511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590961692909716919091179290921692909217169290921790915560a00151600390910155855160169087908390811061147f57fe5b602090810291909101810151825460018101845560009384529282902081516114b19491909101929190910190617ae5565b506115c7565b8381815181106114c357fe5b6020026020010151601582815481106114d857fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a090910151600390910155855186908290811061159357fe5b6020026020010151601682815481106115a857fe5b9060005260206000200190805190602001906115c5929190617ae5565b505b600101611392565b507fb8e726330a0dad1cf3d04e925663b17e391f1ed547d79b7f4e5f344119b44246826040516115ff9190618fa3565b60405180910390a150505050610e32565b60608061161d83866155de565b9150915060005b6001548110156117135760006001828154811061163d57fe5b90600052602060002090600402016003015490508060001461170a5760006001838154811061166857fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab826001858154811061169c57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b1681526116d7926001600160a01b0390921691016182b6565b6000604051808303818588803b1580156116f057600080fd5b505af1158015611704573d6000803e3d6000fd5b50505050505b50600101611624565b504715611781577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516117499190618fa3565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561177f573d6000803e3d6000fd5b505b6000600381905560055581511561179c5761179c8282615ac5565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b33612002146118555760405162461bcd60e51b8152600401610e1290618f5d565b60005b6015548110156118dd57816001600160a01b03166015828154811061187957fe5b60009182526020909120600490910201546001600160a01b031614156118d5576001601582815481106118a857fe5b9060005260206000209060040201600201601c6101000a81548160ff0219169083151502179055506118dd565b600101611858565b5050565b3341146119005760405162461bcd60e51b8152600401610e1290618dff565b60105443116119215760405162461bcd60e51b8152600401610e1290618803565b3a1561193f5760405162461bcd60e51b8152600401610e1290618aee565b60005460ff166119615760405162461bcd60e51b8152600401610e1290618670565b60006110023168056bc75e2d63100000811115611998576119918168056bc75e2d6310000063ffffffff6162b416565b915061199f565b5050611c20565b6040516309a99b4f60e41b815261100290639a99b4f0906119c690309086906004016182ca565b602060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190618161565b915081611a26575050611c20565b6000805b84811015611a5457858582818110611a3e57fe5b9050602002013582019150806001019050611a2a565b5080611a6257505050611c20565b6000806000805b89811015611c185784898983818110611a7e57fe5b90506020020135880281611a8e57fe5b0493508a8a82818110611a9d57fe5b9050602002016020810190611ab29190617f0a565b6001600160a01b03811660009081526004602052604090205490935091508115611bce576000600180840381548110611ae757fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611b5457836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8586604051611b479190618fa3565b60405180910390a2611bc8565b600354611b67908663ffffffff6162f616565b6003908155810154611b7f908663ffffffff6162f616565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611bbf908890618fa3565b60405180910390a25b50611c10565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8585604051611c079190618fa3565b60405180910390a25b600101611a69565b505050505050505b5050436010555050565b6001546000908210611c3e57506000611cf4565b60006001600160a01b031660018381548110611c5657fe5b60009182526020909120600490910201546001600160a01b03161480611c8657506008541580611c865750600a54155b80611c95575060085460095410155b80611ca65750611ca482611cf9565b155b80611ccf57506000600b8381548110611cbb57fe5b906000526020600020906016020160000154115b80611ce357506001611cdf613080565b5111155b15611cf057506000611cf4565b5060015b919050565b6001546000908210611d0d57506000611cf4565b600b548210611d4a5760018281548110611d2357fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611cf4565b60018281548110611d5757fe5b9060005260206000209060040201600201601c9054906101000a900460ff16158015611da45750600b8281548110611d8b57fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b54611e6857611db9617ab6565b60015460005b81811015611e6457600b805460018101825560009190915283516000805160206190b083398151915260169092029182019081556020808601516000805160206190f08339815191528401805460ff1916911515919091179055604086015180518794611e40936000805160206190d0833981519152909101920190617ae5565b506060820151611e569060038301906013617b5f565b505050806001019050611dbf565b5050505b336110011480611e79575033612002145b611e955760405162461bcd60e51b8152600401610e12906186a7565b6001600160a01b03811660009081526004602052604090205480611eb95750611f0c565b6001810390506000600b8281548110611ece57fe5b600091825260209091206001601690920201015460ff169050611ef1838361521b565b8015611efa5750805b15610e32576009805460001901905550505b50565b60015460609081906000805b82811015611f625760018181548110611f3057fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611f5a576001909101905b600101611f1b565b50606081604051908082528060200260200182016040528015611f8f578160200160208202803683370190505b509050606082604051908082528060200260200182016040528015611fc857816020015b6060815260200190600190039081611fb35790505b50600b54600094509091508414156121435760005b8481101561213d5760018181548110611ff257fe5b9060005260206000209060040201600201601c9054906101000a900460ff16612135576001818154811061202257fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061204d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061207a57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156121125780601f106120e757610100808354040283529160200191612112565b820191906000526020600020905b8154815290600101906020018083116120f557829003601f168201915b505050505082858151811061212357fe5b60209081029190910101526001909301925b600101611fdd565b506121df565b60005b848110156121dd576001818154811061215b57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166121d5576001818154811061218b57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106121b657fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101612146565b505b909450925050505b9091565b600181565b61100181565b60085481565b6102ca81565b600881565b6060806000600e549050600080600c5411612223576015612227565b600c545b90506060612233613080565b905060606122408261631b565b9050828251116122575790945092506121e7915050565b83838351031015612269578282510393505b831561229f576014430461228583838388880360008a8a616489565b61229d8383838888038989038a8b8b8b510301616489565b505b6060836040519080825280602002602001820160405280156122cb578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561230457816020015b60608152602001906001900390816122ef5790505b50905060005b858110156123855784818151811061231e57fe5b602002602001015183828151811061233257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061235e57fe5b602002602001015182828151811061237257fe5b602090810291909101015260010161230a565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b038116600090815260046020526040812054806123cd576000915050611cf4565b6000190161113d81611cf9565b6001600160a01b03811660009081526004602052604081205480612402576000915050611cf4565b60018082038154811061241157fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b600f5481565b6012818154811061244857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156124d95780601f106124ae576101008083540402835291602001916124d9565b820191906000526020600020905b8154815290600101906020018083116124bc57829003601f168201915b505050505081565b60105481565b600181815481106124f457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b33612000146125a45760405162461bcd60e51b8152600401610e1290618db0565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f389021016058383836040516125d793929190618fec565b60405180910390a1505050565b60025481565b60115481565b60145460ff1681565b600a5481565b6001600160a01b038116600090815260046020526040812054806126355760405162461bcd60e51b8152600401610e1290618d38565b6000190192915050565b600b546126fd5761264e617ab6565b60015460005b818110156126f957600b805460018101825560009190915283516000805160206190b083398151915260169092029182019081556020808601516000805160206190f08339815191528401805460ff19169115159190911790556040860151805187946126d5936000805160206190d0833981519152909101920190617ae5565b5060608201516126eb9060038301906013617b5f565b505050806001019050612654565b5050505b60085461270a5760036008555b600a54612717576002600a555b6000612722336125ff565b905061272d81611c2a565b6127495760405162461bcd60e51b8152600401610e1290618a25565b611f0c33826165e0565b600981565b61100781565b600381565b601481565b61100681565b6040518060a00160405280607881526020016191106078913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff166127ca5760405162461bcd60e51b8152600401610e1290618670565b33611007146127eb5760405162461bcd60e51b8152600401610e1290618b1c565b61285584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506166789050565b156128f2576020811461287a5760405162461bcd60e51b8152600401610e1290618cf2565b604080516020601f84018190048102820181019092528281526000916128b8918585808385018382808284376000920191909152506166d192505050565b9050606481101580156128ce5750620186a08111155b6128ea5760405162461bcd60e51b8152600401610e1290618915565b60025561301e565b61295284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506166789050565b156129f557602081146129775760405162461bcd60e51b8152600401610e129061848e565b604080516020601f84018190048102820181019092528281526000916129b5918585808385018382808284376000920191909152506166d192505050565b90506127106129cf600f54836162f690919063ffffffff16565b11156129ed5760405162461bcd60e51b8152600401610e12906184c5565b60065561301e565b612a5f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506166789050565b15612af95760208114612a845760405162461bcd60e51b8152600401610e129061852d565b604080516020601f8401819004810282018101909252828152600091612ac2918585808385018382808284376000920191909152506166d192505050565b600c5490915080612ad1575060155b808210612af05760405162461bcd60e51b8152600401610e129061886d565b5060085561301e565b612b6284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506166789050565b15612bfb5760208114612b875760405162461bcd60e51b8152600401610e12906185f6565b604080516020601f8401819004810282018101909252828152600091612bc5918585808385018382808284376000920191909152506166d192505050565b9050600081118015612bd75750600a81105b612bf35760405162461bcd60e51b8152600401610e1290618e90565b600a5561301e565b612c6f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506166789050565b15612cfe5760208114612c945760405162461bcd60e51b8152600401610e12906185aa565b604080516020601f8401819004810282018101909252828152600091612cd2918585808385018382808284376000920191909152506166d192505050565b9050600d54811115612cf65760405162461bcd60e51b8152600401610e129061898b565b600e5561301e565b612d6784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506166789050565b15612de95760208114612d8c5760405162461bcd60e51b8152600401610e1290618b6a565b604080516020601f8401819004810282018101909252828152600091612dca918585808385018382808284376000920191909152506166d192505050565b600d819055600e54909150811015612de357600d54600e555b5061301e565b612e4d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506166789050565b15612efb5760208114612e725760405162461bcd60e51b8152600401610e129061863b565b604080516020601f8401819004810282018101909252828152600091612eb0918585808385018382808284376000920191909152506166d192505050565b905060008111612ed25760405162461bcd60e51b8152600401610e1290618715565b6064811115612ef35760405162461bcd60e51b8152600401610e129061875d565b600c5561301e565b612f6384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601181527073797374656d526577617264526174696f60781b602082015291506166789050565b156130065760208114612f885760405162461bcd60e51b8152600401610e1290618e4c565b604080516020601f8401819004810282018101909252828152600091612fc6918585808385018382808284376000920191909152506166d192505050565b9050612710612fe0600654836162f690919063ffffffff16565b1115612ffe5760405162461bcd60e51b8152600401610e1290618c53565b600f5561301e565b60405162461bcd60e51b8152600401610e1290618eed565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051613053949392919061845c565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156130af5761309b81611cf9565b156130a7578160010191505b60010161308a565b506060816040519080825280602002602001820160405280156130dc578160200160208202803683370190505b5090506000915060005b83811015613163576130f781611cf9565b1561315b576001818154811061310957fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061313457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b6001016130e6565b50925050505b90565b601581565b61027181565b61100281565b6013818154811061244857fe5b6000613194613080565b519050600080600c54116131a95760156131ad565b600c545b9050808211156131bb578091505b816131c557600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff161561320a5760405162461bcd60e51b8152600401610e1290618c1c565b613212617b8c565b60006132356040518060a001604052806078815260200161911060789139613e3c565b91509150806132565760405162461bcd60e51b8152600401610e1290618d6f565b61325e617ab6565b60005b83602001515181101561345f57600b805460018101825560009190915282516000805160206190b083398151915260169092029182019081556020808501516000805160206190f08339815191528401805460ff19169115159190911790556040850151805186946132e7936000805160206190d0833981519152909101920190617ae5565b5060608201516132fd9060038301906013617b5f565b5050508360400151818151811061331057fe5b6020026020010151600b828154811061332557fe5b90600052602060002090601602016002019080519060200190613349929190617ae5565b5060018460200151828151811061335c57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591870151805191850193918590811061343257fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101613261565b50506103e860025550506000805460ff19166001179055565b600d5481565b601354600090815b818110156135875761356f85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506013805490925085915081106134d757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156135655780601f1061353a57610100808354040283529160200191613565565b820191906000526020600020905b81548152906001019060200180831161354857829003601f168201915b50505050506166d6565b1561357f57600192505050611da4565b600101613486565b5060125460005b818110156135f8576135df86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506012805490925085915081106134d757fe5b156135f05760019350505050611da4565b60010161358e565b50600095945050505050565b33611001146136255760405162461bcd60e51b8152600401610e1290618f14565b600b546136e357613634617ab6565b60015460005b818110156136df57600b805460018101825560009190915283516000805160206190b083398151915260169092029182019081556020808601516000805160206190f08339815191528401805460ff19169115159190911790556040860151805187946136bb936000805160206190d0833981519152909101920190617ae5565b5060608201516136d19060038301906013617b5f565b50505080600101905061363a565b5050505b60006136ee8261673a565b90506136f981611c2a565b156118dd576118dd82826165e0565b606581565b601181565b3341146137315760405162461bcd60e51b8152600401610e1290618dff565b60005460ff166137535760405162461bcd60e51b8152600401610e1290618670565b600034116137735760405162461bcd60e51b8152600401610e129061895c565b3a156137915760405162461bcd60e51b8152600401610e1290618aee565b6001600160a01b03811660009081526004602052604090205460145434919060ff166137d157610271600f556103e86006556014805460ff191660011790555b6000821180156137e357506000600f54115b15613895576000613811612710613805600f54346168bd90919063ffffffff16565b9063ffffffff6168f716565b90508015613893576040516110029082156108fc029083906000818181858888f19350505050158015613848573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516138789190618fa3565b60405180910390a1613890838263ffffffff6162b416565b92505b505b6000821180156138a757506000600654115b1561394d5760006138c9612710613805600654346168bd90919063ffffffff16565b9050801561394b5760405161dead9082156108fc029083906000818181858888f19350505050158015613900573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516139309190618fa3565b60405180910390a1613948838263ffffffff6162b416565b92505b505b8015613a4b57600060018083038154811061396457fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156139d157836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4846040516139c49190618fa3565b60405180910390a2613a45565b6003546139e4908463ffffffff6162f616565b60039081558101546139fc908463ffffffff6162f616565b60038201556040516001600160a01b038516907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590613a3c908690618fa3565b60405180910390a25b50610e32565b826001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b483604051613a849190618fa3565b60405180910390a2505050565b600e5481565b61100081565b61dead81565b600b8181548110613ab057fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015613b5b5780601f10613b3057610100808354040283529160200191613b5b565b820191906000526020600020905b815481529060010190602001808311613b3e57829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613b7c575081155b80613b875750600954155b15613b945750600061113d565b60096000815460019003919050819055506000613bdf600a5461380585613805600b8981548110613bc157fe5b6000918252602090912060169091020154439063ffffffff6162b416565b90506000600b8581548110613bf057fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015613c5557600080fd5b505afa158015613c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8d9190618179565b9150915060009350808310613dec57613ca6878761521b565b5060405163436aa28360e11b8152600090612002906386d5450690613ccf908b906004016182b6565b60206040518083038186803b158015613ce757600080fd5b505afa158015613cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1f9190617f26565b6001600160a01b031614613d8b576040516313d13bdb60e31b815261100190639e89ded890613d54908a9087906004016182ca565b600060405180830381600087803b158015613d6e57600080fd5b505af1158015613d82573d6000803e3d6000fd5b50505050613de3565b6040516305bfb49960e41b815261100190635bfb499090613db0908a906004016182b6565b600060405180830381600087803b158015613dca57600080fd5b505af1158015613dde573d6000803e3d6000fd5b505050505b60019350613dfe565b818310613dfe57613dfc8761673a565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b613e44617b8c565b6000613e4e617b8c565b613e56617c29565b613e67613e6286616939565b61695e565b90506000805b613e76836169a8565b15613fea5780613e9b57613e91613e8c846169c9565b616a17565b60ff168452613fe2565b8060011415613fdd576060613eb7613eb2856169c9565b616a97565b90508051604051908082528060200260200182016040528015613ef457816020015b613ee1617bb0565b815260200190600190039081613ed95790505b5085602001819052508051604051908082528060200260200182016040528015613f3257816020015b6060815260200190600190039081613f1d5790505b50604086015260005b8151811015613fd257613f4c617bb0565b60606000613f6c858581518110613f5f57fe5b6020026020010151616b68565b92509250925080613f8c578860009a509a50505050505050505050613ff3565b8289602001518581518110613f9d57fe5b60200260200101819052508189604001518581518110613fb957fe5b6020026020010181905250505050806001019050613f3b565b506001925050613fe2565b613fea565b600101613e6d565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816140125790505090506140388363ffffffff16616c82565b8160008151811061404557fe5b602002602001018190525061113d81616c95565b600060648351111561409057600080516020619090833981519152604051614080906187ba565b60405180910390a1506066611da4565b60005b835181101561412e5760005b81811015614125578481815181106140b357fe5b6020026020010151600001516001600160a01b03168583815181106140d457fe5b6020026020010151600001516001600160a01b0316141561411d5760008051602061909083398151915260405161410a906188ca565b60405180910390a1606692505050611da4565b60010161409f565b50600101614093565b5060608060606015805480602002602001604051908101604052809291908181526020016000905b828210156141e05760008481526020908190206040805160c0810182526004860290920180546001600160a01b039081168452600180830154821685870152600283015491821693850193909352600160a01b81046001600160401b03166060850152600160e01b900460ff16151560808401526003015460a08301529083529092019101614156565b50505050905060606016805480602002602001604051908101604052809291908181526020016000905b828210156142b55760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156142a15780601f10614276576101008083540402835291602001916142a1565b820191906000526020600020905b81548152906001019060200180831161428457829003601f168201915b50505050508152602001906001019061420a565b50505050905060005b8251811015614312578281815181106142d357fe5b6020026020010151606001516003028382815181106142ee57fe5b60209081029190910101516001600160401b039091166060909101526001016142be565b5060608061432289898686616d1f565b9150915061433082826155de565b6001546040805182815260208084028201019091529298509096506000955085945092506060915082801561436f578160200160208202803683370190505b50905060005b828110156145005760006001600160a01b03166120026001600160a01b03166386d54506600184815481106143a657fe5b60009182526020909120600491820201546040516001600160e01b031960e085901b1681526143e1926001600160a01b0390921691016182b6565b60206040518083038186803b1580156143f957600080fd5b505afa15801561440d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144319190617f26565b6001600160a01b03161461449357600182828151811061444d57fe5b602002602001019060ff16908160ff16815250506001818154811061446e57fe5b90600052602060002090600402016003015460001461448e578360010193505b6144f8565b67016345785d8a0000600182815481106144a957fe5b906000526020600020906004020160030154106144cb578460010194506144f8565b600181815481106144d857fe5b9060005260206000209060040201600301546000146144f8578360010193505b600101614375565b5060608460405190808252806020026020018201604052801561452d578160200160208202803683370190505b50905060608560405190808252806020026020018201604052801561455c578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561458b578160200160208202803683370190505b5090506060876040519080825280602002602001820160405280156145ba578160200160208202803683370190505b50905060006060886040519080825280602002602001820160405280156145eb578160200160208202803683370190505b50905060608960405190808252806020026020018201604052801561461a578160200160208202803683370190505b50905060009a506000995060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561466257600080fd5b505afa158015614676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469a9190618161565b905067016345785d8a00008111156146e6576000805160206190908339815191526040516146c790618bdb565b60405180910390a160689e505050505050505050505050505050611da4565b60005b8a811015614a7a578981815181106146fd57fe5b602002602001015160ff16600114156147f3576001818154811061471d57fe5b9060005260206000209060040201600301546000146147ee576001818154811061474357fe5b600091825260209091206004909102015484516001600160a01b039091169085908e90811061476e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061479b57fe5b906000526020600020906004020160030154838d815181106147b957fe5b60200260200101818152505060018a8d815181106147d357fe5b602002602001019060ff16908160ff16815250508b6001019b505b614a72565b67016345785d8a00006001828154811061480957fe5b9060005260206000209060040201600301541061498e576001818154811061482d57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898e8151811061485e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be4006001838154811061489357fe5b906000526020600020906004020160030154816148ac57fe5b06600183815481106148ba57fe5b9060005260206000209060040201600301540390506148e283826162b490919063ffffffff16565b898f815181106148ee57fe5b6020026020010181815250506001828154811061490757fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878f8151811061493857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888f8151811061496557fe5b6020908102919091010152614980868263ffffffff6162f616565b95508d6001019d5050614a72565b6001818154811061499b57fe5b906000526020600020906004020160030154600014614a7257600181815481106149c157fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848d815181106149f257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060018181548110614a1f57fe5b906000526020600020906004020160030154838d81518110614a3d57fe5b60200260200101818152505060008a8d81518110614a5757fe5b602002602001019060ff16908160ff16815250508b6001019b505b6001016146e9565b5060008415614cf0576002546040516303702b2960e51b815261100491636e056520918891614ab4918e918e918d914201906004016183c4565b6020604051808303818588803b158015614acd57600080fd5b505af193505050508015614afe575060408051601f3d908101601f19168201909252614afb9181019061808e565b60015b614c75576040516000815260443d1015614b1a57506000614bb5565b60046000803e60005160e01c6308c379a08114614b3b576000915050614bb5565b60043d036004833e81513d60248201116001600160401b0382111715614b6657600092505050614bb5565b80830180516001600160401b03811115614b87576000945050505050614bb5565b8060208301013d8601811115614ba557600095505050505050614bb5565b601f01601f191660405250925050505b80614bc05750614c02565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051614bf49190618449565b60405180910390a250614c70565b3d808015614c2c576040519150601f19603f3d011682016040523d82523d6000602084013e614c31565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051614c669190618449565b60405180910390a2505b614cf0565b8015614cb7577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051614caa9190618fa3565b60405180910390a1614cee565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051614ce590618573565b60405180910390a25b505b8015614ea65760005b8751811015614ea4576000888281518110614d1057fe5b60200260200101519050600060018281548110614d2957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110614d5a57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015614e165760018281548110614d9b57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110614dea57fe5b906000526020600020906004020160030154604051614e099190618fa3565b60405180910390a2614e9a565b60018281548110614e2357fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110614e7257fe5b906000526020600020906004020160030154604051614e919190618fa3565b60405180910390a25b5050600101614cf9565b505b83511561509c5760005b845181101561509a578a8181518110614ec557fe5b602002602001015160ff1660011415614f64576120026001600160a01b031663092193ab858381518110614ef557fe5b6020026020010151878481518110614f0957fe5b60200260200101516040518363ffffffff1660e01b8152600401614f2d91906182b6565b6000604051808303818588803b158015614f4657600080fd5b505af1158015614f5a573d6000803e3d6000fd5b5050505050615092565b6000858281518110614f7257fe5b60200260200101516001600160a01b03166108fc868481518110614f9257fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561502857858281518110614fc857fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d86848151811061500657fe5b602002602001015160405161501b9190618fa3565b60405180910390a2615090565b85828151811061503457fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d86848151811061507257fe5b60200260200101516040516150879190618fa3565b60405180910390a25b505b600101614eb0565b505b5050505050505050505050505060005b60015481101561510957600181815481106150c357fe5b906000526020600020906004020160030154600014615101576000600182815481106150eb57fe5b9060005260206000209060040201600301819055505b6001016150ac565b504715615177577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d4760405161513f9190618fa3565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015615175573d6000803e3d6000fd5b505b60006003819055600555815115615192576151928282615ac5565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156151cf57600080fd5b505af11580156151e3573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b6000806001838154811061522b57fe5b90600052602060002090600402016003015490506000600180805490500390506001615255613080565b511161528a5760006001858154811061526a57fe5b906000526020600020906004020160030181905550600092505050611da4565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516152c39190618fa3565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156154b0576001816001018154811061530457fe5b90600052602060002090600402016001828154811061531f57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b8054909183019081106153e057fe5b9060005260206000209060160201600b82815481106153fb57fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff1990921691909117905560028084018054615452938386019390821615610100026000190190911604617c49565b5061546560038281019084016013617cbe565b5090505080600101600460006001848154811061547e57fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020556001016152e6565b5060018054806154bc57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061550f57fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906155416002830182617be5565b61554f600383016000617ce8565b50509055600081838161555e57fe5b04905080156155d25760015460005b818110156155cf576155a6836001838154811061558657fe5b9060005260206000209060040201600301546162f690919063ffffffff16565b600182815481106155b357fe5b600091825260209091206003600490920201015560010161556d565b50505b50600195945050505050565b6060806000808080806155ef61318a565b6001549091505b801561581e57600181039250600b838154811061560f57fe5b600091825260209091206001601690920201015460ff1661562f57615815565b6001838154811061563c57fe5b60009182526020909120600490910201546001600160a01b03169450615663858484613b6b565b93508361566f57615815565b60405163436aa28360e11b81526000908190612002906386d5450690615699908a906004016182b6565b60206040518083038186803b1580156156b157600080fd5b505afa1580156156c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156e99190617f26565b90506001600160a01b03811615615772576040516302ceee9160e11b81526120029063059ddd229061571f9084906004016182b6565b60206040518083038186803b15801561573757600080fd5b505afa15801561574b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061576f9190617f26565b91505b60005b8c5181101561581157876001600160a01b03168d828151811061579457fe5b6020026020010151600001516001600160a01b031614806157dd5750826001600160a01b03168d82815181106157c657fe5b6020026020010151600001516001600160a01b0316145b156158095760018d82815181106157f057fe5b6020908102919091010151901515608090910152615811565b600101615775565b5050505b600019016155f6565b5060005b895181101561588b5789818151811061583757fe5b60200260200101516080015180615877575060006001600160a01b03168a828151811061586057fe5b6020026020010151600001516001600160a01b0316145b15615883578560010195505b600101615822565b50885185106159735760408051600180825281830190925290816020015b6158b1617bb0565b8152602001906001900390816158a9575050604080516001808252818301909252919850602082015b60608152602001906001900390816158da579050509550886000815181106158fe57fe5b60200260200101518760008151811061591357fe5b60200260200101819052508760008151811061592b57fe5b60200260200101518660008151811061594057fe5b602002602001018190525060008760008151811061595a57fe5b6020908102919091010151901515608090910152615ab8565b848951036040519080825280602002602001820160405280156159b057816020015b61599d617bb0565b8152602001906001900390816159955790505b509650848951036040519080825280602002602001820160405280156159ea57816020015b60608152602001906001900390816159d55790505b5095506000915060005b8951811015615ab657898181518110615a0957fe5b602002602001015160800151158015615a4c575060006001600160a01b03168a8281518110615a3457fe5b6020026020010151600001516001600160a01b031614155b15615aae57898181518110615a5d57fe5b6020026020010151888481518110615a7157fe5b6020026020010181905250888181518110615a8857fe5b6020026020010151878481518110615a9c57fe5b60200260200101819052508260010192505b6001016159f4565b505b50505050505b9250929050565b600154825160005b82811015615be2576001615adf617bb0565b60018381548110615aec57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015615bb657878181518110615b7c57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615bae5760009250615bb6565b600101615b68565b508115615bd85780516001600160a01b03166000908152600460205260408120555b5050600101615acd565b5080821115615ca157805b82811015615c9f576001805480615c0057fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480615c5357fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590615c856002830182617be5565b615c93600383016000617ce8565b50509055600101615bed565b505b6000818310615cb05781615cb2565b825b905060005b8181101561605657615d64868281518110615cce57fe5b602002602001015160018381548110615ce357fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a08201526170eb565b615f18578060010160046000888481518110615d7c57fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110615db857fe5b602002602001015160018281548110615dcd57fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101558451859082908110615e8857fe5b6020026020010151600b8281548110615e9d57fe5b90600052602060002090601602016002019080519060200190615ec1929190617ae5565b506000600b8281548110615ed157fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b805483908110615f0257fe5b600091825260209091206016909102015561604e565b858181518110615f2457fe5b60200260200101516060015160018281548110615f3d57fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b03160217905550616003858281518110615f8157fe5b6020026020010151600b8381548110615f9657fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156135655780601f1061353a57610100808354040283529160200191613565565b61604e5784818151811061601357fe5b6020026020010151600b828154811061602857fe5b9060005260206000209060160201600201908051906020019061604c929190617ae5565b505b600101615cb7565b508282111561622e57616067617ab6565b835b8381101561622b5785818151811061607d57fe5b60200260200101518260400181905250600187828151811061609b57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b80549283018155909352845160169091026000805160206190b08339815191528101918255858301516000805160206190f08339815191528201805491151560ff19909216919091179055928501518051869492936161d1936000805160206190d083398151915201920190617ae5565b5060608201516161e79060038301906013617b5f565b50505080600101600460008984815181106161fe57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101616069565b50505b616236617147565b61623e61732f565b6000600981905560015493505b838110156162ac576000600b828154811061626257fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061629357fe5b600091825260209091206016909102015560010161624b565b505050505050565b600061113d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061751d565b60008282018381101561113d5760405162461bcd60e51b8152600401610e12906186de565b60015481516040805182815260208084028201019091526060929190839082801561635a57816020015b60608152602001906001900390816163455790505b50600b549091508314616371579250611cf4915050565b60005b8281101561648057600b60016004600089858151811061639057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106163c457fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561645c5780601f106164315761010080835404028352916020019161645c565b820191906000526020600020905b81548152906001019060200180831161643f57829003601f168201915b505050505082828151811061646d57fe5b6020908102919091010152600101616374565b50949350505050565b60005b828110156165d657600082878388016040516020016164ac9291906182a8565b6040516020818303038152906040528051906020012060001c816164cc57fe5b069050808501828701146165cd57600089838801815181106164ea57fe5b602002602001015190506060898489018151811061650457fe5b602002602001015190508a8388018151811061651c57fe5b60200260200101518b858a018151811061653257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061656157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061658f57fe5b60200260200101518a858a01815181106165a557fe5b6020026020010181905250808a848901815181106165bf57fe5b602002602001018190525050505b5060010161648c565b5050505050505050565b600980546001908101909155600b8054839081106165fa57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061663057fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b60008160405160200161668b919061828c565b60405160208183030381529060405280519060200120836040516020016166b2919061828c565b6040516020818303038152906040528051906020012014905092915050565b015190565b8151815160009160019181148083146166f25760009250616730565b600160208701838101602088015b60028483851001141561672b57805183511461671f5760009650600093505b60209283019201616700565b505050505b5090949350505050565b6001600160a01b0381166000908152600460205260408120548061676357506000199050611cf4565b60018103905060006001828154811061677857fe5b906000526020600020906004020160030154905060006001838154811061679b57fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d906167f4908590618fa3565b60405180910390a28061680c57829350505050611cf4565b600081838161681757fe5b04905080156168b35760005b848110156168655761683c826001838154811061558657fe5b6001828154811061684957fe5b6000918252602090912060036004909202010155600101616823565b50600180549085015b818110156168b057616887836001838154811061558657fe5b6001828154811061689457fe5b600091825260209091206003600490920201015560010161686e565b50505b5091949350505050565b6000826168cc57506000611da4565b828202828482816168d957fe5b041461113d5760405162461bcd60e51b8152600401610e1290618aad565b600061113d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250617549565b616941617cf7565b506040805180820190915281518152602082810190820152919050565b616966617c29565b61696f82617580565b61697857600080fd5b600061698783602001516175ba565b60208085015160408051808201909152868152920190820152915050919050565b60006169b2617cf7565b505080518051602091820151919092015191011190565b6169d1617cf7565b6169da826169a8565b6169e357600080fd5b602082015160006169f38261761d565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590616a2c57508151602110155b616a3557600080fd5b6000616a4483602001516175ba565b90508083600001511015616a6a5760405162461bcd60e51b8152600401610e1290618cbb565b82516020808501518301805192849003929183101561648057506020919091036101000a90049392505050565b6060616aa282617580565b616aab57600080fd5b6000616ab6836176fe565b9050606081604051908082528060200260200182016040528015616af457816020015b616ae1617cf7565b815260200190600190039081616ad95790505b5090506000616b0685602001516175ba565b60208601510190506000805b84811015616b5d57616b238361761d565b9150604051806040016040528083815260200184815250848281518110616b4657fe5b602090810291909101015291810191600101616b12565b509195945050505050565b616b70617bb0565b60606000616b7c617bb0565b6060616b86617c29565b616b8f8761695e565b90506000805b616b9e836169a8565b15616c735780616bc957616bb9616bb4846169c9565b61775a565b6001600160a01b03168552616c6b565b8060011415616bf157616bde616bb4846169c9565b6001600160a01b03166020860152616c6b565b8060021415616c1957616c06616bb4846169c9565b6001600160a01b03166040860152616c6b565b8060031415616c4557616c2e613e8c846169c9565b6001600160401b0316606086015260019150616c6b565b8060041415616c6657616c5f616c5a846169c9565b617774565b9350616c6b565b616c73565b600101616b95565b50929791965091945092505050565b6060611da4616c90836177e4565b6178ca565b6060815160001415616cb65750604080516000815260208101909152611cf4565b606082600081518110616cc557fe5b602002602001015190506000600190505b8351811015616d0657616cfc82858381518110616cef57fe5b602002602001015161791c565b9150600101616cd6565b5061113d616d19825160c060ff16617999565b8261791c565b60608060006120026001600160a01b031663c473318f6040518163ffffffff1660e01b815260040160206040518083038186803b158015616d5f57600080fd5b505afa158015616d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616d979190618161565b90508085518851011015616dac575083518651015b606081604051908082528060200260200182016040528015616de857816020015b616dd5617bb0565b815260200190600190039081616dcd5790505b509050606082604051908082528060200260200182016040528015616e2157816020015b6060815260200190600190039081616e0c5790505b50905060008060005b8b51831080616e395750895182105b8015616e4457508581105b156170d9578b51831415616eb457898281518110616e5e57fe5b6020026020010151858281518110616e7257fe5b6020026020010181905250888281518110616e8957fe5b6020026020010151848281518110616e9d57fe5b602090810291909101015260019182019101616e2a565b8951821415616f1f578b8381518110616ec957fe5b6020026020010151858281518110616edd57fe5b60200260200101819052508a8381518110616ef457fe5b6020026020010151848281518110616f0857fe5b602090810291909101015260019283019201616e2a565b898281518110616f2b57fe5b6020026020010151606001516001600160401b03168c8481518110616f4c57fe5b6020026020010151606001516001600160401b03161115616fc8578b8381518110616f7357fe5b6020026020010151858281518110616f8757fe5b60200260200101819052508a8381518110616f9e57fe5b6020026020010151848281518110616fb257fe5b60200260200101819052508260010192506170d1565b898281518110616fd457fe5b6020026020010151606001516001600160401b03168c8481518110616ff557fe5b6020026020010151606001516001600160401b031610156170715789828151811061701c57fe5b602002602001015185828151811061703057fe5b602002602001018190525088828151811061704757fe5b602002602001015184828151811061705b57fe5b60200260200101819052508160010191506170d1565b89828151811061707d57fe5b6020026020010151600001516001600160a01b03168c848151811061709e57fe5b6020026020010151600001516001600160a01b031610156170c5578b8381518110616f7357fe5b898281518110616e5e57fe5b600101616e2a565b50929a91995090975050505050505050565b805182516000916001600160a01b039182169116148015617125575081602001516001600160a01b031683602001516001600160a01b0316145b801561113d5750506040908101519101516001600160a01b0390811691161490565b6012546013548082111561719257805b8281101561719057601280548061716a57fe5b6001900381819060005260206000200160006171869190617be5565b9055600101617157565b505b60008183106171a157816171a3565b825b905060005b818110156172bb57617260601282815481106171c057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561724e5780601f106172235761010080835404028352916020019161724e565b820191906000526020600020905b81548152906001019060200180831161723157829003601f168201915b5050505050601383815481106134d757fe5b6172b3576013818154811061727157fe5b906000526020600020016012828154811061728857fe5b9060005260206000200190805460018160011615610100020316600290046172b1929190617c49565b505b6001016171a8565b5082821115610e3257825b82811015617329576012601382815481106172dd57fe5b6000918252602080832084546001818101875595855291909320929091018054617320949390920192909160026101009282161592909202600019011604617c49565b506001016172c6565b50505050565b601354600b548082111561737a57805b8281101561737857601380548061735257fe5b60019003818190600052602060002001600061736e9190617be5565b905560010161733f565b505b6000818310617389578161738b565b825b905060005b818110156174aa57617448601382815481106173a857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156174365780601f1061740b57610100808354040283529160200191617436565b820191906000526020600020905b81548152906001019060200180831161741957829003601f168201915b5050505050600b8381548110615f9657fe5b6174a257600b818154811061745957fe5b90600052602060002090601602016002016013828154811061747757fe5b9060005260206000200190805460018160011615610100020316600290046174a0929190617c49565b505b600101617390565b5082821115610e3257825b82811015617329576013600b82815481106174cc57fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461751495939094019390926000199082161561010002011604617c49565b506001016174b5565b600081848411156175415760405162461bcd60e51b8152600401610e129190618449565b505050900390565b6000818361756a5760405162461bcd60e51b8152600401610e129190618449565b50600083858161757657fe5b0495945050505050565b805160009061759157506000611cf4565b6020820151805160001a9060c08210156175b057600092505050611cf4565b5060019392505050565b8051600090811a60808110156175d4576000915050611cf4565b60b88110806175ef575060c081108015906175ef575060f881105b156175fe576001915050611cf4565b60c08110156176125760b519019050611cf4565b60f519019050611cf4565b80516000908190811a608081101561763857600191506176f7565b60b881101561764d57607e19810191506176f7565b60c081101561769e57600060b78203600186019550806020036101000a8651049150600181018201935050808310156176985760405162461bcd60e51b8152600401610e12906189fa565b506176f7565b60f88110156176b35760be19810191506176f7565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156176f55760405162461bcd60e51b8152600401610e12906189fa565b505b5092915050565b805160009061770f57506000611cf4565b6000809050600061772384602001516175ba565b602085015185519181019250015b80821015617751576177428261761d565b82019150826001019250617731565b50909392505050565b805160009060151461776b57600080fd5b611da482616a17565b805160609061778257600080fd5b600061779183602001516175ba565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156177c8576020820181803683370190505b5090506000816020019050616480848760200151018285617a6b565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166178285750601861784c565b6fffffffffffffffffffffffffffffffff1984166178485750601061784c565b5060005b60208110156178825781818151811061786157fe5b01602001516001600160f81b0319161561787a57617882565b60010161784c565b60008160200390506060816040519080825280601f01601f1916602001820160405280156178b7576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156178fc5750607f60f81b826000815181106178ea57fe5b01602001516001600160f81b03191611155b15617908575080611cf4565b611da461791a8351608060ff16617999565b835b6060806040519050835180825260208201818101602087015b8183101561794d578051835260209283019201617935565b50855184518101855292509050808201602086015b8183101561797a578051835260209283019201617962565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106179c35760405162461bcd60e51b8152600401610e1290618845565b60408051600180825281830190925260609160208201818036833701905050905060378411617a1d5782840160f81b816000815181106179ff57fe5b60200101906001600160f81b031916908160001a9053509050611da4565b6060617a28856177e4565b90508381510160370160f81b82600081518110617a4157fe5b60200101906001600160f81b031916908160001a905350617a62828261791c565b95945050505050565b80617a7557610e32565b5b60208110617a95578251825260209283019290910190601f1901617a76565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001617ae0617d11565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617b2657805160ff1916838001178555617b53565b82800160010185558215617b53579182015b82811115617b53578251825591602001919060010190617b38565b506131c5929150617d30565b8260138101928215617b535791602002820182811115617b53578251825591602001919060010190617b38565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b50805460018160011615610100020316600290046000825580601f10617c0b5750611f0c565b601f016020900490600052602060002090810190611f0c9190617d30565b6040518060400160405280617c3c617cf7565b8152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617c825780548555617b53565b82800160010185558215617b5357600052602060002091601f016020900482015b82811115617b53578254825591600101919060010190617ca3565b8260138101928215617b535791820182811115617b53578254825591600101919060010190617ca3565b50611f0c906013810190617d30565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61316991905b808211156131c55760008155600101617d36565b8035611da48161907a565b60008083601f840112617d66578182fd5b5081356001600160401b03811115617d7c578182fd5b6020830191508360208083028501011115615abe57600080fd5b6000601f8381840112617da7578182fd5b8235617dba617db58261902f565b619009565b818152925060208084019085810160005b84811015617e4c578135880189603f820112617de657600080fd5b838101356001600160401b03811115617dfe57600080fd5b617e0f818901601f19168601619009565b81815260408c81848601011115617e2557600080fd5b82818501888401375060009181018601919091528552509282019290820190600101617dcb565b50505050505092915050565b600082601f830112617e68578081fd5b8135617e76617db58261902f565b818152915060208083019084810181840286018201871015617e9757600080fd5b6000805b85811015617e4c5782356001600160401b0381168114617eb9578283fd5b85529383019391830191600101617e9b565b60008083601f840112617edc578182fd5b5081356001600160401b03811115617ef2578182fd5b602083019150836020828501011115615abe57600080fd5b600060208284031215617f1b578081fd5b813561113d8161907a565b600060208284031215617f37578081fd5b815161113d8161907a565b60008060008060408587031215617f57578283fd5b84356001600160401b0380821115617f6d578485fd5b617f7988838901617d55565b90965094506020870135915080821115617f91578384fd5b50617f9e87828801617d55565b95989497509550505050565b600080600060608486031215617fbe578283fd5b83356001600160401b0380821115617fd4578485fd5b81860187601f820112617fe5578586fd5b80359250617ff5617db58461902f565b80848252602080830192508084018b82838902870101111561801557898afd5b8994505b8685101561803f5761802b8c82617d4a565b845260019490940193928101928101618019565b509097508801359350505080821115618056578384fd5b61806287838801617e58565b93506040860135915080821115618077578283fd5b5061808486828701617d96565b9150509250925092565b60006020828403121561809f578081fd5b8151801515811461113d578182fd5b600080602083850312156180c0578182fd5b82356001600160401b038111156180d5578283fd5b6180e185828601617ecb565b90969095509350505050565b60008060008060408587031215618102578384fd5b84356001600160401b0380821115618118578586fd5b61812488838901617ecb565b9096509450602087013591508082111561813c578384fd5b50617f9e87828801617ecb565b60006020828403121561815a578081fd5b5035919050565b600060208284031215618172578081fd5b5051919050565b6000806040838503121561818b578182fd5b505080516020909101519092909150565b6000806000604084860312156181b0578081fd5b833560ff811681146181c0578182fd5b925060208401356001600160401b038111156181da578182fd5b6181e686828701617ecb565b9497909650939450505050565b6000815180845260208085019450808401835b8381101561822b5781516001600160a01b031687529582019590820190600101618206565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000815180845261827881602086016020860161904e565b601f01601f19169290920160200192915050565b6000825161829e81846020870161904e565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0392909216825260ff16602082015260400190565b60006020825261113d60208301846181f3565b60006040825261836760408301856181f3565b602083820381850152818551808452828401915082838202850101838801865b838110156183b557601f198784030185526183a3838351618260565b94860194925090850190600101618387565b50909998505050505050505050565b6000608082526183d760808301876181f3565b828103602084810191909152865180835287820192820190845b8181101561840d578451835293830193918301916001016183f1565b5050848103604086015261842181886181f3565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b60006020825261113d6020830184618260565b600060408252618470604083018688618236565b8281036020840152618483818587618236565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526042908201527f746865206275726e526174696f20706c75732073797374656d5265776172645260408201527f6174696f206d757374206265206e6f2067726561746572207468616e20313030606082015261030360f41b608082015260a00190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526042908201527f7468652073797374656d526577617264526174696f20706c7573206275726e5260408201527f6174696f206d757374206265206e6f2067726561746572207468616e20313030606082015261030360f41b608082015260a00190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526024908201527f6c656e677468206f662073797374656d526577617264526174696f206d69736d6040820152630c2e8c6d60e31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152617a626060830184618260565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152617a62604083018486618236565b6040518181016001600160401b038111828210171561902757600080fd5b604052919050565b60006001600160401b03821115619044578081fd5b5060209081020190565b60005b83811015619069578181015183820152602001619051565b838111156173295750506000910152565b6001600160a01b0381168114611f0c57600080fdfe70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaf87680f873f871949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d79164b085e6972fc98cd3c81d64d40e325acfed44365b97a7567a27939c14dbc7512ddcf54cb1284eb637cfa308ae4e00cb5588a164736f6c6343000604000a", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", + Code: "6080604052600436106104fb5760003560e01c806388b32f111161028c578063c6d339451161015a578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d2d578063f9a2bbc714610d42578063fc3e590814610d57578063fccc281314610d6c578063fd4ad81f14610d81578063fd6a687914610db057610502565b8063e40716a114610c9b578063ea321e4914610cb0578063eb57e20214610cd0578063eda5868c14610cf0578063f1fad10414610d05578063f340fa0114610d1a57610502565b8063d86222d51161011e578063d86222d514610c1d578063daacdb6614610c32578063dc927faf14610c47578063df8079e914610c5c578063e086c7b114610c71578063e1c7392a14610c8657610502565b8063c6d3394514610bbe578063c81b166214610bd3578063c8509d811461098d578063ce910b0c14610be8578063d68fb56a14610c0857610502565b8063a78abc16116101fe578063ad3c9da6116101b7578063ad3c9da614610b3d578063aef198a914610b5d578063b7ab4db514610b72578063b8cf4ef114610b94578063bf9f4995146106fe578063c466689d14610ba957610502565b8063a78abc1614610ab4578063aa82dce114610ac9578063aad5606314610ade578063aaf5eb6814610af3578063ab51bb9614610b08578063ac43175114610b1d57610502565b806396713da91161025057806396713da914610a365780639dc0926214610a4b5780639fe0f81614610a60578063a0dc275814610a75578063a1a11bf514610a8a578063a5422d5c14610a9f57610502565b806388b32f11146109c25780638a7beb01146109d75780638b5ad0c9146109ec5780638d19a41014610a015780639369d7de14610a2157610502565b806351b4dce3116103c957806370fd5bad1161033b5780637e434d54116102f45780637e434d541461094e57806381650b6214610963578063820dcaa814610978578063831d65d11461098d578063853230aa1461090f57806386249882146109ad57610502565b806370fd5bad146108d0578063718a8aa8146108e557806375d47a0a146108fa57806378dfed4a1461090f5780637942fd05146109245780637a84ca2a1461093957610502565b80635d77156c1161038d5780635d77156c1461082a5780635de1e22c1461083f57806360eba4fe1461085457806362b72cf5146108745780636969a25c146108895780636e47b482146108bb57610502565b806351b4dce3146107ab57806351e80672146107c057806355614fcc146107d5578063565c56b3146107f55780635667515a1461081557610502565b8063300c35671161046d57806343756e5c1161042657806343756e5c1461072057806345cf9daf14610735578063493279b11461074a5780634bf6c8821461076c5780634df6e0c3146107815780635192c82c1461079657610502565b8063300c35671461065b578063321d398a1461067b5780633365af3a1461069b57806335409f7f146106bb5780633b071dcc146106db5780633dffc387146106fe57610502565b8063152ad3b8116104bf578063152ad3b8146105ba5780631e4c1524146105dc5780631ff18069146105fc578063219f22d51461061157806328087028146106265780632a0ffb6e1461063b57610502565b806304c4fec61461050757806307a568471461051e5780630bee7a67146105495780630e2374a51461056b5780631182b8751461058d57610502565b3661050257005b600080fd5b34801561051357600080fd5b5061051c610dc5565b005b34801561052a57600080fd5b50610533610e37565b6040516105409190618f97565b60405180910390f35b34801561055557600080fd5b5061055e610e3d565b6040516105409190618fc1565b34801561057757600080fd5b50610580610e42565b60405161054091906182aa565b34801561059957600080fd5b506105ad6105a8366004618190565b610e48565b604051610540919061843d565b3480156105c657600080fd5b506105cf611144565b6040516105409190618432565b3480156105e857600080fd5b5061051c6105f7366004617f9e565b61114d565b34801561060857600080fd5b50610533611823565b34801561061d57600080fd5b5061055e611829565b34801561063257600080fd5b5061058061182e565b34801561064757600080fd5b5061051c610656366004617efe565b611834565b34801561066757600080fd5b5061051c610676366004617f36565b6118e1565b34801561068757600080fd5b506105cf61069636600461813d565b611c2a565b3480156106a757600080fd5b506105cf6106b636600461813d565b611cf9565b3480156106c757600080fd5b5061051c6106d6366004617efe565b611daa565b3480156106e757600080fd5b506106f0611f0f565b604051610540929190618348565b34801561070a57600080fd5b506107136121eb565b6040516105409190618fd2565b34801561072c57600080fd5b506105806121f0565b34801561074157600080fd5b506105336121f6565b34801561075657600080fd5b5061075f6121fc565b6040516105409190618f88565b34801561077857600080fd5b50610713612202565b34801561078d57600080fd5b506106f0612207565b3480156107a257600080fd5b50610533612393565b3480156107b757600080fd5b50610580612399565b3480156107cc57600080fd5b5061058061239f565b3480156107e157600080fd5b506105cf6107f0366004617efe565b6123a5565b34801561080157600080fd5b50610533610810366004617efe565b6123da565b34801561082157600080fd5b5061071361242b565b34801561083657600080fd5b5061055e612430565b34801561084b57600080fd5b50610533612435565b34801561086057600080fd5b506105ad61086f36600461813d565b61243b565b34801561088057600080fd5b506105336124e1565b34801561089557600080fd5b506108a96108a436600461813d565b6124e7565b604051610540969594939291906182d7565b3480156108c757600080fd5b5061058061254b565b3480156108dc57600080fd5b50610713612551565b3480156108f157600080fd5b50610713612556565b34801561090657600080fd5b5061058061255b565b34801561091b57600080fd5b50610533612561565b34801561093057600080fd5b50610713612567565b34801561094557600080fd5b5061053361256c565b34801561095a57600080fd5b50610580612572565b34801561096f57600080fd5b5061055e612578565b34801561098457600080fd5b5061053361257d565b34801561099957600080fd5b5061051c6109a8366004618190565b612583565b3480156109b957600080fd5b506105336125e4565b3480156109ce57600080fd5b506105336125ea565b3480156109e357600080fd5b506105cf6125f0565b3480156109f857600080fd5b506105336125f9565b348015610a0d57600080fd5b50610533610a1c366004617efe565b6125ff565b348015610a2d57600080fd5b5061051c61263f565b348015610a4257600080fd5b50610713612753565b348015610a5757600080fd5b50610580612758565b348015610a6c57600080fd5b5061053361275e565b348015610a8157600080fd5b50610533612763565b348015610a9657600080fd5b50610580612768565b348015610aab57600080fd5b506105ad61276e565b348015610ac057600080fd5b506105cf61278a565b348015610ad557600080fd5b50610580612793565b348015610aea57600080fd5b50610580612799565b348015610aff57600080fd5b5061053361279f565b348015610b1457600080fd5b5061055e61242b565b348015610b2957600080fd5b5061051c610b383660046180e1565b6127a8565b348015610b4957600080fd5b50610533610b58366004617efe565b613061565b348015610b6957600080fd5b50610533613073565b348015610b7e57600080fd5b50610b87613080565b6040516105409190618335565b348015610ba057600080fd5b5061053361316c565b348015610bb557600080fd5b50610533613171565b348015610bca57600080fd5b50610533612551565b348015610bdf57600080fd5b50610580613177565b348015610bf457600080fd5b506105ad610c0336600461813d565b61317d565b348015610c1457600080fd5b5061053361318a565b348015610c2957600080fd5b506105336131c9565b348015610c3e57600080fd5b506105336131d5565b348015610c5357600080fd5b506105806131db565b348015610c6857600080fd5b506105806131e1565b348015610c7d57600080fd5b50610533610e3d565b348015610c9257600080fd5b5061051c6131e7565b348015610ca757600080fd5b50610533613478565b348015610cbc57600080fd5b506105cf610ccb3660046180a2565b61347e565b348015610cdc57600080fd5b5061051c610ceb366004617efe565b613604565b348015610cfc57600080fd5b5061055e613708565b348015610d1157600080fd5b5061071361370d565b61051c610d28366004617efe565b613712565b348015610d3957600080fd5b50610533613a91565b348015610d4e57600080fd5b50610580613a97565b348015610d6357600080fd5b5061071361275e565b348015610d7857600080fd5b50610580613a9d565b348015610d8d57600080fd5b50610da1610d9c36600461813d565b613aa3565b60405161054093929190618fa0565b348015610dbc57600080fd5b50610580613b65565b6000610dd0336125ff565b9050600b8181548110610ddf57fe5b600091825260209091206001601690920201015460ff16610e1b5760405162461bcd60e51b8152600401610e1290618ba3565b60405180910390fd5b6000610e2561318a565b9050610e32338383613b6b565b505050565b60095481565b606481565b61200181565b60005460609060ff16610e6d5760405162461bcd60e51b8152600401610e1290618664565b600b54610f2b57610e7c617aaa565b60015460005b81811015610f2757600b805460018101825560009190915283516000805160206190a483398151915260169092029182019081556020808601516000805160206190e48339815191528401805460ff1916911515919091179055604086015180518794610f03936000805160206190c4833981519152909101920190617ad9565b506060820151610f199060038301906013617b53565b505050806001019050610e82565b5050505b610f33617b80565b6000610f7485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e3092505050565b9150915080610f9057610f876064613fec565b9250505061113d565b815160009060ff16610fb557610fae8360200151846040015161404d565b9050611109565b825160ff166001141561110557826020015151600114610ffa57600080516020619084833981519152604051610fea90618a5c565b60405180910390a1506067611100565b6000836020015160008151811061100d57fe5b602090810291909101810151516001600160a01b0381166000908152600490925260409091205490915080158061106e575060018082038154811061104e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b156110ac576040516001600160a01b038316907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26110f9565b60006110bb836001840361520f565b9050806110f7576040516001600160a01b038416907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a25b505b6000925050505b611109565b5060655b63ffffffff811661112e575050604080516000815260208101909152915061113d9050565b61113781613fec565b93505050505b9392505050565b60075460ff1681565b33411461116c5760405162461bcd60e51b8152600401610e1290618df3565b3a1561118a5760405162461bcd60e51b8152600401610e1290618ae2565b82516040805182815260208084028201019091526060908280156111c857816020015b6111b5617ba4565b8152602001906001900390816111ad5790505b50905060005b82811015611272576040518060c001604052808783815181106111ed57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200186838151811061122f57fe5b60200260200101516001600160401b03168152602001600015158152602001600081525082828151811061125f57fe5b60209081029190910101526001016111ce565b5060405163d31f968d60e01b81526120009063d31f968d9061129d9061100090600890600401618319565b60206040518083038186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ed9190618082565b156116105780516015548181111561138f57815b8181101561138d57601580548061131457fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055601680548061136757fe5b6001900381819060005260206000200160006113839190617bd9565b9055600101611301565b505b60005b828110156115cf578181106114b75760158482815181106113af57fe5b602090810291909101810151825460018181018555600094855293839020825160049092020180546001600160a01b039283166001600160a01b0319918216178255938301519481018054958316958516959095179094556040820151600285018054606085015160808601511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590961692909716919091179290921692909217169290921790915560a00151600390910155855160169087908390811061147f57fe5b602090810291909101810151825460018101845560009384529282902081516114b19491909101929190910190617ad9565b506115c7565b8381815181106114c357fe5b6020026020010151601582815481106114d857fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a090910151600390910155855186908290811061159357fe5b6020026020010151601682815481106115a857fe5b9060005260206000200190805190602001906115c5929190617ad9565b505b600101611392565b507fb8e726330a0dad1cf3d04e925663b17e391f1ed547d79b7f4e5f344119b44246826040516115ff9190618f97565b60405180910390a150505050610e32565b60608061161d83866155d2565b9150915060005b6001548110156117135760006001828154811061163d57fe5b90600052602060002090600402016003015490508060001461170a5760006001838154811061166857fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab826001858154811061169c57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b1681526116d7926001600160a01b0390921691016182aa565b6000604051808303818588803b1580156116f057600080fd5b505af1158015611704573d6000803e3d6000fd5b50505050505b50600101611624565b504715611781577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516117499190618f97565b60405180910390a1604051611002904780156108fc02916000818181858888f1935050505015801561177f573d6000803e3d6000fd5b505b6000600381905560055581511561179c5761179c8282615ab9565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b33612002146118555760405162461bcd60e51b8152600401610e1290618f51565b60005b6015548110156118dd57816001600160a01b03166015828154811061187957fe5b60009182526020909120600490910201546001600160a01b031614156118d5576001601582815481106118a857fe5b9060005260206000209060040201600201601c6101000a81548160ff0219169083151502179055506118dd565b600101611858565b5050565b3341146119005760405162461bcd60e51b8152600401610e1290618df3565b60105443116119215760405162461bcd60e51b8152600401610e12906187f7565b3a1561193f5760405162461bcd60e51b8152600401610e1290618ae2565b60005460ff166119615760405162461bcd60e51b8152600401610e1290618664565b60006110023168056bc75e2d63100000811115611998576119918168056bc75e2d6310000063ffffffff6162a816565b915061199f565b5050611c20565b6040516309a99b4f60e41b815261100290639a99b4f0906119c690309086906004016182be565b602060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190618155565b915081611a26575050611c20565b6000805b84811015611a5457858582818110611a3e57fe5b9050602002013582019150806001019050611a2a565b5080611a6257505050611c20565b6000806000805b89811015611c185784898983818110611a7e57fe5b90506020020135880281611a8e57fe5b0493508a8a82818110611a9d57fe5b9050602002016020810190611ab29190617efe565b6001600160a01b03811660009081526004602052604090205490935091508115611bce576000600180840381548110611ae757fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611b5457836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8586604051611b479190618f97565b60405180910390a2611bc8565b600354611b67908663ffffffff6162ea16565b6003908155810154611b7f908663ffffffff6162ea16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611bbf908890618f97565b60405180910390a25b50611c10565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8585604051611c079190618f97565b60405180910390a25b600101611a69565b505050505050505b5050436010555050565b6001546000908210611c3e57506000611cf4565b60006001600160a01b031660018381548110611c5657fe5b60009182526020909120600490910201546001600160a01b03161480611c8657506008541580611c865750600a54155b80611c95575060085460095410155b80611ca65750611ca482611cf9565b155b80611ccf57506000600b8381548110611cbb57fe5b906000526020600020906016020160000154115b80611ce357506001611cdf613080565b5111155b15611cf057506000611cf4565b5060015b919050565b6001546000908210611d0d57506000611cf4565b600b548210611d4a5760018281548110611d2357fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611cf4565b60018281548110611d5757fe5b9060005260206000209060040201600201601c9054906101000a900460ff16158015611da45750600b8281548110611d8b57fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b54611e6857611db9617aaa565b60015460005b81811015611e6457600b805460018101825560009190915283516000805160206190a483398151915260169092029182019081556020808601516000805160206190e48339815191528401805460ff1916911515919091179055604086015180518794611e40936000805160206190c4833981519152909101920190617ad9565b506060820151611e569060038301906013617b53565b505050806001019050611dbf565b5050505b336110011480611e79575033612002145b611e955760405162461bcd60e51b8152600401610e129061869b565b6001600160a01b03811660009081526004602052604090205480611eb95750611f0c565b6001810390506000600b8281548110611ece57fe5b600091825260209091206001601690920201015460ff169050611ef1838361520f565b8015611efa5750805b15610e32576009805460001901905550505b50565b60015460609081906000805b82811015611f625760018181548110611f3057fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611f5a576001909101905b600101611f1b565b50606081604051908082528060200260200182016040528015611f8f578160200160208202803683370190505b509050606082604051908082528060200260200182016040528015611fc857816020015b6060815260200190600190039081611fb35790505b50600b54600094509091508414156121435760005b8481101561213d5760018181548110611ff257fe5b9060005260206000209060040201600201601c9054906101000a900460ff16612135576001818154811061202257fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061204d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061207a57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156121125780601f106120e757610100808354040283529160200191612112565b820191906000526020600020905b8154815290600101906020018083116120f557829003601f168201915b505050505082858151811061212357fe5b60209081029190910101526001909301925b600101611fdd565b506121df565b60005b848110156121dd576001818154811061215b57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166121d5576001818154811061218b57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106121b657fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101612146565b505b909450925050505b9091565b600181565b61100181565b60085481565b6102ca81565b600881565b6060806000600e549050600080600c5411612223576015612227565b600c545b90506060612233613080565b905060606122408261630f565b9050828251116122575790945092506121e7915050565b83838351031015612269578282510393505b831561229f576014430461228583838388880360008a8a61647d565b61229d8383838888038989038a8b8b8b51030161647d565b505b6060836040519080825280602002602001820160405280156122cb578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561230457816020015b60608152602001906001900390816122ef5790505b50905060005b858110156123855784818151811061231e57fe5b602002602001015183828151811061233257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061235e57fe5b602002602001015182828151811061237257fe5b602090810291909101015260010161230a565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b038116600090815260046020526040812054806123cd576000915050611cf4565b6000190161113d81611cf9565b6001600160a01b03811660009081526004602052604081205480612402576000915050611cf4565b60018082038154811061241157fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b600f5481565b6012818154811061244857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156124d95780601f106124ae576101008083540402835291602001916124d9565b820191906000526020600020905b8154815290600101906020018083116124bc57829003601f168201915b505050505081565b60105481565b600181815481106124f457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b33612000146125a45760405162461bcd60e51b8152600401610e1290618da4565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f389021016058383836040516125d793929190618fe0565b60405180910390a1505050565b60025481565b60115481565b60145460ff1681565b600a5481565b6001600160a01b038116600090815260046020526040812054806126355760405162461bcd60e51b8152600401610e1290618d2c565b6000190192915050565b600b546126fd5761264e617aaa565b60015460005b818110156126f957600b805460018101825560009190915283516000805160206190a483398151915260169092029182019081556020808601516000805160206190e48339815191528401805460ff19169115159190911790556040860151805187946126d5936000805160206190c4833981519152909101920190617ad9565b5060608201516126eb9060038301906013617b53565b505050806001019050612654565b5050505b60085461270a5760036008555b600a54612717576002600a555b6000612722336125ff565b905061272d81611c2a565b6127495760405162461bcd60e51b8152600401610e1290618a19565b611f0c33826165d4565b600981565b61100781565b600381565b601481565b61100681565b6040518060a00160405280607881526020016191046078913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff166127ca5760405162461bcd60e51b8152600401610e1290618664565b33611007146127eb5760405162461bcd60e51b8152600401610e1290618b10565b61285584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b6020820152915061666c9050565b156128f2576020811461287a5760405162461bcd60e51b8152600401610e1290618ce6565b604080516020601f84018190048102820181019092528281526000916128b8918585808385018382808284376000920191909152506166c592505050565b9050606481101580156128ce5750620186a08111155b6128ea5760405162461bcd60e51b8152600401610e1290618909565b60025561301e565b61295284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b6020820152915061666c9050565b156129f557602081146129775760405162461bcd60e51b8152600401610e1290618482565b604080516020601f84018190048102820181019092528281526000916129b5918585808385018382808284376000920191909152506166c592505050565b90506127106129cf600f54836162ea90919063ffffffff16565b11156129ed5760405162461bcd60e51b8152600401610e12906184b9565b60065561301e565b612a5f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b6020820152915061666c9050565b15612af95760208114612a845760405162461bcd60e51b8152600401610e1290618521565b604080516020601f8401819004810282018101909252828152600091612ac2918585808385018382808284376000920191909152506166c592505050565b600c5490915080612ad1575060155b808210612af05760405162461bcd60e51b8152600401610e1290618861565b5060085561301e565b612b6284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b6020820152915061666c9050565b15612bfb5760208114612b875760405162461bcd60e51b8152600401610e12906185ea565b604080516020601f8401819004810282018101909252828152600091612bc5918585808385018382808284376000920191909152506166c592505050565b9050600081118015612bd75750600a81105b612bf35760405162461bcd60e51b8152600401610e1290618e84565b600a5561301e565b612c6f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e64696461746573000000000000006020820152915061666c9050565b15612cfe5760208114612c945760405162461bcd60e51b8152600401610e129061859e565b604080516020601f8401819004810282018101909252828152600091612cd2918585808385018382808284376000920191909152506166c592505050565b9050600d54811115612cf65760405162461bcd60e51b8152600401610e129061897f565b600e5561301e565b612d6784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b6020820152915061666c9050565b15612de95760208114612d8c5760405162461bcd60e51b8152600401610e1290618b5e565b604080516020601f8401819004810282018101909252828152600091612dca918585808385018382808284376000920191909152506166c592505050565b600d819055600e54909150811015612de357600d54600e555b5061301e565b612e4d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b6020820152915061666c9050565b15612efb5760208114612e725760405162461bcd60e51b8152600401610e129061862f565b604080516020601f8401819004810282018101909252828152600091612eb0918585808385018382808284376000920191909152506166c592505050565b905060008111612ed25760405162461bcd60e51b8152600401610e1290618709565b6064811115612ef35760405162461bcd60e51b8152600401610e1290618751565b600c5561301e565b612f6384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601181527073797374656d526577617264526174696f60781b6020820152915061666c9050565b156130065760208114612f885760405162461bcd60e51b8152600401610e1290618e40565b604080516020601f8401819004810282018101909252828152600091612fc6918585808385018382808284376000920191909152506166c592505050565b9050612710612fe0600654836162ea90919063ffffffff16565b1115612ffe5760405162461bcd60e51b8152600401610e1290618c47565b600f5561301e565b60405162461bcd60e51b8152600401610e1290618ee1565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516130539493929190618450565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156130af5761309b81611cf9565b156130a7578160010191505b60010161308a565b506060816040519080825280602002602001820160405280156130dc578160200160208202803683370190505b5090506000915060005b83811015613163576130f781611cf9565b1561315b576001818154811061310957fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061313457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b6001016130e6565b50925050505b90565b601581565b61027181565b61100281565b6013818154811061244857fe5b6000613194613080565b519050600080600c54116131a95760156131ad565b600c545b9050808211156131bb578091505b816131c557600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff161561320a5760405162461bcd60e51b8152600401610e1290618c10565b613212617b80565b60006132356040518060a001604052806078815260200161910460789139613e30565b91509150806132565760405162461bcd60e51b8152600401610e1290618d63565b61325e617aaa565b60005b83602001515181101561345f57600b805460018101825560009190915282516000805160206190a483398151915260169092029182019081556020808501516000805160206190e48339815191528401805460ff19169115159190911790556040850151805186946132e7936000805160206190c4833981519152909101920190617ad9565b5060608201516132fd9060038301906013617b53565b5050508360400151818151811061331057fe5b6020026020010151600b828154811061332557fe5b90600052602060002090601602016002019080519060200190613349929190617ad9565b5060018460200151828151811061335c57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591870151805191850193918590811061343257fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101613261565b50506103e860025550506000805460ff19166001179055565b600d5481565b601354600090815b818110156135875761356f85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506013805490925085915081106134d757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156135655780601f1061353a57610100808354040283529160200191613565565b820191906000526020600020905b81548152906001019060200180831161354857829003601f168201915b50505050506166ca565b1561357f57600192505050611da4565b600101613486565b5060125460005b818110156135f8576135df86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506012805490925085915081106134d757fe5b156135f05760019350505050611da4565b60010161358e565b50600095945050505050565b33611001146136255760405162461bcd60e51b8152600401610e1290618f08565b600b546136e357613634617aaa565b60015460005b818110156136df57600b805460018101825560009190915283516000805160206190a483398151915260169092029182019081556020808601516000805160206190e48339815191528401805460ff19169115159190911790556040860151805187946136bb936000805160206190c4833981519152909101920190617ad9565b5060608201516136d19060038301906013617b53565b50505080600101905061363a565b5050505b60006136ee8261672e565b90506136f981611c2a565b156118dd576118dd82826165d4565b606581565b601181565b3341146137315760405162461bcd60e51b8152600401610e1290618df3565b60005460ff166137535760405162461bcd60e51b8152600401610e1290618664565b600034116137735760405162461bcd60e51b8152600401610e1290618950565b3a156137915760405162461bcd60e51b8152600401610e1290618ae2565b6001600160a01b03811660009081526004602052604090205460145434919060ff166137d157610271600f556103e86006556014805460ff191660011790555b6000821180156137e357506000600f54115b15613895576000613811612710613805600f54346168b190919063ffffffff16565b9063ffffffff6168eb16565b90508015613893576040516110029082156108fc029083906000818181858888f19350505050158015613848573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516138789190618f97565b60405180910390a1613890838263ffffffff6162a816565b92505b505b6000821180156138a757506000600654115b1561394d5760006138c9612710613805600654346168b190919063ffffffff16565b9050801561394b5760405161dead9082156108fc029083906000818181858888f19350505050158015613900573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516139309190618f97565b60405180910390a1613948838263ffffffff6162a816565b92505b505b8015613a4b57600060018083038154811061396457fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156139d157836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4846040516139c49190618f97565b60405180910390a2613a45565b6003546139e4908463ffffffff6162ea16565b60039081558101546139fc908463ffffffff6162ea16565b60038201556040516001600160a01b038516907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590613a3c908690618f97565b60405180910390a25b50610e32565b826001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b483604051613a849190618f97565b60405180910390a2505050565b600e5481565b61100081565b61dead81565b600b8181548110613ab057fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015613b5b5780601f10613b3057610100808354040283529160200191613b5b565b820191906000526020600020905b815481529060010190602001808311613b3e57829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613b7c575081155b80613b875750600954155b15613b945750600061113d565b6000613bce600a5461380585613805600b8981548110613bb057fe5b6000918252602090912060169091020154439063ffffffff6162a816565b90506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015613c0d57600080fd5b505afa158015613c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c45919061816d565b9150915060009350808310613da457613c5e878761520f565b5060405163436aa28360e11b8152600090612002906386d5450690613c87908b906004016182aa565b60206040518083038186803b158015613c9f57600080fd5b505afa158015613cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd79190617f1a565b6001600160a01b031614613d43576040516313d13bdb60e31b815261100190639e89ded890613d0c908a9087906004016182be565b600060405180830381600087803b158015613d2657600080fd5b505af1158015613d3a573d6000803e3d6000fd5b50505050613d9b565b6040516305bfb49960e41b815261100190635bfb499090613d68908a906004016182aa565b600060405180830381600087803b158015613d8257600080fd5b505af1158015613d96573d6000803e3d6000fd5b505050505b60019350613db6565b818310613db657613db48761672e565b505b60098054600019019055600b80546000919088908110613dd257fe5b60009182526020822060169190910201600101805460ff1916921515929092179091556040516001600160a01b038916917fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b91a25050509392505050565b613e38617b80565b6000613e42617b80565b613e4a617c1d565b613e5b613e568661692d565b616952565b90506000805b613e6a8361699c565b15613fde5780613e8f57613e85613e80846169bd565b616a0b565b60ff168452613fd6565b8060011415613fd1576060613eab613ea6856169bd565b616a8b565b90508051604051908082528060200260200182016040528015613ee857816020015b613ed5617ba4565b815260200190600190039081613ecd5790505b5085602001819052508051604051908082528060200260200182016040528015613f2657816020015b6060815260200190600190039081613f115790505b50604086015260005b8151811015613fc657613f40617ba4565b60606000613f60858581518110613f5357fe5b6020026020010151616b5c565b92509250925080613f80578860009a509a50505050505050505050613fe7565b8289602001518581518110613f9157fe5b60200260200101819052508189604001518581518110613fad57fe5b6020026020010181905250505050806001019050613f2f565b506001925050613fd6565b613fde565b600101613e61565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b606081526020019060019003908161400657905050905061402c8363ffffffff16616c76565b8160008151811061403957fe5b602002602001018190525061113d81616c89565b600060648351111561408457600080516020619084833981519152604051614074906187ae565b60405180910390a1506066611da4565b60005b83518110156141225760005b81811015614119578481815181106140a757fe5b6020026020010151600001516001600160a01b03168583815181106140c857fe5b6020026020010151600001516001600160a01b03161415614111576000805160206190848339815191526040516140fe906188be565b60405180910390a1606692505050611da4565b600101614093565b50600101614087565b5060608060606015805480602002602001604051908101604052809291908181526020016000905b828210156141d45760008481526020908190206040805160c0810182526004860290920180546001600160a01b039081168452600180830154821685870152600283015491821693850193909352600160a01b81046001600160401b03166060850152600160e01b900460ff16151560808401526003015460a0830152908352909201910161414a565b50505050905060606016805480602002602001604051908101604052809291908181526020016000905b828210156142a95760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156142955780601f1061426a57610100808354040283529160200191614295565b820191906000526020600020905b81548152906001019060200180831161427857829003601f168201915b5050505050815260200190600101906141fe565b50505050905060005b8251811015614306578281815181106142c757fe5b6020026020010151606001516003028382815181106142e257fe5b60209081029190910101516001600160401b039091166060909101526001016142b2565b5060608061431689898686616d13565b9150915061432482826155d2565b60015460408051828152602080840282010190915292985090965060009550859450925060609150828015614363578160200160208202803683370190505b50905060005b828110156144f45760006001600160a01b03166120026001600160a01b03166386d545066001848154811061439a57fe5b60009182526020909120600491820201546040516001600160e01b031960e085901b1681526143d5926001600160a01b0390921691016182aa565b60206040518083038186803b1580156143ed57600080fd5b505afa158015614401573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144259190617f1a565b6001600160a01b03161461448757600182828151811061444157fe5b602002602001019060ff16908160ff16815250506001818154811061446257fe5b906000526020600020906004020160030154600014614482578360010193505b6144ec565b67016345785d8a00006001828154811061449d57fe5b906000526020600020906004020160030154106144bf578460010194506144ec565b600181815481106144cc57fe5b9060005260206000209060040201600301546000146144ec578360010193505b600101614369565b50606084604051908082528060200260200182016040528015614521578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015614550578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561457f578160200160208202803683370190505b5090506060876040519080825280602002602001820160405280156145ae578160200160208202803683370190505b50905060006060886040519080825280602002602001820160405280156145df578160200160208202803683370190505b50905060608960405190808252806020026020018201604052801561460e578160200160208202803683370190505b50905060009a506000995060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561465657600080fd5b505afa15801561466a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061468e9190618155565b905067016345785d8a00008111156146da576000805160206190848339815191526040516146bb90618bcf565b60405180910390a160689e505050505050505050505050505050611da4565b60005b8a811015614a6e578981815181106146f157fe5b602002602001015160ff16600114156147e7576001818154811061471157fe5b9060005260206000209060040201600301546000146147e2576001818154811061473757fe5b600091825260209091206004909102015484516001600160a01b039091169085908e90811061476257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061478f57fe5b906000526020600020906004020160030154838d815181106147ad57fe5b60200260200101818152505060018a8d815181106147c757fe5b602002602001019060ff16908160ff16815250508b6001019b505b614a66565b67016345785d8a0000600182815481106147fd57fe5b90600052602060002090600402016003015410614982576001818154811061482157fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898e8151811061485257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be4006001838154811061488757fe5b906000526020600020906004020160030154816148a057fe5b06600183815481106148ae57fe5b9060005260206000209060040201600301540390506148d683826162a890919063ffffffff16565b898f815181106148e257fe5b602002602001018181525050600182815481106148fb57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878f8151811061492c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888f8151811061495957fe5b6020908102919091010152614974868263ffffffff6162ea16565b95508d6001019d5050614a66565b6001818154811061498f57fe5b906000526020600020906004020160030154600014614a6657600181815481106149b557fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848d815181106149e657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060018181548110614a1357fe5b906000526020600020906004020160030154838d81518110614a3157fe5b60200260200101818152505060008a8d81518110614a4b57fe5b602002602001019060ff16908160ff16815250508b6001019b505b6001016146dd565b5060008415614ce4576002546040516303702b2960e51b815261100491636e056520918891614aa8918e918e918d914201906004016183b8565b6020604051808303818588803b158015614ac157600080fd5b505af193505050508015614af2575060408051601f3d908101601f19168201909252614aef91810190618082565b60015b614c69576040516000815260443d1015614b0e57506000614ba9565b60046000803e60005160e01c6308c379a08114614b2f576000915050614ba9565b60043d036004833e81513d60248201116001600160401b0382111715614b5a57600092505050614ba9565b80830180516001600160401b03811115614b7b576000945050505050614ba9565b8060208301013d8601811115614b9957600095505050505050614ba9565b601f01601f191660405250925050505b80614bb45750614bf6565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051614be8919061843d565b60405180910390a250614c64565b3d808015614c20576040519150601f19603f3d011682016040523d82523d6000602084013e614c25565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051614c5a919061843d565b60405180910390a2505b614ce4565b8015614cab577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051614c9e9190618f97565b60405180910390a1614ce2565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051614cd990618567565b60405180910390a25b505b8015614e9a5760005b8751811015614e98576000888281518110614d0457fe5b60200260200101519050600060018281548110614d1d57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110614d4e57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015614e0a5760018281548110614d8f57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110614dde57fe5b906000526020600020906004020160030154604051614dfd9190618f97565b60405180910390a2614e8e565b60018281548110614e1757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110614e6657fe5b906000526020600020906004020160030154604051614e859190618f97565b60405180910390a25b5050600101614ced565b505b8351156150905760005b845181101561508e578a8181518110614eb957fe5b602002602001015160ff1660011415614f58576120026001600160a01b031663092193ab858381518110614ee957fe5b6020026020010151878481518110614efd57fe5b60200260200101516040518363ffffffff1660e01b8152600401614f2191906182aa565b6000604051808303818588803b158015614f3a57600080fd5b505af1158015614f4e573d6000803e3d6000fd5b5050505050615086565b6000858281518110614f6657fe5b60200260200101516001600160a01b03166108fc868481518110614f8657fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561501c57858281518110614fbc57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110614ffa57fe5b602002602001015160405161500f9190618f97565b60405180910390a2615084565b85828151811061502857fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d86848151811061506657fe5b602002602001015160405161507b9190618f97565b60405180910390a25b505b600101614ea4565b505b5050505050505050505050505060005b6001548110156150fd57600181815481106150b757fe5b9060005260206000209060040201600301546000146150f5576000600182815481106150df57fe5b9060005260206000209060040201600301819055505b6001016150a0565b50471561516b577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516151339190618f97565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015615169573d6000803e3d6000fd5b505b60006003819055600555815115615186576151868282615ab9565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156151c357600080fd5b505af11580156151d7573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b6000806001838154811061521f57fe5b90600052602060002090600402016003015490506000600180805490500390506001615249613080565b511161527e5760006001858154811061525e57fe5b906000526020600020906004020160030181905550600092505050611da4565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516152b79190618f97565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156154a457600181600101815481106152f857fe5b90600052602060002090600402016001828154811061531357fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b8054909183019081106153d457fe5b9060005260206000209060160201600b82815481106153ef57fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff1990921691909117905560028084018054615446938386019390821615610100026000190190911604617c3d565b5061545960038281019084016013617cb2565b5090505080600101600460006001848154811061547257fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020556001016152da565b5060018054806154b057fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061550357fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906155356002830182617bd9565b615543600383016000617cdc565b50509055600081838161555257fe5b04905080156155c65760015460005b818110156155c35761559a836001838154811061557a57fe5b9060005260206000209060040201600301546162ea90919063ffffffff16565b600182815481106155a757fe5b6000918252602090912060036004909202010155600101615561565b50505b50600195945050505050565b6060806000808080806155e361318a565b6001549091505b801561581257600181039250600b838154811061560357fe5b600091825260209091206001601690920201015460ff1661562357615809565b6001838154811061563057fe5b60009182526020909120600490910201546001600160a01b03169450615657858484613b6b565b93508361566357615809565b60405163436aa28360e11b81526000908190612002906386d545069061568d908a906004016182aa565b60206040518083038186803b1580156156a557600080fd5b505afa1580156156b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156dd9190617f1a565b90506001600160a01b03811615615766576040516302ceee9160e11b81526120029063059ddd22906157139084906004016182aa565b60206040518083038186803b15801561572b57600080fd5b505afa15801561573f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906157639190617f1a565b91505b60005b8c5181101561580557876001600160a01b03168d828151811061578857fe5b6020026020010151600001516001600160a01b031614806157d15750826001600160a01b03168d82815181106157ba57fe5b6020026020010151600001516001600160a01b0316145b156157fd5760018d82815181106157e457fe5b6020908102919091010151901515608090910152615805565b600101615769565b5050505b600019016155ea565b5060005b895181101561587f5789818151811061582b57fe5b6020026020010151608001518061586b575060006001600160a01b03168a828151811061585457fe5b6020026020010151600001516001600160a01b0316145b15615877578560010195505b600101615816565b50885185106159675760408051600180825281830190925290816020015b6158a5617ba4565b81526020019060019003908161589d575050604080516001808252818301909252919850602082015b60608152602001906001900390816158ce579050509550886000815181106158f257fe5b60200260200101518760008151811061590757fe5b60200260200101819052508760008151811061591f57fe5b60200260200101518660008151811061593457fe5b602002602001018190525060008760008151811061594e57fe5b6020908102919091010151901515608090910152615aac565b848951036040519080825280602002602001820160405280156159a457816020015b615991617ba4565b8152602001906001900390816159895790505b509650848951036040519080825280602002602001820160405280156159de57816020015b60608152602001906001900390816159c95790505b5095506000915060005b8951811015615aaa578981815181106159fd57fe5b602002602001015160800151158015615a40575060006001600160a01b03168a8281518110615a2857fe5b6020026020010151600001516001600160a01b031614155b15615aa257898181518110615a5157fe5b6020026020010151888481518110615a6557fe5b6020026020010181905250888181518110615a7c57fe5b6020026020010151878481518110615a9057fe5b60200260200101819052508260010192505b6001016159e8565b505b50505050505b9250929050565b600154825160005b82811015615bd6576001615ad3617ba4565b60018381548110615ae057fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015615baa57878181518110615b7057fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615ba25760009250615baa565b600101615b5c565b508115615bcc5780516001600160a01b03166000908152600460205260408120555b5050600101615ac1565b5080821115615c9557805b82811015615c93576001805480615bf457fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480615c4757fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590615c796002830182617bd9565b615c87600383016000617cdc565b50509055600101615be1565b505b6000818310615ca45781615ca6565b825b905060005b8181101561604a57615d58868281518110615cc257fe5b602002602001015160018381548110615cd757fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a08201526170df565b615f0c578060010160046000888481518110615d7057fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110615dac57fe5b602002602001015160018281548110615dc157fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101558451859082908110615e7c57fe5b6020026020010151600b8281548110615e9157fe5b90600052602060002090601602016002019080519060200190615eb5929190617ad9565b506000600b8281548110615ec557fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b805483908110615ef657fe5b6000918252602090912060169091020155616042565b858181518110615f1857fe5b60200260200101516060015160018281548110615f3157fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b03160217905550615ff7858281518110615f7557fe5b6020026020010151600b8381548110615f8a57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156135655780601f1061353a57610100808354040283529160200191613565565b6160425784818151811061600757fe5b6020026020010151600b828154811061601c57fe5b90600052602060002090601602016002019080519060200190616040929190617ad9565b505b600101615cab565b50828211156162225761605b617aaa565b835b8381101561621f5785818151811061607157fe5b60200260200101518260400181905250600187828151811061608f57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b80549283018155909352845160169091026000805160206190a48339815191528101918255858301516000805160206190e48339815191528201805491151560ff19909216919091179055928501518051869492936161c5936000805160206190c483398151915201920190617ad9565b5060608201516161db9060038301906013617b53565b50505080600101600460008984815181106161f257fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161605d565b50505b61622a61713b565b616232617323565b6000600981905560015493505b838110156162a0576000600b828154811061625657fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061628757fe5b600091825260209091206016909102015560010161623f565b505050505050565b600061113d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250617511565b60008282018381101561113d5760405162461bcd60e51b8152600401610e12906186d2565b60015481516040805182815260208084028201019091526060929190839082801561634e57816020015b60608152602001906001900390816163395790505b50600b549091508314616365579250611cf4915050565b60005b8281101561647457600b60016004600089858151811061638457fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106163b857fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156164505780601f1061642557610100808354040283529160200191616450565b820191906000526020600020905b81548152906001019060200180831161643357829003601f168201915b505050505082828151811061646157fe5b6020908102919091010152600101616368565b50949350505050565b60005b828110156165ca57600082878388016040516020016164a092919061829c565b6040516020818303038152906040528051906020012060001c816164c057fe5b069050808501828701146165c157600089838801815181106164de57fe5b60200260200101519050606089848901815181106164f857fe5b602002602001015190508a8388018151811061651057fe5b60200260200101518b858a018151811061652657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061655557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061658357fe5b60200260200101518a858a018151811061659957fe5b6020026020010181905250808a848901815181106165b357fe5b602002602001018190525050505b50600101616480565b5050505050505050565b600980546001908101909155600b8054839081106165ee57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061662457fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b60008160405160200161667f9190618280565b60405160208183030381529060405280519060200120836040516020016166a69190618280565b6040516020818303038152906040528051906020012014905092915050565b015190565b8151815160009160019181148083146166e65760009250616724565b600160208701838101602088015b60028483851001141561671f5780518351146167135760009650600093505b602092830192016166f4565b505050505b5090949350505050565b6001600160a01b0381166000908152600460205260408120548061675757506000199050611cf4565b60018103905060006001828154811061676c57fe5b906000526020600020906004020160030154905060006001838154811061678f57fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d906167e8908590618f97565b60405180910390a28061680057829350505050611cf4565b600081838161680b57fe5b04905080156168a75760005b8481101561685957616830826001838154811061557a57fe5b6001828154811061683d57fe5b6000918252602090912060036004909202010155600101616817565b50600180549085015b818110156168a45761687b836001838154811061557a57fe5b6001828154811061688857fe5b6000918252602090912060036004909202010155600101616862565b50505b5091949350505050565b6000826168c057506000611da4565b828202828482816168cd57fe5b041461113d5760405162461bcd60e51b8152600401610e1290618aa1565b600061113d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061753d565b616935617ceb565b506040805180820190915281518152602082810190820152919050565b61695a617c1d565b61696382617574565b61696c57600080fd5b600061697b83602001516175ae565b60208085015160408051808201909152868152920190820152915050919050565b60006169a6617ceb565b505080518051602091820151919092015191011190565b6169c5617ceb565b6169ce8261699c565b6169d757600080fd5b602082015160006169e782617611565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590616a2057508151602110155b616a2957600080fd5b6000616a3883602001516175ae565b90508083600001511015616a5e5760405162461bcd60e51b8152600401610e1290618caf565b82516020808501518301805192849003929183101561647457506020919091036101000a90049392505050565b6060616a9682617574565b616a9f57600080fd5b6000616aaa836176f2565b9050606081604051908082528060200260200182016040528015616ae857816020015b616ad5617ceb565b815260200190600190039081616acd5790505b5090506000616afa85602001516175ae565b60208601510190506000805b84811015616b5157616b1783617611565b9150604051806040016040528083815260200184815250848281518110616b3a57fe5b602090810291909101015291810191600101616b06565b509195945050505050565b616b64617ba4565b60606000616b70617ba4565b6060616b7a617c1d565b616b8387616952565b90506000805b616b928361699c565b15616c675780616bbd57616bad616ba8846169bd565b61774e565b6001600160a01b03168552616c5f565b8060011415616be557616bd2616ba8846169bd565b6001600160a01b03166020860152616c5f565b8060021415616c0d57616bfa616ba8846169bd565b6001600160a01b03166040860152616c5f565b8060031415616c3957616c22613e80846169bd565b6001600160401b0316606086015260019150616c5f565b8060041415616c5a57616c53616c4e846169bd565b617768565b9350616c5f565b616c67565b600101616b89565b50929791965091945092505050565b6060611da4616c84836177d8565b6178be565b6060815160001415616caa5750604080516000815260208101909152611cf4565b606082600081518110616cb957fe5b602002602001015190506000600190505b8351811015616cfa57616cf082858381518110616ce357fe5b6020026020010151617910565b9150600101616cca565b5061113d616d0d825160c060ff1661798d565b82617910565b60608060006120026001600160a01b031663c473318f6040518163ffffffff1660e01b815260040160206040518083038186803b158015616d5357600080fd5b505afa158015616d67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616d8b9190618155565b90508085518851011015616da0575083518651015b606081604051908082528060200260200182016040528015616ddc57816020015b616dc9617ba4565b815260200190600190039081616dc15790505b509050606082604051908082528060200260200182016040528015616e1557816020015b6060815260200190600190039081616e005790505b50905060008060005b8b51831080616e2d5750895182105b8015616e3857508581105b156170cd578b51831415616ea857898281518110616e5257fe5b6020026020010151858281518110616e6657fe5b6020026020010181905250888281518110616e7d57fe5b6020026020010151848281518110616e9157fe5b602090810291909101015260019182019101616e1e565b8951821415616f13578b8381518110616ebd57fe5b6020026020010151858281518110616ed157fe5b60200260200101819052508a8381518110616ee857fe5b6020026020010151848281518110616efc57fe5b602090810291909101015260019283019201616e1e565b898281518110616f1f57fe5b6020026020010151606001516001600160401b03168c8481518110616f4057fe5b6020026020010151606001516001600160401b03161115616fbc578b8381518110616f6757fe5b6020026020010151858281518110616f7b57fe5b60200260200101819052508a8381518110616f9257fe5b6020026020010151848281518110616fa657fe5b60200260200101819052508260010192506170c5565b898281518110616fc857fe5b6020026020010151606001516001600160401b03168c8481518110616fe957fe5b6020026020010151606001516001600160401b031610156170655789828151811061701057fe5b602002602001015185828151811061702457fe5b602002602001018190525088828151811061703b57fe5b602002602001015184828151811061704f57fe5b60200260200101819052508160010191506170c5565b89828151811061707157fe5b6020026020010151600001516001600160a01b03168c848151811061709257fe5b6020026020010151600001516001600160a01b031610156170b9578b8381518110616f6757fe5b898281518110616e5257fe5b600101616e1e565b50929a91995090975050505050505050565b805182516000916001600160a01b039182169116148015617119575081602001516001600160a01b031683602001516001600160a01b0316145b801561113d5750506040908101519101516001600160a01b0390811691161490565b6012546013548082111561718657805b8281101561718457601280548061715e57fe5b60019003818190600052602060002001600061717a9190617bd9565b905560010161714b565b505b60008183106171955781617197565b825b905060005b818110156172af57617254601282815481106171b457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156172425780601f1061721757610100808354040283529160200191617242565b820191906000526020600020905b81548152906001019060200180831161722557829003601f168201915b5050505050601383815481106134d757fe5b6172a7576013818154811061726557fe5b906000526020600020016012828154811061727c57fe5b9060005260206000200190805460018160011615610100020316600290046172a5929190617c3d565b505b60010161719c565b5082821115610e3257825b8281101561731d576012601382815481106172d157fe5b6000918252602080832084546001818101875595855291909320929091018054617314949390920192909160026101009282161592909202600019011604617c3d565b506001016172ba565b50505050565b601354600b548082111561736e57805b8281101561736c57601380548061734657fe5b6001900381819060005260206000200160006173629190617bd9565b9055600101617333565b505b600081831061737d578161737f565b825b905060005b8181101561749e5761743c6013828154811061739c57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561742a5780601f106173ff5761010080835404028352916020019161742a565b820191906000526020600020905b81548152906001019060200180831161740d57829003601f168201915b5050505050600b8381548110615f8a57fe5b61749657600b818154811061744d57fe5b90600052602060002090601602016002016013828154811061746b57fe5b906000526020600020019080546001816001161561010002031660029004617494929190617c3d565b505b600101617384565b5082821115610e3257825b8281101561731d576013600b82815481106174c057fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461750895939094019390926000199082161561010002011604617c3d565b506001016174a9565b600081848411156175355760405162461bcd60e51b8152600401610e12919061843d565b505050900390565b6000818361755e5760405162461bcd60e51b8152600401610e12919061843d565b50600083858161756a57fe5b0495945050505050565b805160009061758557506000611cf4565b6020820151805160001a9060c08210156175a457600092505050611cf4565b5060019392505050565b8051600090811a60808110156175c8576000915050611cf4565b60b88110806175e3575060c081108015906175e3575060f881105b156175f2576001915050611cf4565b60c08110156176065760b519019050611cf4565b60f519019050611cf4565b80516000908190811a608081101561762c57600191506176eb565b60b881101561764157607e19810191506176eb565b60c081101561769257600060b78203600186019550806020036101000a86510491506001810182019350508083101561768c5760405162461bcd60e51b8152600401610e12906189ee565b506176eb565b60f88110156176a75760be19810191506176eb565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156176e95760405162461bcd60e51b8152600401610e12906189ee565b505b5092915050565b805160009061770357506000611cf4565b6000809050600061771784602001516175ae565b602085015185519181019250015b808210156177455761773682617611565b82019150826001019250617725565b50909392505050565b805160009060151461775f57600080fd5b611da482616a0b565b805160609061777657600080fd5b600061778583602001516175ae565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156177bc576020820181803683370190505b5090506000816020019050616474848760200151018285617a5f565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661781c57506018617840565b6fffffffffffffffffffffffffffffffff19841661783c57506010617840565b5060005b60208110156178765781818151811061785557fe5b01602001516001600160f81b0319161561786e57617876565b600101617840565b60008160200390506060816040519080825280601f01601f1916602001820160405280156178ab576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156178f05750607f60f81b826000815181106178de57fe5b01602001516001600160f81b03191611155b156178fc575080611cf4565b611da461790e8351608060ff1661798d565b835b6060806040519050835180825260208201818101602087015b81831015617941578051835260209283019201617929565b50855184518101855292509050808201602086015b8183101561796e578051835260209283019201617956565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106179b75760405162461bcd60e51b8152600401610e1290618839565b60408051600180825281830190925260609160208201818036833701905050905060378411617a115782840160f81b816000815181106179f357fe5b60200101906001600160f81b031916908160001a9053509050611da4565b6060617a1c856177d8565b90508381510160370160f81b82600081518110617a3557fe5b60200101906001600160f81b031916908160001a905350617a568282617910565b95945050505050565b80617a6957610e32565b5b60208110617a89578251825260209283019290910190601f1901617a6a565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001617ad4617d05565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617b1a57805160ff1916838001178555617b47565b82800160010185558215617b47579182015b82811115617b47578251825591602001919060010190617b2c565b506131c5929150617d24565b8260138101928215617b475791602002820182811115617b47578251825591602001919060010190617b2c565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b50805460018160011615610100020316600290046000825580601f10617bff5750611f0c565b601f016020900490600052602060002090810190611f0c9190617d24565b6040518060400160405280617c30617ceb565b8152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617c765780548555617b47565b82800160010185558215617b4757600052602060002091601f016020900482015b82811115617b47578254825591600101919060010190617c97565b8260138101928215617b475791820182811115617b47578254825591600101919060010190617c97565b50611f0c906013810190617d24565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61316991905b808211156131c55760008155600101617d2a565b8035611da48161906e565b60008083601f840112617d5a578182fd5b5081356001600160401b03811115617d70578182fd5b6020830191508360208083028501011115615ab257600080fd5b6000601f8381840112617d9b578182fd5b8235617dae617da982619023565b618ffd565b818152925060208084019085810160005b84811015617e40578135880189603f820112617dda57600080fd5b838101356001600160401b03811115617df257600080fd5b617e03818901601f19168601618ffd565b81815260408c81848601011115617e1957600080fd5b82818501888401375060009181018601919091528552509282019290820190600101617dbf565b50505050505092915050565b600082601f830112617e5c578081fd5b8135617e6a617da982619023565b818152915060208083019084810181840286018201871015617e8b57600080fd5b6000805b85811015617e405782356001600160401b0381168114617ead578283fd5b85529383019391830191600101617e8f565b60008083601f840112617ed0578182fd5b5081356001600160401b03811115617ee6578182fd5b602083019150836020828501011115615ab257600080fd5b600060208284031215617f0f578081fd5b813561113d8161906e565b600060208284031215617f2b578081fd5b815161113d8161906e565b60008060008060408587031215617f4b578283fd5b84356001600160401b0380821115617f61578485fd5b617f6d88838901617d49565b90965094506020870135915080821115617f85578384fd5b50617f9287828801617d49565b95989497509550505050565b600080600060608486031215617fb2578283fd5b83356001600160401b0380821115617fc8578485fd5b81860187601f820112617fd9578586fd5b80359250617fe9617da984619023565b80848252602080830192508084018b82838902870101111561800957898afd5b8994505b868510156180335761801f8c82617d3e565b84526001949094019392810192810161800d565b50909750880135935050508082111561804a578384fd5b61805687838801617e4c565b9350604086013591508082111561806b578283fd5b5061807886828701617d8a565b9150509250925092565b600060208284031215618093578081fd5b8151801515811461113d578182fd5b600080602083850312156180b4578182fd5b82356001600160401b038111156180c9578283fd5b6180d585828601617ebf565b90969095509350505050565b600080600080604085870312156180f6578384fd5b84356001600160401b038082111561810c578586fd5b61811888838901617ebf565b90965094506020870135915080821115618130578384fd5b50617f9287828801617ebf565b60006020828403121561814e578081fd5b5035919050565b600060208284031215618166578081fd5b5051919050565b6000806040838503121561817f578182fd5b505080516020909101519092909150565b6000806000604084860312156181a4578081fd5b833560ff811681146181b4578182fd5b925060208401356001600160401b038111156181ce578182fd5b6181da86828701617ebf565b9497909650939450505050565b6000815180845260208085019450808401835b8381101561821f5781516001600160a01b0316875295820195908201906001016181fa565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000815180845261826c816020860160208601619042565b601f01601f19169290920160200192915050565b60008251618292818460208701619042565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0392909216825260ff16602082015260400190565b60006020825261113d60208301846181e7565b60006040825261835b60408301856181e7565b602083820381850152818551808452828401915082838202850101838801865b838110156183a957601f19878403018552618397838351618254565b9486019492509085019060010161837b565b50909998505050505050505050565b6000608082526183cb60808301876181e7565b828103602084810191909152865180835287820192820190845b81811015618401578451835293830193918301916001016183e5565b5050848103604086015261841581886181e7565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b60006020825261113d6020830184618254565b60006040825261846460408301868861822a565b828103602084015261847781858761822a565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526042908201527f746865206275726e526174696f20706c75732073797374656d5265776172645260408201527f6174696f206d757374206265206e6f2067726561746572207468616e20313030606082015261030360f41b608082015260a00190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526042908201527f7468652073797374656d526577617264526174696f20706c7573206275726e5260408201527f6174696f206d757374206265206e6f2067726561746572207468616e20313030606082015261030360f41b608082015260a00190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526024908201527f6c656e677468206f662073797374656d526577617264526174696f206d69736d6040820152630c2e8c6d60e31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152617a566060830184618254565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152617a5660408301848661822a565b6040518181016001600160401b038111828210171561901b57600080fd5b604052919050565b60006001600160401b03821115619038578081fd5b5060209081020190565b60005b8381101561905d578181015183820152602001619045565b8381111561731d5750506000910152565b6001600160a01b0381168114611f0c57600080fdfe70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaf87680f873f871949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d79164b085e6972fc98cd3c81d64d40e325acfed44365b97a7567a27939c14dbc7512ddcf54cb1284eb637cfa308ae4e00cb5588a164736f6c6343000604000a", }, { ContractAddr: common.HexToAddress(SlashContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "608060405234801561001057600080fd5b506004361061035d5760003560e01c80637e434d54116101d3578063c80d4b8f11610104578063df8079e9116100a2578063f9a2bbc71161007c578063f9a2bbc714610601578063fc3e590814610609578063fc4333cd14610611578063fd6a6879146106195761035d565b8063df8079e9146105e9578063e1c7392a146105f1578063f1fad104146105f95761035d565b8063c96be4cb116100de578063c96be4cb146105b3578063cc844b73146105c6578063dc927faf146105d9578063dcc6f156146105e15761035d565b8063c80d4b8f14610590578063c81b166214610598578063c8509d81146105a05761035d565b8063a1a11bf511610171578063aad560631161014b578063aad5606314610565578063ab51bb961461056d578063ac0af62914610575578063ac4317511461057d5761035d565b8063a1a11bf51461054d578063a78abc1614610555578063aa82dce11461055d5761035d565b806396713da9116101ad57806396713da9146105225780639dc092621461052a5780639e89ded8146105325780639f804f5f146105455761035d565b80637e434d54146104ff5780638256ace614610507578063831d65d11461050f5761035d565b8063493279b1116102ad57806362b72cf51161024b578063718a8aa811610225578063718a8aa8146104df57806375d47a0a146104e75780637912a65d146104ef5780637942fd05146104f75761035d565b806362b72cf5146104c75780636e47b482146104cf57806370fd5bad146104d75761035d565b806351b4dce31161028757806351b4dce31461049c57806351e80672146104a4578063567a372d146104ac5780635bfb4990146104b45761035d565b8063493279b1146104775780634bf6c8821461048c57806350055f90146104945761035d565b8063280870281161031a57806337c8dab9116102f457806337c8dab914610431578063389f4f71146104525780633dffc3871461045a57806343756e5c1461046f5761035d565b806328087028146104015780633306ccca1461040957806335aa2e441461041e5761035d565b80630bee7a67146103625780630e2374a5146103805780631182b8751461039557806322d1e80b146103b557806323bac5a2146103ca57806327962118146103ec575b600080fd5b61036a610621565b6040516103779190613d67565b60405180910390f35b610388610626565b6040516103779190613545565b6103a86103a336600461347b565b61062c565b604051610377919061357d565b6103bd610692565b6040516103779190613572565b6103dd6103d8366004613192565b61069b565b60405161037793929190613d4f565b6103ff6103fa3660046132d8565b6106be565b005b610388610a13565b610411610a19565b6040516103779190613d38565b61038861042c36600461344b565b610a1e565b61044461043f366004613192565b610a45565b604051610377929190613d41565b610411610a9c565b610462610aa2565b6040516103779190613d78565b610388610aa7565b61047f610aad565b6040516103779190613d29565b610462610ab3565b610411610ab8565b610388610abe565b610388610ac4565b610411610aca565b6103ff6104c2366004613192565b610ad0565b610411610bdc565b610388610be2565b610462610be8565b610462610bed565b610388610bf2565b610411610bf8565b610462610bfd565b610388610c02565b610444610c08565b6103ff61051d36600461347b565b610c12565b610462610d26565b610388610d2b565b6103ff6105403660046131ca565b610d31565b610411610d60565b610388610d66565b6103bd610d6c565b610388610d75565b610388610d7b565b61036a610d81565b610411610d86565b6103ff61058b36600461332f565b610d8b565b610411611327565b61038861132c565b6103ff6105ae36600461347b565b611332565b6103ff6105c1366004613192565b6113a3565b6103ff6105d4366004613398565b611812565b610388611df0565b610411611df6565b610388611dfb565b6103ff611e01565b610462611e4e565b610388611e53565b610462611e59565b6103ff611e5e565b6103886122a7565b606481565b61200181565b606033612000146106585760405162461bcd60e51b815260040161064f90613bcc565b60405180910390fd5b60005460ff1661067a5760405162461bcd60e51b815260040161064f90613672565b60405162461bcd60e51b815260040161064f90613cbd565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b60005460ff166106e05760405162461bcd60e51b815260040161064f90613672565b6006546106ed5760146006555b6008546106fa57603c6008555b81511580159061070a5750805115155b6107265760405162461bcd60e51b815260040161064f90613b2a565b60408051600380825260808201909252606091816020015b606081526020019060019003908161073e5790505090506107606102ca6122ad565b8160008151811061076d57fe5b6020026020010181905250610781836122c8565b8160018151811061078e57fe5b60200260200101819052506107a2826122c8565b816002815181106107af57fe5b602002602001018190525060606107c58261231e565b60408051603480825260608281019093529293509091602082018180368337019050509050815160346020830182602086016068600019fa61080657600080fd5b506014810151603482015160405163436aa28360e11b8152600090612002906386d5450690610839908690600401613545565b60206040518083038186803b15801561085157600080fd5b505afa158015610865573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088991906131ae565b6001600160a01b031614156108b05760405162461bcd60e51b815260040161064f90613642565b43600854820110156108d45760405162461bcd60e51b815260040161064f906135e3565b604051631871f7d960e31b81526120029063c38fbec8906108f9908590600401613545565b600060405180830381600087803b15801561091357600080fd5b505af1158015610927573d6000803e3d6000fd5b50506040516335409f7f60e01b815261100092506335409f7f9150610950908590600401613545565b600060405180830381600087803b15801561096a57600080fd5b505af115801561097e573d6000803e3d6000fd5b50506006546040516309a99b4f60e41b815260646110028031909302049350909150639a99b4f0906109b69033908590600401613559565b602060405180830381600087803b1580156109d057600080fd5b505af11580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190613463565b505050505050505050565b61200581565b603c81565b60018181548110610a2b57fe5b6000918252602090912001546001600160a01b0316905081565b600080610a50612f79565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b6102ca81565b600881565b60065481565b61200681565b61200081565b60045481565b3361100014610af15760405162461bcd60e51b815260040161064f906138b5565b60005460ff16610b135760405162461bcd60e51b815260040161064f90613672565b61200063f7a251d7600b610b26846123af565b60006040518463ffffffff1660e01b8152600401610b4693929190613d86565b600060405180830381600087803b158015610b6057600080fd5b505af1925050508015610b71575060015b610bd9573d808015610b9f576040519150601f19603f3d011682016040523d82523d6000602084013e610ba4565b606091505b50816001600160a01b0316600080516020613e63833981519152600083604051610bcf929190613590565b60405180910390a2505b50565b60035481565b61100581565b600281565b601081565b61100881565b600581565b600b81565b61200381565b6004546005549091565b3361200014610c335760405162461bcd60e51b815260040161064f90613bcc565b60005460ff16610c555760405162461bcd60e51b815260040161064f90613672565b610c5d612f9c565b6000610c9e84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061247992505050565b915091508015610ce55781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e62996791610cd891613d67565b60405180910390a1610d1e565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e791610d1591613d67565b60405180910390a15b50505b505050565b600981565b61100781565b3361100014610d525760405162461bcd60e51b815260040161064f906138b5565b610d5c82826124f9565b5050565b60085481565b61100681565b60005460ff1681565b61200281565b61300081565b600081565b600481565b60005460ff16610dad5760405162461bcd60e51b815260040161064f90613672565b3361100714610dce5760405162461bcd60e51b815260040161064f90613a19565b610e3984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506126ac9050565b15610ed45760208114610e5e5760405162461bcd60e51b815260040161064f90613841565b604080516020601f8401819004810282018101909252828152600091610e9c9185858083850183828082843760009201919091525061270692505050565b905060018110158015610eb0575060055481105b610ecc5760405162461bcd60e51b815260040161064f90613b87565b6004556112e4565b610f3a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506126ac9050565b15610fd65760208114610f5f5760405162461bcd60e51b815260040161064f90613a67565b604080516020601f8401819004810282018101909252828152600091610f9d9185858083850183828082843760009201919091525061270692505050565b90506103e88111158015610fb2575060045481115b610fce5760405162461bcd60e51b815260040161064f9061372b565b6005556112e4565b61104384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601681527566656c6f6e79536c617368526577617264526174696f60501b602082015291506126ac9050565b156110dd57602081146110685760405162461bcd60e51b815260040161064f906139a1565b604080516020601f84018190048102820181019092528281526000916110a69185858083850183828082843760009201919091525061270692505050565b9050600a81101580156110b95750606481105b6110d55760405162461bcd60e51b815260040161064f90613aa9565b6006556112e4565b61115184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c6173680000000000000000602082015291506126ac9050565b156111c857602081146111765760405162461bcd60e51b815260040161064f90613760565b604080516020601f84018190048102820181019092528281526111b2919084848083850183828082843760009201919091525061270b92505050565b6007805460ff19169115159190911790556112e4565b61122f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601081526f66656c6f6e79536c61736853636f706560801b602082015291506126ac9050565b156112cc57602081146112545760405162461bcd60e51b815260040161064f90613930565b604080516020601f84018190048102820181019092528281526000916112929185858083850183828082843760009201919091525061270692505050565b905061708081101580156112a85750620d2f0081105b6112c45760405162461bcd60e51b815260040161064f906136a9565b6008556112e4565b60405162461bcd60e51b815260040161064f90613c68565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a8484848460405161131994939291906135b1565b60405180910390a150505050565b600a81565b61100281565b33612000146113535760405162461bcd60e51b815260040161064f90613bcc565b60005460ff166113755760405162461bcd60e51b815260040161064f90613672565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b3341146113c25760405162461bcd60e51b815260040161064f90613c1b565b60005460ff166113e45760405162461bcd60e51b815260040161064f90613672565b60035443116114055760405162461bcd60e51b815260040161064f90613cf4565b3a156114235760405162461bcd60e51b815260040161064f90613973565b60405163155853f360e21b8152611000906355614fcc90611448908490600401613545565b60206040518083038186803b15801561146057600080fd5b505afa158015611474573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149891906132b8565b6114a15761180b565b6114a9612f79565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061150457602081018051600101905261155d565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b43815260055460208201518161156f57fe5b0661173957600060208201526040516335409f7f60e01b8152611000906335409f7f906115a0908590600401613545565b600060405180830381600087803b1580156115ba57600080fd5b505af11580156115ce573d6000803e3d6000fd5b505060405163436aa28360e11b81526000925061200291506386d54506906115fa908690600401613545565b60206040518083038186803b15801561161257600080fd5b505afa158015611626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164a91906131ae565b6001600160a01b03161461166b576116668282602001516124f9565b611734565b61200063f7a251d7600b61167e856123af565b60006040518463ffffffff1660e01b815260040161169e93929190613d86565b600060405180830381600087803b1580156116b857600080fd5b505af19250505080156116c9575060015b611734573d8080156116f7576040519150601f19603f3d011682016040523d82523d6000602084013e6116fc565b606091505b50826001600160a01b0316600080516020613e6383398151915283602001518360405161172a929190613590565b60405180910390a2505b6117a5565b60045481602001518161174857fe5b066117a5576040516375abf10160e11b81526110009063eb57e20290611772908590600401613545565b600060405180830381600087803b15801561178c57600080fd5b505af11580156117a0573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166118345760405162461bcd60e51b815260040161064f90613672565b60075460ff166118565760405162461bcd60e51b815260040161064f9061360d565b6006546118635760146006555b60085461187057603c6008555b60085481516040015143910111801561189457504360085482602001516040015101115b6118b05760405162461bcd60e51b815260040161064f90613c8f565b8060200151602001518160000151602001511480156118de5750806020015160600151816000015160600151145b156118fb5760405162461bcd60e51b815260040161064f90613888565b80516040810151905110801561191a5750602081015160408101519051105b6119365760405162461bcd60e51b815260040161064f9061380a565b60208101515181515110801561195b5750806000015160400151816020015160400151105b8061198657508051516020820151511080156119865750806020015160400151816000015160400151105b806119a05750806020015160400151816000015160400151145b6119bc5760405162461bcd60e51b815260040161064f906136f4565b604080820151905163ea321e4960e01b81526110009163ea321e49916119e5919060040161357d565b60206040518083038186803b1580156119fd57600080fd5b505afa158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906132b8565b611a515760405162461bcd60e51b815260040161064f906139ea565b611a6381600001518260400151612733565b8015611a7c5750611a7c81602001518260400151612733565b611a985760405162461bcd60e51b815260040161064f906137ab565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b158015611ad657600080fd5b505afa158015611aea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b1291908101906131f5565b9150915060005b8151811015611c4f57611b43828281518110611b3157fe5b6020026020010151856040015161290b565b15611c47576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f090611b7b9033908590600401613559565b602060405180830381600087803b158015611b9557600080fd5b505af1158015611ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcd9190613463565b506110006001600160a01b03166335409f7f858481518110611beb57fe5b60200260200101516040518263ffffffff1660e01b8152600401611c0f9190613545565b600060405180830381600087803b158015611c2957600080fd5b505af1158015611c3d573d6000803e3d6000fd5b5050505050611c4f565b600101611b19565b5060408084015190516317b4f35360e01b8152600091612002916317b4f35391611c7b9160040161357d565b60206040518083038186803b158015611c9357600080fd5b505afa158015611ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccb91906131ae565b6001600160a01b031614611d39576040808401519051630e9fbf5160e01b815261200291630e9fbf5191611d02919060040161357d565b600060405180830381600087803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b50505050610d21565b6120006001600160a01b031663f7a251d7600b611d59866040015161296f565b60006040518463ffffffff1660e01b8152600401611d7993929190613d86565b600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b505050506000611dbc846040015160006129aa565b60405190915081907f7b78aadacff901d8b63d0dba4f86283d4db8aef27f9ed70413dd860f1c9532b690600090a250505050565b61100381565b601481565b61200481565b60005460ff1615611e245760405162461bcd60e51b815260040161064f90613af3565b60056004819055600a905560078054600160ff199182168117909255600080549091169091179055565b601181565b61100081565b600381565b3361100014611e7f5760405162461bcd60e51b815260040161064f906138b5565b60005460ff16611ea15760405162461bcd60e51b815260040161064f90613672565b600154611ead576122a5565b600154600090600019015b808211612279576000805b82841015611fdc57611ed3612f79565b6002600060018781548110611ee457fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611fc657600460055481611f5157fe5b04816020015103816020018181525050806002600060018881548110611f7357fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611fd0565b6001925050611fdc565b50836001019350611ec3565b82841161217357611feb612f79565b6002600060018681548110611ffc57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156120e45760046005548161206957fe5b0481602001510381602001818152505080600260006001878154811061208b57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506121739050565b60026000600186815481106120f557fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548061213957fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836121665750612173565b5060001990920191611fdc565b81801561217d5750805b1561225c57600260006001868154811061219357fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054849081106121da57fe5b600091825260209091200154600180546001600160a01b03909216918690811061220057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600180548061223957fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82612268575050612279565b505060019091019060001901611eb8565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60606122c06122bb836129c6565b6122c8565b90505b919050565b6060815160011480156122fa5750607f60f81b826000815181106122e857fe5b01602001516001600160f81b03191611155b156123065750806122c3565b6122c06123188351608060ff16612aac565b83612b7e565b606081516000141561233f57506040805160008152602081019091526122c3565b60608260008151811061234e57fe5b602002602001015190506000600190505b835181101561238f576123858285838151811061237857fe5b6020026020010151612b7e565b915060010161235f565b506123a86123a2825160c060ff16612aac565b82612b7e565b9392505050565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816123ca5790505090506123f3836001600160a01b0316612bfb565b8160008151811061240057fe5b6020026020010181905250612414436122ad565b8160018151811061242157fe5b60209081029190910101526124376102ca6122ad565b8160028151811061244457fe5b6020026020010181905250612458426122ad565b8160038151811061246557fe5b60200260200101819052506123a88161231e565b612481612f9c565b600061248b612f9c565b612493612fae565b6124a461249f86612c1e565b612c43565b90506000805b6124b383612c8d565b156124ec57806124df576124ce6124c984612cae565b612cfc565b63ffffffff168452600191506124e4565b6124ec565b6001016124aa565b5091935090915050915091565b6040516375cc7d8960e01b8152612002906375cc7d899061251e908590600401613545565b600060405180830381600087803b15801561253857600080fd5b505af1925050508015612549575060015b610d5c576040516000815260443d101561256557506000612602565b60046000803e60005160e01c6308c379a08114612586576000915050612602565b60043d036004833e81513d602482011167ffffffffffffffff821117156125b257600092505050612602565b808301805167ffffffffffffffff8111156125d4576000945050505050612602565b8060208301013d86018111156125f257600095505050505050612602565b601f01601f191660405250925050505b8061260d5750612644565b826001600160a01b0316600080516020613e638339815191528383604051612636929190613590565b60405180910390a2506126a7565b3d80801561266e576040519150601f19603f3d011682016040523d82523d6000602084013e612673565b606091505b50826001600160a01b0316600080516020613e63833981519152838360405161269d929190613590565b60405180910390a2505b610d5c565b6000816040516020016126bf9190613529565b60405160208183030381529060405280519060200120836040516020016126e69190613529565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff81161561272557600191508161272b565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b606081526020019060019003908161274f57505060408051602080825281830190925291925060609190808201818036833701905050905061279485600001516122ad565b826000815181106127a157fe5b60200260200101819052506127bc6020866020015183612d7e565b6127c5816122c8565b826001815181106127d257fe5b60200260200101819052506127ea85604001516122ad565b826002815181106127f757fe5b60200260200101819052506128126020866060015183612d7e565b61281b816122c8565b8260038151811061282857fe5b602002602001018190525061284e60206128418461231e565b8051906020012083612d7e565b6040805160b080825260e0820190925260609160208201818036833701905050905061287e818360006020612d8e565b61289081876080015160206060612d8e565b61289e818660806030612d8e565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa6128db57600080fd5b5060016128e9826000612de1565b60ff16146128fe576000945050505050612700565b5060019695505050505050565b8151815160009160019181148083146129275760009250612965565b600160208701838101602088015b6002848385100114156129605780518351146129545760009650600093505b60209283019201612935565b505050505b5090949350505050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161298a5790505090506123f3836122c8565b600081602001835110156129bd57600080fd5b50016020015190565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612a0a57506018612a2e565b6fffffffffffffffffffffffffffffffff198416612a2a57506010612a2e565b5060005b6020811015612a6457818181518110612a4357fe5b01602001516001600160f81b03191615612a5c57612a64565b600101612a2e565b60008160200390506060816040519080825280601f01601f191660200182016040528015612a99576020820181803683370190505b5080830196909652508452509192915050565b6060680100000000000000008310612ad65760405162461bcd60e51b815260040161064f906137e2565b60408051600180825281830190925260609160208201818036833701905050905060378411612b305782840160f81b81600081518110612b1257fe5b60200101906001600160f81b031916908160001a9053509050612700565b6060612b3b856129c6565b90508381510160370160f81b82600081518110612b5457fe5b60200101906001600160f81b031916908160001a905350612b758282612b7e565b95945050505050565b6060806040519050835180825260208201818101602087015b81831015612baf578051835260209283019201612b97565b50855184518101855292509050808201602086015b81831015612bdc578051835260209283019201612bc4565b508651929092011591909101601f01601f191660405250905092915050565b60408051600560a21b83186014820152603481019091526060906123a8816122c8565b612c26612fce565b506040805180820190915281518152602082810190820152919050565b612c4b612fae565b612c5482612dfd565b612c5d57600080fd5b6000612c6c8360200151612e37565b60208085015160408051808201909152868152920190820152915050919050565b6000612c97612fce565b505080518051602091820151919092015191011190565b612cb6612fce565b612cbf82612c8d565b612cc857600080fd5b60208201516000612cd882612e9a565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612d1157508151602110155b612d1a57600080fd5b6000612d298360200151612e37565b90508083600001511015612d4f5760405162461bcd60e51b815260040161064f90613b50565b825160208085015183018051928490039291831015612d7557826020036101000a820491505b50949350505050565b9091018181526020918201910152565b60005b81811015610d1e57838181518110612da557fe5b602001015160f81c60f81b858480600101955081518110612dc257fe5b60200101906001600160f81b031916908160001a905350600101612d91565b60008160010183511015612df457600080fd5b50016001015190565b8051600090612e0e575060006122c3565b6020820151805160001a9060c0821015612e2d576000925050506122c3565b5060019392505050565b8051600090811a6080811015612e515760009150506122c3565b60b8811080612e6c575060c08110801590612e6c575060f881105b15612e7b5760019150506122c3565b60c0811015612e8f5760b5190190506122c3565b60f5190190506122c3565b80516000908190811a6080811015612eb55760019150612f72565b60b8811015612eca57607e1981019150612f72565b60c0811015612f1b57600060b78203600186019550806020036101000a865104915060018101820193505080831015612f155760405162461bcd60e51b815260040161064f90613905565b50612f72565b60f8811015612f305760be1981019150612f72565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561272b5760405162461bcd60e51b815260040161064f90613905565b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b6040518060400160405280612fc1612fce565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f830112612ff8578081fd5b815161300b61300682613dd9565b613db2565b818152915060208083019084810160005b84811015613081578151870188603f82011261303757600080fd5b8381015161304761300682613df9565b81815260408b8184860101111561305d57600080fd5b61306c83888401838701613e1d565b5086525050928201929082019060010161301c565b505050505092915050565b60008083601f84011261309d578182fd5b50813567ffffffffffffffff8111156130b4578182fd5b6020830191508360208285010111156130cc57600080fd5b9250929050565b600082601f8301126130e3578081fd5b81356130f161300682613df9565b915080825283602082850101111561310857600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215613132578081fd5b61313c60a0613db2565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561317a57600080fd5b613186848285016130d3565b60808301525092915050565b6000602082840312156131a3578081fd5b81356123a881613e4d565b6000602082840312156131bf578081fd5b81516123a881613e4d565b600080604083850312156131dc578081fd5b82356131e781613e4d565b946020939093013593505050565b60008060408385031215613207578182fd5b825167ffffffffffffffff8082111561321e578384fd5b81850186601f82011261322f578485fd5b8051925061323f61300684613dd9565b80848252602080830192508084018a82838902870101111561325f578889fd5b8894505b8685101561328a57805161327681613e4d565b845260019490940193928101928101613263565b5088015190965093505050808211156132a1578283fd5b506132ae85828601612fe8565b9150509250929050565b6000602082840312156132c9578081fd5b815180151581146123a8578182fd5b600080604083850312156132ea578182fd5b823567ffffffffffffffff80821115613301578384fd5b61330d868387016130d3565b93506020850135915080821115613322578283fd5b506132ae858286016130d3565b60008060008060408587031215613344578182fd5b843567ffffffffffffffff8082111561335b578384fd5b6133678883890161308c565b9096509450602087013591508082111561337f578384fd5b5061338c8782880161308c565b95989497509550505050565b6000602082840312156133a9578081fd5b813567ffffffffffffffff808211156133c0578283fd5b818401606081870312156133d2578384fd5b6133dc6060613db2565b92508035828111156133ec578485fd5b6133f887828401613121565b84525060208101358281111561340c578485fd5b61341887828401613121565b60208501525060408101358281111561342f578485fd5b61343b878284016130d3565b6040850152509195945050505050565b60006020828403121561345c578081fd5b5035919050565b600060208284031215613474578081fd5b5051919050565b60008060006040848603121561348f578081fd5b833560ff8116811461349f578182fd5b9250602084013567ffffffffffffffff8111156134ba578182fd5b6134c68682870161308c565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452613515816020860160208601613e1d565b601f01601f19169290920160200192915050565b6000825161353b818460208701613e1d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526123a860208301846134fd565b6000838252604060208301526135a960408301846134fd565b949350505050565b6000604082526135c56040830186886134d3565b82810360208401526135d88185876134d3565b979650505050505050565b60208082526010908201526f195d9a59195b98d9481d1bdbc81bdb1960821b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b6020808252601690820152751d985b1a59185d1bdc881b9bdd081b5a59dc985d195960521b604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252602b908201527f746865206d616c6963696f757320766f746520736c6173682073636f7065206f60408201526a7574206f662072616e676560a81b606082015260800190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f6c656e677468206f662066656c6f6e79536c61736853636f7065206d69736d616040820152620e8c6d60eb1b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b60208082526029908201527f6c656e677468206f662066656c6f6e79536c617368526577617264526174696f604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b6020808252602a908201527f7468652066656c6f6e7920736c6173682072657761726420726174696f206f7560408201526974206f662072616e676560b01b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252600c908201526b32b6b83a3c903432b0b232b960a11b604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260606020830152613da260608301856134fd565b9050826040830152949350505050565b60405181810167ffffffffffffffff81118282101715613dd157600080fd5b604052919050565b600067ffffffffffffffff821115613def578081fd5b5060209081020190565b600067ffffffffffffffff821115613e0f578081fd5b50601f01601f191660200190565b60005b83811015613e38578181015183820152602001613e20565b83811115613e47576000848401525b50505050565b6001600160a01b0381168114610bd957600080fdfed7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1ca164736f6c6343000604000a", }, { ContractAddr: common.HexToAddress(TokenHubContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "6080604052600436106104405760003560e01c80639509b98011610234578063c81b16621161012e578063ebf71d53116100b6578063fb063e8f1161007a578063fb063e8f146110d3578063fc1a598f146110e8578063fc3e590814610cca578063fd6a68791461111b578063ff9c0027146108a057610488565b8063ebf71d531461106a578063f01484721461107f578063f1fad10414611094578063f9a2bbc7146110a9578063fa9e9159146110be57610488565b8063dc927faf116100fd578063dc927faf14610fce578063df8079e914610fe3578063e04c83a714610ff8578063e1c7392a14611022578063e8f35cea1461103757610488565b8063c81b166214610ef9578063c8509d8114610f0e578063cf41984414610f93578063d9e6dae91461080d57610488565b8063aa7415f5116101bc578063b99328c511610180578063b99328c514610e30578063b9fd21e314610e69578063ba35ead614610e7e578063bbface1f14610e93578063bd46646114610ec657610488565b8063aa7415f514610cdf578063aa82dce114610d26578063aad5606314610d3b578063ab51bb9614610d50578063ac43175114610d6557610488565b80639dc09262116102035780639dc0926214610c76578063a1a11bf514610c8b578063a496fba214610ca0578063a78abc1614610cb5578063a7c9f02d14610cca57610488565b80639509b98014610bda57806396713da914610c135780639a854bbd14610c285780639a99b4f014610c3d57610488565b806359b9278911610345578063727be1f8116102cd578063831d65d111610291578063831d65d114610ac85780638525db0314610b4d5780638b87b21f146107625780638eff336c14610b8657806393ab703f14610bc557610488565b8063727be1f814610a2057806375d47a0a14610a4a5780637942fd0514610a5f578063799758b914610a745780637e434d5414610ab357610488565b80636e056520116103145780636e056520146108b55780636e47b482146109e157806370fd5bad146108a0578063718a8aa8146109f657806371d3086314610a0b57610488565b806359b92789146108615780635d499b1b1461088b578063613684751461080d57806366dea52a146108a057610488565b80633fd8b02f116103c85780634a3acdf4116103975780634a3acdf4146107f85780634bf6c8821461080d57806350432d321461082257806351b4dce31461083757806351e806721461084c57610488565b80633fd8b02f1461078d57806343756e5c146107a257806343a368b9146107b7578063493279b1146107cc57610488565b8063149d14d91161040f578063149d14d91461062157806328087028146106485780632ae454831461065d5780633d713223146106b15780633dffc3871461076257610488565b80630bee7a671461048d5780630e2374a5146104bb5780631182b875146104ec57806312234582146105e657610488565b36610488573415610486576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561049957600080fd5b506104a2611130565b6040805163ffffffff9092168252519081900360200190f35b3480156104c757600080fd5b506104d0611135565b604080516001600160a01b039092168252519081900360200190f35b3480156104f857600080fd5b506105716004803603604081101561050f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561053357600080fd5b82018360208201111561054557600080fd5b803590602001918460018302840111600160201b8311171561056657600080fd5b50909250905061113b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ab578181015183820152602001610593565b50505050905090810190601f1680156105d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105f257600080fd5b506104866004803603604081101561060957600080fd5b506001600160a01b0381358116916020013516611269565b34801561062d57600080fd5b50610636611363565b60408051918252519081900360200190f35b34801561065457600080fd5b506104d0611369565b34801561066957600080fd5b506106986004803603604081101561068057600080fd5b506001600160a01b038135811691602001351661136f565b6040805192835260208301919091528051918290030190f35b3480156106bd57600080fd5b506104d0600480360360208110156106d457600080fd5b810190602081018135600160201b8111156106ee57600080fd5b82018360208201111561070057600080fd5b803590602001918460018302840111600160201b8311171561072157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611393945050505050565b34801561076e57600080fd5b506107776113b7565b6040805160ff9092168252519081900360200190f35b34801561079957600080fd5b506106366113bc565b3480156107ae57600080fd5b506104d06113c2565b3480156107c357600080fd5b506106366113c8565b3480156107d857600080fd5b506107e16113d4565b6040805161ffff9092168252519081900360200190f35b34801561080457600080fd5b506106366113da565b34801561081957600080fd5b506107776113e0565b34801561082e57600080fd5b506106366113e5565b34801561084357600080fd5b506104d06113f0565b34801561085857600080fd5b506104d06113f6565b34801561086d57600080fd5b506104d06004803603602081101561088457600080fd5b50356113fc565b34801561089757600080fd5b50610636611417565b3480156108ac57600080fd5b50610777611420565b6109cd600480360360808110156108cb57600080fd5b810190602081018135600160201b8111156108e557600080fd5b8201836020820111156108f757600080fd5b803590602001918460208302840111600160201b8311171561091857600080fd5b919390929091602081019035600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b91935091503567ffffffffffffffff16611425565b604080519115158252519081900360200190f35b3480156109ed57600080fd5b506104d06118fa565b348015610a0257600080fd5b50610777611900565b348015610a1757600080fd5b50610636611905565b348015610a2c57600080fd5b506109cd60048036036020811015610a4357600080fd5b503561190b565b348015610a5657600080fd5b506104d061198c565b348015610a6b57600080fd5b50610777611992565b348015610a8057600080fd5b5061048660048036036060811015610a9757600080fd5b508035906001600160a01b036020820135169060400135611997565b348015610abf57600080fd5b506104d0611c47565b348015610ad457600080fd5b5061048660048036036040811015610aeb57600080fd5b60ff8235169190810190604081016020820135600160201b811115610b0f57600080fd5b820183602082011115610b2157600080fd5b803590602001918460018302840111600160201b83111715610b4257600080fd5b509092509050611c4d565b348015610b5957600080fd5b5061048660048036036040811015610b7057600080fd5b50803590602001356001600160a01b0316611d95565b348015610b9257600080fd5b5061048660048036036060811015610ba957600080fd5b508035906001600160a01b036020820135169060400135611efe565b348015610bd157600080fd5b50610636611f84565b348015610be657600080fd5b5061048660048036036040811015610bfd57600080fd5b506001600160a01b038135169060200135611f89565b348015610c1f57600080fd5b50610777612146565b348015610c3457600080fd5b5061063661214b565b348015610c4957600080fd5b5061063660048036036040811015610c6057600080fd5b506001600160a01b038135169060200135612157565b348015610c8257600080fd5b506104d0612295565b348015610c9757600080fd5b506104d061229b565b348015610cac57600080fd5b506107776122a1565b348015610cc157600080fd5b506109cd6122a6565b348015610cd657600080fd5b506107776122af565b6109cd60048036036080811015610cf557600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166122b4565b348015610d3257600080fd5b506104d0612334565b348015610d4757600080fd5b506104d061233a565b348015610d5c57600080fd5b506104a26122a1565b348015610d7157600080fd5b5061048660048036036040811015610d8857600080fd5b810190602081018135600160201b811115610da257600080fd5b820183602082011115610db457600080fd5b803590602001918460018302840111600160201b83111715610dd557600080fd5b919390929091602081019035600160201b811115610df257600080fd5b820183602082011115610e0457600080fd5b803590602001918460018302840111600160201b83111715610e2557600080fd5b509092509050612340565b348015610e3c57600080fd5b5061048660048036036040811015610e5357600080fd5b50803590602001356001600160a01b03166127e8565b348015610e7557600080fd5b50610636612868565b348015610e8a57600080fd5b50610636612872565b348015610e9f57600080fd5b5061063660048036036020811015610eb657600080fd5b50356001600160a01b0316612878565b348015610ed257600080fd5b5061063660048036036020811015610ee957600080fd5b50356001600160a01b031661288a565b348015610f0557600080fd5b506104d06128a5565b348015610f1a57600080fd5b5061048660048036036040811015610f3157600080fd5b60ff8235169190810190604081016020820135600160201b811115610f5557600080fd5b820183602082011115610f6757600080fd5b803590602001918460018302840111600160201b83111715610f8857600080fd5b5090925090506128ab565b348015610f9f57600080fd5b5061048660048036036040811015610fb657600080fd5b506001600160a01b038135811691602001351661297b565b348015610fda57600080fd5b506104d0612c4f565b348015610fef57600080fd5b506104d0612c55565b34801561100457600080fd5b506109cd6004803603602081101561101b57600080fd5b5035612c5b565b34801561102e57600080fd5b50610486612cfb565b34801561104357600080fd5b506106366004803603602081101561105a57600080fd5b50356001600160a01b0316612d9b565b34801561107657600080fd5b50610777612dad565b34801561108b57600080fd5b50610777612db2565b3480156110a057600080fd5b50610777612db7565b3480156110b557600080fd5b506104d0612dbc565b3480156110ca57600080fd5b50610636612dc2565b3480156110df57600080fd5b50610636612dc8565b3480156110f457600080fd5b506105716004803603602081101561110b57600080fd5b50356001600160a01b0316612dd6565b34801561112757600080fd5b506104d0612efd565b606481565b61200181565b60005460609060ff16611183576040805162461bcd60e51b815260206004820152601960248201526000805160206153e1833981519152604482015290519081900360640190fd5b33612000146111c35760405162461bcd60e51b815260040180806020018281038252602f81526020018061538f602f913960400191505060405180910390fd5b60ff8416600214156112155761120e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0392505050565b9050611262565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b33612000146112a95760405162461bcd60e51b815260040180806020018281038252602f81526020018061538f602f913960400191505060405180910390fd5b6001600160a01b0380831660009081526007602090815260408083209385168352929052208054611314576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b0380861692908716917f152fb15aa5d80f843e1e4bd5f2fc9161714f169945024decec7e84fb910fdd519181900360200190a350505050565b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b6102ca81565b61a8c081565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661146b576040805162461bcd60e51b815260206004820152601960248201526000805160206153e1833981519152604482015290519081900360640190fd5b8685146114a95760405162461bcd60e51b815260040180806020018281038252603b815260200180615354603b913960400191505060405180910390fd5b8683146114e75760405162461bcd60e51b815260040180806020018281038252603f815260200180615266603f913960400191505060405180910390fd5b426078018267ffffffffffffffff1610156115335760405162461bcd60e51b81526004018080602001828103825260248152602001806151e26024913960400191505060405180910390fd5b6402540be4003406156115775760405162461bcd60e51b81526004018080602001828103825260408152602001806154576040913960400191505060405180910390fd5b604080518681526020808802820101909152859060009081906060908480156115aa578160200160208202803683370190505b50905060005b84811015611685576402540be4008b8b838181106115ca57fe5b90506020020135816115d857fe5b06156116155760405162461bcd60e51b815260040180806020018281038252603c8152602001806152a5603c913960400191505060405180910390fd5b61163a8b8b8381811061162457fe5b905060200201358561302790919063ffffffff16565b93506116666402540be4008c8c8481811061165157fe5b9050602002013561308190919063ffffffff16565b82828151811061167257fe5b60209081029190910101526001016115b0565b506001546116aa9061169d908663ffffffff6130c316565b849063ffffffff61302716565b3410156116e85760405162461bcd60e51b81526004018080602001828103825260568152602001806154016056913960600191505060405180910390fd5b6116f8348463ffffffff61311c16565b9150611702615020565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036117c68461315e565b6117db876402540be40063ffffffff61308116565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611839578181015183820152602001611821565b50505050905090810190601f1680156118665780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561188757600080fd5b505af115801561189b573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b601081565b60015481565b6000336120011461194d5760405162461bcd60e51b815260040180806020018281038252603381526020018061513a6033913960400191505060405180910390fd5b8115611984576040516120019083156108fc029084906000818181858888f19350505050158015611982573d6000803e3d6000fd5b505b506001919050565b61100881565b600b81565b60005460ff166119dc576040805162461bcd60e51b815260206004820152601960248201526000805160206153e1833981519152604482015290519081900360640190fd5b3361300014611a1c5760405162461bcd60e51b815260040180806020018281038252602b81526020018061523b602b913960400191505060405180910390fd5b677ce66c50e2840000811115611a635760405162461bcd60e51b81526004018080602001828103825260358152602001806152066035913960400191505060405180910390fd5b60006221272160e91b8414611bcd576000848152600460205260409020546001600160a01b031680611ad6576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a35050611c42565b6001600160a01b038116600090815260026020526040902054611af98482613419565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611b4457600080fd5b505afa158015611b58573d6000803e3d6000fd5b505050506040513d6020811015611b6e57600080fd5b50511015611bba576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b611bc686838588613459565b5050611c40565b611be2826402540be40063ffffffff6130c316565b905080471015611c30576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6000611c3e85828487613459565b505b505b505050565b61200381565b60005460ff16611c92576040805162461bcd60e51b815260206004820152601960248201526000805160206153e1833981519152604482015290519081900360640190fd5b3361200014611cd25760405162461bcd60e51b815260040180806020018281038252602f81526020018061538f602f913960400191505060405180910390fd5b60ff831660031415611d2257611d1d82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506134f192505050565b611c42565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b3361300014611dd55760405162461bcd60e51b815260040180806020018281038252602b81526020018061523b602b913960400191505060405180910390fd5b60006221272160e91b8314611e4057506000828152600460205260409020546001600160a01b031680611e40576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526007602090815260408083209386168352929052208054611eab576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814611f3e5760405162461bcd60e51b81526004018080602001828103825260238152602001806153be6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b603c81565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc357600080fd5b505afa158015611fd7573d6000803e3d6000fd5b505050506040513d6020811015611fed57600080fd5b50516001600160a01b0316331461204b576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b60008211612099576040805162461bcd60e51b81526020600482015260166024820152751e995c9bc81b1a5b5a5d081b9bdd08185b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b0383166000908152600360205260409020546120ef576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b038316600081815260066020908152604091829020859055815185815291513393927f9df3a90730dbf23b5cc18dbbd5f4af3fa94a0dffb6ff6841f98a9a9a6ac626a892908290030190a3505050565b600981565b677ce66c50e284000081565b6000805460ff1661219d576040805162461bcd60e51b815260206004820152601960248201526000805160206153e1833981519152604482015290519081900360640190fd5b33611005146121dd5760405162461bcd60e51b815260040180806020018281038252602f81526020018061516d602f913960400191505060405180910390fd5b60004783106121ec57476121ee565b825b9050670de0b6b3a764000081111561220a57600091505061228f565b801561228c576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015612246573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff166122fa576040805162461bcd60e51b815260206004820152601960248201526000805160206153e1833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200281565b61300081565b33611007146123805760405162461bcd60e51b815260040180806020018281038252602e815260200180615302602e913960400191505060405180910390fd5b602081146123d5576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b8114156124dd576020820151670de0b6b3a7640000811180159061248457506402540be4008106155b6124d5576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155612753565b61255187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601781527f6c617267655472616e736665724c6f636b506572696f640000000000000000006020820152915061354d9050565b156125ed57604080516020601f87018190048102820181019092528581526000916125949188888083850183828082843760009201919091525061363492505050565b905062093a808111156125e5576040805162461bcd60e51b81526020600482015260146024820152736c6f636b20706572696f6420746f6f206c6f6e6760601b604482015290519081900360640190fd5b600555612753565b61265987878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526015815274189b9893185c99d9551c985b9cd9995c931a5b5a5d605a1b6020820152915061354d9050565b1561271657604080516020601f870181900481028201810190925285815260009161269c9188888083850183828082843760009201919091525061363492505050565b905068056bc75e2d631000008110156126e65760405162461bcd60e51b815260040180806020018281038252602281526020018061519c6022913960400191505060405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855612753565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b33611008146128285760405162461bcd60e51b81526004018080602001828103825260238152602001806153be6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b039290921683526003815281832083905560029052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff166128f0576040805162461bcd60e51b815260206004820152601960248201526000805160206153e1833981519152604482015290519081900360640190fd5b33612000146129305760405162461bcd60e51b815260040180806020018281038252602f81526020018061538f602f913960400191505060405180910390fd5b60ff831660031415611d2257611d1d82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061363992505050565b60085460ff16600214156129c7576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054612a3f576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015612a98576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516612b0b576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114612afb576040519150601f19603f3d011682016040523d82523d6000602084013e612b00565b606091505b505080915050612b9e565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612b6e57600080fd5b5087f1158015612b82573d6000803e3d6000fd5b50505050506040513d6020811015612b9957600080fd5b505190505b80612bf0576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b61200481565b60003361200214612cb3576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710612cf3576040516120029083156108fc029084906000818181858888f19350505050158015612ce9573d6000803e3d6000fd5b50600190506113b2565b506000919050565b60005460ff1615612d53576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b601181565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015612e6657828160ff1681518110612e3a57fe5b01602001516001600160f81b03191615612e5957816001019150612e5e565b612e66565b600101612e1f565b5060608160ff166040519080825280601f01601f191660200182016040528015612e97576020820181803683370190505b50905060005b8260ff168160ff161015612ef357838160ff1681518110612eba57fe5b602001015160f81c60f81b828260ff1681518110612ed457fe5b60200101906001600160f81b031916908160001a905350600101612e9d565b5095945050505050565b61100481565b6060612f0d61506c565b6000612f1884613730565b9150915080612f6e576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b6000612f798361386f565b905063ffffffff81161561300d576040808401516020808601516001600160a01b03166000908152600290915291822054612fb49190613bd5565b9050612fbe6150a1565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061300181613c0e565b955050505050506113b2565b505060408051600081526020810190915291506113b29050565b60008282018381101561228c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061228c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613cea565b6000826130d25750600061228f565b828202828482816130df57fe5b041461228c5760405162461bcd60e51b81526004018080602001828103825260218152602001806152e16021913960400191505060405180910390fd5b600061228c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d8c565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613179575050835190915061319b90613de6565b816000815181106131a857fe5b60200260200101819052506131c983602001516001600160a01b0316613df9565b816001815181106131d657fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561322157816020015b606081526020019060019003908161320c5790505b50905060005b8281101561326e5761324f8660400151828151811061324257fe5b6020026020010151613de6565b82828151811061325b57fe5b6020908102919091010152600101613227565b5061327881613e1c565b8360028151811061328557fe5b60200260200101819052506060826040519080825280602002602001820160405280156132c657816020015b60608152602001906001900390816132b15790505b50905060005b8381101561331c576132fd876060015182815181106132e757fe5b60200260200101516001600160a01b0316613df9565b82828151811061330957fe5b60209081029190910101526001016132cc565b5061332681613e1c565b8460038151811061333357fe5b602002602001018190525060608360405190808252806020026020018201604052801561337457816020015b606081526020019060019003908161335f5790505b50905060005b848110156133b457613395886080015182815181106132e757fe5b8282815181106133a157fe5b602090810291909101015260010161337a565b506133be81613e1c565b856004815181106133cb57fe5b60200260200101819052506133ed8760a0015167ffffffffffffffff16613de6565b856005815181106133fa57fe5b602002602001018190525061340e85613e1c565b979650505050505050565b600060088211156134425761343b836007198401600a0a63ffffffff6130c316565b905061228f565b61228c836008849003600a0a63ffffffff61308116565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054613490908463ffffffff61302716565b815542603c016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b6134f96150c8565b600061350483613ea6565b91509150806135445760405162461bcd60e51b81526004018080602001828103825260248152602001806153306024913960400191505060405180910390fd5b611c4282614071565b6000816040516020018082805190602001908083835b602083106135825780518252601f199092019160209182019101613563565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106135f05780518252601f1990920191602091820191016135d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b613641615020565b600061364c836144f5565b915091508061368c5760405162461bcd60e51b81526004018080602001828103825260248152602001806151be6024913960400191505060405180910390fd5b6136946150c8565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015613715576136f2856040015182815181106136e457fe5b602002602001015183613419565b8560400151828151811061370257fe5b60209081029190910101526001016136c4565b506080840151604083015260056060830152611c3e82614071565b61373861506c565b600061374261506c565b61374a6150ff565b61375b61375686614759565b61477e565b90506000805b61376a836147c8565b15613862578061378c57613785613780846147e9565b614837565b845261385a565b80600114156137b9576137a66137a1846147e9565b6148ee565b6001600160a01b0316602085015261385a565b80600214156137d8576137ce613780846147e9565b604085015261385a565b8060031415613800576137ed6137a1846147e9565b6001600160a01b0316606085015261385a565b8060041415613828576138156137a1846147e9565b6001600160a01b0316608085015261385a565b80600514156138555761383d613780846147e9565b67ffffffffffffffff1660a08501526001915061385a565b613862565b600101613761565b5091935090915050915091565b60208101516000906001600160a01b03166139b3578160a0015167ffffffffffffffff164211156138a2575060016113b2565b81604001514710156138b6575060036113b2565b6138bf82614908565b61393457606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d806000811461391a576040519150601f19603f3d011682016040523d82523d6000602084013e61391f565b606091505b50509050806139325750600490506113b2565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5982602001518360600151846040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060006113b2565b8160a0015167ffffffffffffffff164211156139d1575060016113b2565b81516020808401516001600160a01b0316600090815260039091526040902054146139fe575060026113b2565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015613a4e57600080fd5b5086fa158015613a62573d6000803e3d6000fd5b50505050506040513d6020811015613a7957600080fd5b50516040840151909150811015613a945750600390506113b2565b613a9d83614908565b613b5457600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015613b1257600080fd5b5087f1158015613b26573d6000803e3d6000fd5b50505050506040513d6020811015613b3d57600080fd5b5051905080613b525750600591506113b29050565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a150600090506113b2565b60006008821115613bf75761343b836007198401600a0a63ffffffff61308116565b61228c836008849003600a0a63ffffffff6130c316565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081613c295750508351909150613c4b90613de6565b81600081518110613c5857fe5b6020026020010181905250613c708360200151613de6565b81600181518110613c7d57fe5b6020026020010181905250613c9e83604001516001600160a01b0316613df9565b81600281518110613cab57fe5b6020026020010181905250613cc9836060015163ffffffff16613de6565b81600381518110613cd657fe5b602002602001018190525061126281613e1c565b60008183613d765760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d3b578181015183820152602001613d23565b50505050905090810190601f168015613d685780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d8257fe5b0495945050505050565b60008184841115613dde5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d3b578181015183820152602001613d23565b505050900390565b606061228f613df483614a76565b614b5c565b60408051600560a21b831860148201526034810190915260609061126281614b5c565b6060815160001415613e3d57506040805160008152602081019091526113b2565b606082600081518110613e4c57fe5b602002602001015190506000600190505b8351811015613e8d57613e8382858381518110613e7657fe5b6020026020010151614bae565b9150600101613e5d565b50611262613ea0825160c060ff16614c2b565b82614bae565b613eae6150c8565b6000613eb86150c8565b613ec06150ff565b613ecc61375686614759565b90506000805b613edb836147c8565b156138625780613f0157613ef16137a1846147e9565b6001600160a01b03168452614069565b8060011415613fa2576060613f1d613f18856147e9565b614d23565b90508051604051908082528060200260200182016040528015613f4a578160200160208202803683370190505b50602086015260005b8151811015613f9b57613f78828281518110613f6b57fe5b6020026020010151614837565b86602001518281518110613f8857fe5b6020908102919091010152600101613f53565b5050614069565b8060021415614044576060613fb9613f18856147e9565b90508051604051908082528060200260200182016040528015613fe6578160200160208202803683370190505b50604086015260005b8151811015613f9b5761401482828151811061400757fe5b60200260200101516148ee565b8660400151828151811061402457fe5b6001600160a01b0390921660209283029190910190910152600101613fef565b806003141561385557614059613780846147e9565b63ffffffff166060850152600191505b600101613ed2565b80516001600160a01b031661429b5760005b816020015151811015614295576000826040015182815181106140a257fe5b60200260200101516001600160a01b0316612710846020015184815181106140c657fe5b60209081029190910101516040516000818181858888f193505050503d806000811461410e576040519150601f19603f3d011682016040523d82523d6000602084013e614113565b606091505b50509050806141d6577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061415257fe5b60200260200101518560200151858151811061416a57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a161428c565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061420c57fe5b60200260200101518560200151858151811061422457fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101614083565b506144f2565b60005b8160200151518110156144f057600082600001516001600160a01b031663a9059cbb61c350856040015185815181106142d357fe5b6020026020010151866020015186815181106142eb57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561434257600080fd5b5087f1158015614356573d6000803e3d6000fd5b50505050506040513d602081101561436d57600080fd5b505190508015614431577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106143ad57fe5b6020026020010151856020015185815181106143c557fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16144e7565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061446757fe5b60200260200101518560200151858151811061447f57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b5060010161429e565b505b50565b6144fd615020565b6000614507615020565b61450f6150ff565b61451b61375686614759565b90506000805b61452a836147c8565b15613862578061454757614540613780846147e9565b8452614751565b806001141561456f5761455c6137a1846147e9565b6001600160a01b03166020850152614751565b80600214156145fe576060614586613f18856147e9565b905080516040519080825280602002602001820160405280156145b3578160200160208202803683370190505b50604086015260005b81518110156145f7576145d4828281518110613f6b57fe5b866040015182815181106145e457fe5b60209081029190910101526001016145bc565b5050614751565b8060031415614693576060614615613f18856147e9565b90508051604051908082528060200260200182016040528015614642578160200160208202803683370190505b50606086015260005b81518110156145f75761466382828151811061400757fe5b8660600151828151811061467357fe5b6001600160a01b039092166020928302919091019091015260010161464b565b80600414156147285760606146aa613f18856147e9565b905080516040519080825280602002602001820160405280156146d7578160200160208202803683370190505b50608086015260005b81518110156145f7576146f882828151811061400757fe5b8660800151828151811061470857fe5b6001600160a01b03909216602092830291909101909101526001016146e0565b80600514156138555761473d613780846147e9565b67ffffffffffffffff1660a0850152600191505b600101614521565b61476161511f565b506040805180820190915281518152602082810190820152919050565b6147866150ff565b61478f82614df4565b61479857600080fd5b60006147a78360200151614e2e565b60208085015160408051808201909152868152920190820152915050919050565b60006147d261511f565b505080518051602091820151919092015191011190565b6147f161511f565b6147fa826147c8565b61480357600080fd5b6020820151600061481382614e91565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061484c57508151602110155b61485557600080fd5b60006148648360200151614e2e565b905080836000015110156148bf576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156148e557826020036101000a820491505b50949350505050565b80516000906015146148ff57600080fd5b61228f82614837565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8541580156149415750600554155b156149835760008052600660205269021e19e0c9bab24000007f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85561a8c06005555b6020808301516001600160a01b03166000908152600690915260409020548015806149b15750808360400151105b156149c05760009150506113b2565b6020808401516001600160a01b039081166000908152600783526040808220606088015190931682529190925290819020908401518154614a069163ffffffff61302716565b8155600554420160018201819055606085015160208087015160408089015181519081529283019490945283516001600160a01b039384169493909116927f3fb83143cd331170da18fb1e8564d97e8ec39264b6ecb1ba248ea7596ab07258928290030190a35060019392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614aba57506018614ade565b6fffffffffffffffffffffffffffffffff198416614ada57506010614ade565b5060005b6020811015614b1457818181518110614af357fe5b01602001516001600160f81b03191615614b0c57614b14565b600101614ade565b60008160200390506060816040519080825280601f01601f191660200182016040528015614b49576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015614b8e5750607f60f81b82600081518110614b7c57fe5b01602001516001600160f81b03191611155b15614b9a5750806113b2565b61228f614bac8351608060ff16614c2b565b835b6060806040519050835180825260208201818101602087015b81831015614bdf578051835260209283019201614bc7565b50855184518101855292509050808201602086015b81831015614c0c578051835260209283019201614bf4565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614c7b576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614cd55782840160f81b81600081518110614cb757fe5b60200101906001600160f81b031916908160001a905350905061228f565b6060614ce085614a76565b90508381510160370160f81b82600081518110614cf957fe5b60200101906001600160f81b031916908160001a905350614d1a8282614bae565b95945050505050565b6060614d2e82614df4565b614d3757600080fd5b6000614d4283614fc4565b9050606081604051908082528060200260200182016040528015614d8057816020015b614d6d61511f565b815260200190600190039081614d655790505b5090506000614d928560200151614e2e565b60208601510190506000805b84811015614de957614daf83614e91565b9150604051806040016040528083815260200184815250848281518110614dd257fe5b602090810291909101015291810191600101614d9e565b509195945050505050565b8051600090614e05575060006113b2565b6020820151805160001a9060c0821015614e24576000925050506113b2565b5060019392505050565b8051600090811a6080811015614e485760009150506113b2565b60b8811080614e63575060c08110801590614e63575060f881105b15614e725760019150506113b2565b60c0811015614e865760b5190190506113b2565b60f5190190506113b2565b80516000908190811a6080811015614eac5760019150614fbd565b60b8811015614ec157607e1981019150614fbd565b60c0811015614f3b57600060b78203600186019550806020036101000a865104915060018101820193505080831015614f35576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50614fbd565b60f8811015614f505760be1981019150614fbd565b600060f78203600186019550806020036101000a865104915060018101820193505080831015614fbb576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090614fd5575060006113b2565b60008090506000614fe98460200151614e2e565b602085015185519181019250015b808210156150175761500882614e91565b82019150826001019250614ff7565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061511261511f565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79207374616b696e672073797374656d20636f6e74726163742063616e2063616c6c20746869732066756e6374696f6e746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374626e62206c61726765207472616e73666572206c696d697420746f6f20736d616c6c756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c4c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea164736f6c6343000604000a", }, { ContractAddr: common.HexToAddress(GovHubContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "608060405234801561001057600080fd5b506004361061021c5760003560e01c8063831d65d111610125578063ab51bb96116100ad578063df8079e91161007c578063df8079e914610615578063f1fad1041461061d578063f9a2bbc714610625578063fc3e59081461062d578063fd6a6879146106355761021c565b8063ab51bb9614610585578063c81b16621461058d578063c8509d8114610595578063dc927faf1461060d5761021c565b80639dc09262116100f45780639dc0926214610549578063a1a11bf514610551578063a78abc1614610559578063aa82dce114610575578063aad560631461057d5761021c565b8063831d65d1146103f857806388e4194e1461047257806396713da9146105395780639ab1a373146105415761021c565b80634bf6c882116101a857806370fd5bad1161017757806370fd5bad146103d0578063718a8aa8146103d857806375d47a0a146103e05780637942fd05146103e85780637e434d54146103f05761021c565b80634bf6c882146103b057806351b4dce3146103b857806351e80672146103c05780636e47b482146103c85761021c565b80633a21baae116101ef5780633a21baae1461035b5780633dffc3871461036357806343756e5c146103815780634900c4ea14610389578063493279b1146103915761021c565b80630bee7a67146102215780630e2374a5146102425780631182b875146102665780632808702814610353575b600080fd5b61022961063d565b6040805163ffffffff9092168252519081900360200190f35b61024a610642565b604080516001600160a01b039092168252519081900360200190f35b6102de6004803603604081101561027c57600080fd5b60ff8235169190810190604081016020820135600160201b8111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111600160201b831117156102d357600080fd5b509092509050610648565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610318578181015183820152602001610300565b50505050905090810190601f1680156103455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024a6106f7565b6102296106fd565b61036b610702565b6040805160ff9092168252519081900360200190f35b61024a610707565b61036b61070d565b610399610712565b6040805161ffff9092168252519081900360200190f35b61036b610718565b61024a61071d565b61024a610723565b61024a610729565b61036b61072f565b61036b610734565b61024a610739565b61036b61073f565b61024a610744565b6104706004803603604081101561040e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561043257600080fd5b82018360208201111561044457600080fd5b803590602001918460018302840111600160201b8311171561046557600080fd5b50909250905061074a565b005b6104706004803603606081101561048857600080fd5b810190602081018135600160201b8111156104a257600080fd5b8201836020820111156104b457600080fd5b803590602001918460018302840111600160201b831117156104d557600080fd5b919390929091602081019035600160201b8111156104f257600080fd5b82018360208201111561050457600080fd5b803590602001918460018302840111600160201b8311171561052557600080fd5b9193509150356001600160a01b03166107dc565b61036b6108c7565b6102296108cc565b61024a6108d1565b61024a6108d7565b6105616108dd565b604080519115158252519081900360200190f35b61024a6108e6565b61024a6108ec565b61022961070d565b61024a6108f2565b610470600480360360408110156105ab57600080fd5b60ff8235169190810190604081016020820135600160201b8111156105cf57600080fd5b8201836020820111156105e157600080fd5b803590602001918460018302840111600160201b8311171561060257600080fd5b5090925090506108f8565b61024a61096f565b61024a610975565b61036b61097b565b61024a610980565b61036b610986565b61024a61098b565b606481565b61200181565b60606106526115f9565b600061069385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061099192505050565b91509150806106af576106a66064610a57565b925050506106f0565b60006106ba83610ac1565b905063ffffffff81166106e157505060408051600081526020810190915291506106f09050565b6106ea81610a57565b93505050505b9392505050565b61200581565b606681565b600181565b61100181565b600081565b6102ca81565b600881565b61200681565b61200081565b61100581565b600281565b601081565b61100881565b600b81565b61200381565b336120001461078a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061165e602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b336120061461081c5760405162461bcd60e51b815260040180806020018281038252603181526020018061168d6031913960400191505060405180910390fd5b6108246115f9565b604051806060016040528087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f8801819004810282018101909252868152918101919087908790819084018382808284376000920191909152505050908252506001600160a01b03841660209091015290506108be81610ac1565b50505050505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b61100281565b33612000146109385760405162461bcd60e51b815260040180806020018281038252602f81526020018061165e602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806116be6023913960400191505060405180910390fd5b61100381565b61200481565b601181565b61100081565b600381565b61100481565b6109996115f9565b60006109a36115f9565b6109ab611623565b6109bc6109b786610e62565b610e87565b90506000805b6109cb83610ed1565b15610a4a57806109ed576109e66109e184610ef2565b610f40565b8452610a42565b8060011415610a0c57610a026109e184610ef2565b6020850152610a42565b8060021415610a3d57610a26610a2184610ef2565b610fb9565b6001600160a01b0316604085015260019150610a42565b610a4a565b6001016109c2565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081610a71579050509050610a978363ffffffff16610fd9565b81600081518110610aa457fe5b6020026020010181905250610ab881610fec565b9150505b919050565b6000610ad08260400151611076565b610b3c57604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610abc565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015610ba9578181015183820152602001610b91565b50505050905090810190601f168015610bd65780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015610c09578181015183820152602001610bf1565b50505050905090810190601f168015610c365780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610c5757600080fd5b505af1925050508015610c68575060015b610e5a576040516000815260443d1015610c8457506000610d21565b60046000803e60005160e01c6308c379a08114610ca5576000915050610d21565b60043d036004833e81513d602482011167ffffffffffffffff82111715610cd157600092505050610d21565b808301805167ffffffffffffffff811115610cf3576000945050505050610d21565b8060208301013d8601811115610d1157600095505050505050610d21565b601f01601f191660405250925050505b80610d2c5750610dcf565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d8b578181015183820152602001610d73565b50505050905090810190601f168015610db85780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610abc565b3d808015610df9576040519150601f19603f3d011682016040523d82523d6000602084013e610dfe565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610d8b578181015183820152602001610d73565b506000919050565b610e6a611643565b506040805180820190915281518152602082810190820152919050565b610e8f611623565b610e988261107c565b610ea157600080fd5b6000610eb083602001516110b6565b60208085015160408051808201909152868152920190820152915050919050565b6000610edb611643565b505080518051602091820151919092015191011190565b610efa611643565b610f0382610ed1565b610f0c57600080fd5b60208201516000610f1c82611119565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610f4e57600080fd5b6000610f5d83602001516110b6565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610f94576020820181803683370190505b5090506000816020019050610fb084876020015101828561124c565b50949350505050565b8051600090601514610fca57600080fd5b610fd382611297565b92915050565b6060610fd3610fe78361134c565b611432565b606081516000141561100d5750604080516000815260208101909152610abc565b60608260008151811061101c57fe5b602002602001015190506000600190505b835181101561105d576110538285838151811061104657fe5b6020026020010151611484565b915060010161102d565b50610ab8611070825160c060ff16611501565b82611484565b3b151590565b805160009061108d57506000610abc565b6020820151805160001a9060c08210156110ac57600092505050610abc565b5060019392505050565b8051600090811a60808110156110d0576000915050610abc565b60b88110806110eb575060c081108015906110eb575060f881105b156110fa576001915050610abc565b60c081101561110e5760b519019050610abc565b60f519019050610abc565b80516000908190811a60808110156111345760019150611245565b60b881101561114957607e1981019150611245565b60c08110156111c357600060b78203600186019550806020036101000a8651049150600181018201935050808310156111bd576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611245565b60f88110156111d85760be1981019150611245565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611243576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80611256576107d7565b5b60208110611276578251825260209283019290910190601f1901611257565b915181516020939093036101000a6000190180199091169216919091179052565b8051600090158015906112ac57508151602110155b6112b557600080fd5b60006112c483602001516110b6565b9050808360000151101561131f576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610fb057506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611390575060186113b4565b6fffffffffffffffffffffffffffffffff1984166113b0575060106113b4565b5060005b60208110156113ea578181815181106113c957fe5b01602001516001600160f81b031916156113e2576113ea565b6001016113b4565b60008160200390506060816040519080825280601f01601f19166020018201604052801561141f576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156114645750607f60f81b8260008151811061145257fe5b01602001516001600160f81b03191611155b15611470575080610abc565b610fd36114828351608060ff16611501565b835b6060806040519050835180825260208201818101602087015b818310156114b557805183526020928301920161149d565b50855184518101855292509050808201602086015b818310156114e25780518352602092830192016114ca565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310611551576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116115ab5782840160f81b8160008151811061158d57fe5b60200101906001600160f81b031916908160001a9053509050610fd3565b60606115b68561134c565b90508381510160370160f81b826000815181106115cf57fe5b60200101906001600160f81b031916908160001a9053506115f08282611484565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b6040518060400160405280611636611643565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520676f7665726e6f722074696d656c6f636b20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a164736f6c6343000604000a", }, { ContractAddr: common.HexToAddress(CrossChainContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "608060405234801561001057600080fd5b50600436106103e65760003560e01c806374f079b81161020a578063c27cdcfb11610125578063df8079e9116100b8578063f1fad10411610087578063f1fad10414610bac578063f7a251d714610bb4578063f9a2bbc714610c2c578063fc3e590814610c34578063fd6a687914610c3c576103e6565b8063df8079e914610b74578063e1c7392a14610b7c578063e3b0480514610b84578063e6400bbe14610ba4576103e6565b8063d31f968d116100f4578063d31f968d14610b2d578063d76a867514610b5c578063dc40433114610b64578063dc927faf14610b6c576103e6565b8063c27cdcfb14610af5578063c780e9de14610b15578063c81b166214610b1d578063ccc108d714610b25576103e6565b80639dc092621161019d578063aad560631161016c578063aad5606314610a27578063ab51bb9614610a2f578063ac43175114610a37578063b0355f5b146107d6576103e6565b80639dc0926214610a07578063a1a11bf514610a0f578063a78abc1614610a17578063aa82dce114610a1f576103e6565b806384013b6a116101d957806384013b6a1461091c578063863fe4ab146109f75780638cc8f561146108e457806396713da9146109ff576103e6565b806374f079b8146108fc57806375d47a0a146109045780637942fd051461090c5780637e434d5414610914576103e6565b806343756e5c116103055780636a3cb34d116102985780636e47a51a116102675780636e47a51a146108bc5780636e47b482146108dc57806370fd5bad146108e4578063718a8aa8146108ec578063719482d5146108f4576103e6565b80636a3cb34d146108645780636bacff2c1461086c5780636c46aa68146108645780636de380bd146108b4576103e6565b806351e80672116102d457806351e806721461081e5780635692ddd3146108265780635f8321771461082e57806363e1394e1461085c576103e6565b806343756e5c146107fe578063493279b1146108065780634bf6c8821461080e57806351b4dce314610816576103e6565b8063299b533d1161037d5780633a648b151161034c5780633a648b15146106725780633bdc47a6146106ae5780633dffc387146107d6578063422f9050146107de576103e6565b8063299b533d146105f85780632af6f3991461062c5780632ff32aea14610649578063308325f41461066a576103e6565b80631d130935116103b95780631d130935146104685780631e275ae11461048457806322556cdc146105e857806328087028146105f0576103e6565b806305e68258146103eb5780630bee7a67146104095780630e2374a51461042a57806314b3023b1461044e575b600080fd5b6103f3610c44565b6040805160ff9092168252519081900360200190f35b610411610c49565b6040805163ffffffff9092168252519081900360200190f35b610432610c4e565b604080516001600160a01b039092168252519081900360200190f35b610456610c54565b60408051918252519081900360200190f35b610470610c5a565b604080519115158252519081900360200190f35b6105e6600480360361010081101561049b57600080fd5b81018160a081016080820135600160201b8111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460018302840111600160201b831117156104eb57600080fd5b919390929091602081019035600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460018302840111600160201b8311171561053b57600080fd5b919390929091602081019035600160201b81111561055857600080fd5b82018360208201111561056a57600080fd5b803590602001918460018302840111600160201b8311171561058b57600080fd5b919390929091602081019035600160201b8111156105a857600080fd5b8201836020820111156105ba57600080fd5b803590602001918460018302840111600160201b831117156105db57600080fd5b509092509050610c63565b005b610456611347565b61043261134c565b6106156004803603602081101561060e57600080fd5b5035611352565b6040805161ffff9092168252519081900360200190f35b6104706004803603602081101561064257600080fd5b5035611368565b61065161137d565b60408051600792830b90920b8252519081900360200190f35b610456611386565b6106926004803603602081101561068857600080fd5b503560ff1661138c565b604080516001600160401b039092168252519081900360200190f35b610761600480360360608110156106c457600080fd5b60ff82351691602081013591810190606081016040820135600160201b8111156106ed57600080fd5b8201836020820111156106ff57600080fd5b803590602001918460018302840111600160201b8311171561072057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113a7945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561079b578181015183820152602001610783565b50505050905090810190601f1680156107c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f361141d565b610470600480360360208110156107f457600080fd5b503560ff16611422565b610432611437565b61061561143d565b6103f3611443565b610432611448565b61043261144e565b610456611454565b6105e66004803603604081101561084457600080fd5b506001600160a01b0381358116916020013516611484565b6104566116e4565b61061561170c565b6108896004803603602081101561088257600080fd5b5035611711565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b610456611740565b610432600480360360208110156108d257600080fd5b503560ff16611767565b610432611782565b6103f361170c565b6103f3611788565b61061561141d565b61045661178d565b610432611793565b6103f3611799565b61043261179e565b6105e6600480360360a081101561093257600080fd5b810190602081018135600160201b81111561094c57600080fd5b82018360208201111561095e57600080fd5b803590602001918460018302840111600160201b8311171561097f57600080fd5b919390929091602081019035600160201b81111561099c57600080fd5b8201836020820111156109ae57600080fd5b803590602001918460018302840111600160201b831117156109cf57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166117a4565b610456612a5e565b6103f3612a66565b610432612a6b565b610432612a71565b610470612a77565b610432612a80565b610432612a86565b610411610c44565b6105e660048036036040811015610a4d57600080fd5b810190602081018135600160201b811115610a6757600080fd5b820183602082011115610a7957600080fd5b803590602001918460018302840111600160201b83111715610a9a57600080fd5b919390929091602081019035600160201b811115610ab757600080fd5b820183602082011115610ac957600080fd5b803590602001918460018302840111600160201b83111715610aea57600080fd5b509092509050612a8c565b61069260048036036020811015610b0b57600080fd5b503560ff16613550565b61045661356b565b61043261358f565b6105e6613595565b61047060048036036040811015610b4357600080fd5b5080356001600160a01b0316906020013560ff166137e9565b610761613809565b610456613828565b61043261382e565b610432613834565b6105e661383a565b61069260048036036020811015610b9a57600080fd5b503560ff16613bf1565b6105e6613c0c565b6103f3613e2b565b6105e660048036036060811015610bca57600080fd5b60ff8235169190810190604081016020820135600160201b811115610bee57600080fd5b820183602082011115610c0057600080fd5b803590602001918460018302840111600160201b83111715610c2157600080fd5b919350915035613e30565b610432613f73565b6103f3613f79565b610432613f7e565b600081565b606481565b61200181565b60015481565b600b5460ff1681565b60005460ff16610ca8576040805162461bcd60e51b81526020600482015260196024820152600080516020614a62833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b158015610cf357600080fd5b505afa158015610d07573d6000803e3d6000fd5b505050506040513d6020811015610d1d57600080fd5b5051610d5a5760405162461bcd60e51b8152600401808060200182810382526023815260200180614a826023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610da657600080fd5b505afa158015610dba573d6000803e3d6000fd5b505050506040513d6020811015610dd057600080fd5b5051610e0d5760405162461bcd60e51b8152600401808060200182810382526023815260200180614a826023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610e86576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610eca576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b8888604051808383808284376040519201829003822094508f93508e9250819050838380828437808301925050509250505060405180910390201415610f46576040805162461bcd60e51b815260206004820152600c60248201526b1cd85b59481c185e5b1bd85960a21b604482015290519081900360640190fd5b60606001600160401b0360408e01358116908e83013516610f678282613f84565b80516020808301919091206000818152600e9092526040909120549194509060ff1615610fd0576040805162461bcd60e51b8152602060048201526012602482015271185b1c9958591e4818da185b1b195b99d95960721b604482015290519081900360640190fd5b6000908152600e60205260408120805460ff191660011790558f8160200201356001600160401b0316905060608f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b1580156110c657600080fd5b505afa1580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b505160408051808201909152600381526269626360e81b602082015290915061111d908290898686613fcc565b611166576040805162461bcd60e51b81526020600482015260156024820152740696e76616c6964206d65726b6c652070726f6f663605c1b604482015290519081900360640190fd5b5050505060008f60016004811061117957fe5b60200201356001600160401b0316905060608d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815293945060609392508d91508c908190840183828082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b505160408051808201909152600381526269626360e81b602082015290915061129c908290898686613fcc565b6112e5576040805162461bcd60e51b8152602060048201526015602482015274696e76616c6964206d65726b6c652070726f6f663160581b604482015290519081900360640190fd5b505050506112f16140c9565b604080516001600160401b038416815260ff83166020820152815133927f039eb91179ffd7d3b6e97f8ea106e748e827f910b872375dbc9c14a362319c3c928290030190a2505050505050505050505050505050565b603281565b61200581565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60606000825160210190506060816040519080825280601f01601f1916602001820160405280156113df576020820181803683370190505b506021810186905260018101879052828152905060418101600061140286614147565b50905061141181838851614151565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b6102ca81565b600881565b61200681565b61200081565b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b8152905190819003601801902081565b60005460ff166114c9576040805162461bcd60e51b81526020600482015260196024820152600080516020614a62833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561157757600080fd5b505afa15801561158b573d6000803e3d6000fd5b505050506040513d60208110156115a157600080fd5b50519050806115ae575060155b6000821180156115be5750808211155b6115fd576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b604080516001600160a01b038087166020808401919091529086168284015282518083038401815260608301808552815191909201207710d05390d15317d514905394d1915497d41493d413d4d05360421b909152915190819003607801902060009061166a9083614192565b905080156116dc5760408051630911a2c160e11b81526001600160a01b03888116600483015287166024820152905161100491631223458291604480830192600092919082900301818387803b1580156116c357600080fd5b505af11580156116d7573d6000803e3d6000fd5b505050505b505050505050565b604080516f14d554d411539117d41493d413d4d05360821b8152905190819003601001902081565b600281565b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f01902081565b6005602052600090815260409020546001600160a01b031681565b61100581565b601081565b60035481565b61100881565b600b81565b61200381565b60005460ff166117e9576040805162461bcd60e51b81526020600482015260196024820152600080516020614a62833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561182857600080fd5b505afa15801561183c573d6000803e3d6000fd5b505050506040513d602081101561185257600080fd5b50516118a5576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114611915576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b15801561198a57600080fd5b505afa15801561199e573d6000803e3d6000fd5b505050506040513d60208110156119b457600080fd5b50516119f15760405162461bcd60e51b8152600401808060200182810382526023815260200180614a826023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316611a5b576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b039081169083161015611ac4576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614611b165760ff81166000908152600a60205260409020805467ffffffffffffffff19166001600160401b0384161790555b600b5460ff1615611b5a576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b60608e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050611c9e6110036001600160a01b031663cba510a98e6040518263ffffffff1660e01b815260040180826001600160401b03166001600160401b0316815260200191505060206040518083038186803b158015611c4757600080fd5b505afa158015611c5b573d6000803e3d6000fd5b505050506040513d6020811015611c7157600080fd5b505160408051808201909152600381526269626360e81b6020820152611c978e8e613f84565b8585613fcc565b611ce6576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038e16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015611d3257600080fd5b505afa158015611d46573d6000803e3d6000fd5b505050506040513d6020811015611d5c57600080fd5b505190508b8b600080806060611d7189614477565b935093509350935083611e33578460ff16866001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611deb578181015183820152602001611dd3565b50505050905090810190601f168015611e185780820380516001836020036101000a031916815260200191505b509250505060405180910390a3505050505050505050612a4e565b6040805160ff85811682529151918716916001600160401b038916917f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad40919081900360200190a360ff83166123b85760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015611f00578181015183820152602001611ee8565b50505050905090810190601f168015611f2d5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015611f4d57600080fd5b505af192505050801561203157506040513d6000823e601f3d908101601f191682016040526020811015611f8057600080fd5b8101908080516040519392919084600160201b821115611f9f57600080fd5b908301906020820185811115611fb457600080fd5b8251600160201b811182820188101715611fcd57600080fd5b82525081516020918201929091019080838360005b83811015611ffa578181015183820152602001611fe2565b50505050905090810190601f1680156120275780820380516001836020036101000a031916815260200191505b5060405250505060015b612343576040516000815260443d101561204d575060006120e8565b60046000803e60005160e01c6308c379a0811461206e5760009150506120e8565b60043d036004833e81513d60248201116001600160401b0382111715612099576000925050506120e8565b80830180516001600160401b038111156120ba5760009450505050506120e8565b8060208301013d86018111156120d8576000955050505050506120e8565b601f01601f191660405250925050505b806120f35750612205565b60ff871660009081526007602052604081205461212a916001600160401b0390911690899061212590600290886113a7565b614527565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156121c55781810151838201526020016121ad565b50505050905090810190601f1680156121f25780820380516001836020036101000a031916815260200191505b509250505060405180910390a25061233e565b3d80801561222f576040519150601f19603f3d011682016040523d82523d6000602084013e612234565b606091505b5060ff8716600090815260076020526040812054612267916001600160401b0390911690899061212590600290886113a7565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b838110156123025781810151838201526020016122ea565b50505050905090810190601f16801561232f5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6123b2565b8051156123b05760ff871660009081526007602052604081205461237c916001600160401b0390911690899061212590600190866113a7565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b50612986565b60ff83166001141561265c5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561244257818101518382015260200161242a565b50505050905090810190601f16801561246f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561248f57600080fd5b505af19250505080156124a0575060015b6123b2576040516000815260443d10156124bc57506000612557565b60046000803e60005160e01c6308c379a081146124dd576000915050612557565b60043d036004833e81513d60248201116001600160401b038211171561250857600092505050612557565b80830180516001600160401b03811115612529576000945050505050612557565b8060208301013d860181111561254757600095505050505050612557565b601f01601f191660405250925050505b8061256257506125c7565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156121c55781810151838201526020016121ad565b3d8080156125f1576040519150601f19603f3d011682016040523d82523d6000602084013e6125f6565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd297735193869390928392830191850190808383600083156123025781810151838201526020016122ea565b60ff8316600214156129865760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b838110156126e65781810151838201526020016126ce565b50505050905090810190601f1680156127135780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561273357600080fd5b505af1925050508015612744575060015b612984576040516000815260443d1015612760575060006127fb565b60046000803e60005160e01c6308c379a081146127815760009150506127fb565b60043d036004833e81513d60248201116001600160401b03821117156127ac576000925050506127fb565b80830180516001600160401b038111156127cd5760009450505050506127fb565b8060208301013d86018111156127eb576000955050505050506127fb565b601f01601f191660405250925050505b8061280657506128af565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561286f578181015183820152602001612857565b50505050905090810190601f16801561289c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612984565b3d8080156128d9576040519150601f19603f3d011682016040523d82523d6000602084013e6128de565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b83811015612948578181015183820152602001612930565b50505050905090810190601f1680156129755780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e6918a913391879116806129b8575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015612a1857600080fd5b505af1158015612a2c573d6000803e3d6000fd5b505050506040513d6020811015612a4257600080fd5b50505050505050505050505b5050505050505050505050505050565b630102ca0081565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b3361100714612acc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806149b8602e913960400191505060405180910390fd5b600b5460ff1615612b10576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b612b7984848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506146c29050565b15612c1457604080516020601f8401819004810282018101909252828152600091612bbc918585808385018382808284376000920191909152506147a992505050565b90506127108111158015612bd15750600a8110155b612c0c5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a306032913960400191505060405180910390fd5b6001556134be565b612c7d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506146c29050565b15612e0557606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050612d005760405162461bcd60e51b815260040180806020018281038252605a8152602001806148d1605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590612d1e816147ae565b612d6f576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a350505050506134be565b612e7284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506146c29050565b15612fa357606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050612ef55760405162461bcd60e51b815260040180806020018281038252604a8152602001806149e6604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015612f99576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b50505050506134be565b61300784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c73757370656e6451756f72756d60981b602082015291506146c29050565b1561313c576002811461304b5760405162461bcd60e51b815260040180806020018281038252602d81526020018061495f602d913960400191505060405180910390fd5b600061308e600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a992505050565b905060008161ffff161180156130a8575060648161ffff16105b6130f2576040805162461bcd60e51b8152602060048201526016602482015275696e76616c69642073757370656e642071756f72756d60501b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100190206000908152600d60205220805461ffff90921661ffff199092169190911790556134be565b61319f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81526b72656f70656e51756f72756d60a01b602082015291506146c29050565b156132d257600281146131e35760405162461bcd60e51b815260040180806020018281038252602c81526020018061498c602c913960400191505060405180910390fd5b6000613226600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a992505050565b905060008161ffff16118015613240575060648161ffff16105b613289576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642072656f70656e2071756f72756d60581b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152815190819003600f0190206000908152600d60205220805461ffff90921661ffff199092169190911790556134be565b61333d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601481527363616e63656c5472616e7366657251756f72756d60601b602082015291506146c29050565b1561348157600281146133815760405162461bcd60e51b815260040180806020018281038252603481526020018061492b6034913960400191505060405180910390fd5b60006133c4600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147a992505050565b905060008161ffff161180156133de575060648161ffff16105b61342f576040805162461bcd60e51b815260206004820152601e60248201527f696e76616c69642063616e63656c207472616e736665722071756f72756d0000604482015290519081900360640190fd5b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b815281519081900360180190206000908152600d60205220805461ffff90921661ffff199092169190911790556134be565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081565b61100281565b60005460ff166135da576040805162461bcd60e51b81526020600482015260196024820152600080516020614a62833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561361d57600080fd5b505afa158015613631573d6000803e3d6000fd5b505050506040513d602081101561364757600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b15801561368857600080fd5b505afa15801561369c573d6000803e3d6000fd5b505050506040513d60208110156136b257600080fd5b50519050806136bf575060155b6000821180156136cf5750808211155b61370e576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff16613755576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f0190206000906137a6907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470614192565b905080156137e457600b805460ff1916905560405133907f899fe8c37dc61708a3aaa99c4bf143346c1d1da69af79be9e8920c0a6785b75290600090a25b505050565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b610e1081565b61100381565b61200481565b60005460ff1615613892576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16613c51576040805162461bcd60e51b81526020600482015260196024820152600080516020614a62833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015613c9457600080fd5b505afa158015613ca8573d6000803e3d6000fd5b505050506040513d6020811015613cbe57600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015613cff57600080fd5b505afa158015613d13573d6000803e3d6000fd5b505050506040513d6020811015613d2957600080fd5b5051905080613d36575060155b600082118015613d465750808211155b613d85576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff1615613dc9576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b81529051908190036010019020600090613e1b907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470614192565b905080156137e4576137e46140c9565b601181565b60005460ff16613e75576040805162461bcd60e51b81526020600482015260196024820152600080516020614a62833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116613ed25760405162461bcd60e51b81526004018080602001828103825260318152602001806148a06031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b031692613f379284928a9261212592909189918c908c90819084018382808284376000920191909152506113a792505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b60408051600e808252818301909252606091630102ca0060ff851617918391602082018180368337505050600e81810187905260068201939093529182525090505b92915050565b600085613fdb575060006140c0565b606082518451865160800101016040519080825280601f01601f191660200182016040528015614012576020820181803683370190505b5090506000614020826147b4565b60208089015182520190508660008061403889614147565b8086526020909501949092509050614051828583614151565b9283019261405e88614147565b8086526020909501949092509050614077828583614151565b9283018a81526020019261408a87614147565b909250905061409a828583614151565b5083516020016140a86147ba565b60208183886065600019fa5051600114955050505050505b95945050505050565b600b5460ff161561410d576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b600b805460ff1916600117905560405133907f6f123d3d54c84a7960a573b31c221dcd86e13fd849c5adb0c6ca851468cc1ae490600090a2565b8051602090910191565b5b60208110614171578251825260209283019290910190601f1901614152565b915181516020939093036101000a6000190180199091169216919091179052565b6000828152600d602052604081205461ffff1661425b57604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100181206000908152600d6020818152848320805461ffff199081166001179091556e149153d4115397d41493d413d4d053608a1b8552855194859003600f01852084528282528584208054821660029081179091557710d05390d15317d514905394d1915497d41493d413d4d05360421b8652865195869003601801909520845291905292902080549092161790555b6000838152600c6020526040902080546201000090046001600160801b03164210158061428c575082816001015414155b1561435f576000848152600d602090815260409182902054835461ffff90911661ffff199091161771ffffffffffffffffffffffffffffffff0000191662010000610e1042016001600160801b03160217835560018084018690558251918201909252338152614301916002840191906147d8565b5080546040805161ffff83168152620100009092046001600160801b0316602083015281810185905251339186917f9e109f0e55ef32e99e4880be2ec357f1ddb3469c79d0747ef4762da6e89fabe5916060908290030190a3614413565b60005b60028201548110156143ea57336001600160a01b031682600201828154811061438757fe5b6000918252602090912001546001600160a01b031614156143e2576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b600101614362565b50600281018054600181018255600091825260209091200180546001600160a01b031916331790555b8054600282015461ffff9091161161446d576000848152600c60205260408120805471ffffffffffffffffffffffffffffffffffff191681556001810182905590614461600283018261483d565b50506001915050613fc6565b5060009392505050565b600080600060606021855110156144a7575050604080516000808252602082019092529092508291508190614520565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156144f2576020820181803683370190505b509050600061450082614147565b509050614512858260218d5103614151565b506001975091955093509150505b9193509193565b600b5460ff161561456b576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6002544311156145aa576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556145eb565b600380546001908101918290555410156145eb576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe6102ca85604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561468257818101518382015260200161466a565b50505050905090810190601f1680156146af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106146f75780518252601f1990920191602091820191016146d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106147655780518252601f199092019160209182019101614746565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b60405180602001604052806001906020820280368337509192915050565b82805482825590600052602060002090810192821561482d579160200282015b8281111561482d57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147f8565b5061483992915061485e565b5090565b508054600082559060005260206000209081019061485b9190614885565b50565b61488291905b808211156148395780546001600160a01b0319168155600101614864565b90565b61488291905b80821115614839576000815560010161488b56fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c6572416464726573736c656e677468206f662076616c756520666f722063616e63656c5472616e7366657251756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722073757370656e6451756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722072656f70656e51756f72756d2073686f756c642062652032746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d74686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a", }, { ContractAddr: common.HexToAddress(StakingContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "6080604052600436106103d25760003560e01c8063718a8aa8116101fd578063b88a802f11610118578063dc927faf116100ab578063f45fd80b1161007a578063f45fd80b14610cdb578063f9a2bbc714610d20578063fa03f79714610d35578063fc3e5908146106d3578063fd6a687914610d4a576103d9565b8063dc927faf14610c87578063df8079e914610c9c578063edc1a5b014610cb1578063f1fad10414610cc6576103d9565b8063c81b1662116100e7578063c81b166214610bb2578063c8509d8114610bc7578063d61b9b9314610c4c578063d7ecfcb614610890576103d9565b8063b88a802f14610b38578063baaafd3b14610b4d578063bf8546ca14610b62578063c2117d8214610b9d576103d9565b80639dc0926211610190578063aad560631161015f578063aad5606314610a2e578063ab51bb9614610a43578063ac43175114610a58578063b14315df14610b23576103d9565b80639dc09262146109c6578063a1a11bf5146109db578063a78abc16146109f0578063aa82dce114610a19576103d9565b80637e434d54116101cc5780637e434d5414610917578063831d65d11461092c57806392b888a41461066a57806396713da9146109b1576103d9565b8063718a8aa8146108a557806375aca593146108ba57806375d47a0a146108ed5780637942fd0514610902576103d9565b8063413d9c3a116102ed5780635d17c8bd116102805780636bd8f8041161024f5780636bd8f804146108125780636e47b482146108485780636fb7f7eb1461085d57806370fd5bad14610890576103d9565b80635d17c8bd146107be5780635d499b1b146107d357806362b171d2146107e857806369b635b6146107fd576103d9565b80634d99dd16116102bc5780634d99dd161461075357806351b4dce31461077f57806351e8067214610794578063552aaf93146107a9576103d9565b8063413d9c3a146106e857806343756e5c146106fd578063493279b1146107125780634bf6c8821461073e576103d9565b8063151817e311610365578063333ad3e711610334578063333ad3e7146106a957806334c43354146106be5780633dffc3871461066a5780633fdfa7e4146106d3576103d9565b8063151817e31461063f57806317c9efb01461066a578063280870281461067f5780632fdeb11114610694576103d9565b80630c795715116103a15780630c795715146104cc5780630e2374a5146104e15780631182b8751461051257806311fe9ec61461060c576103d9565b8063026e402b146103de578063029859921461040c578063047636d1146104335780630bee7a671461049e576103d9565b366103d957005b600080fd5b61040a600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610d5f565b005b34801561041857600080fd5b50610421610d9c565b60408051918252519081900360200190f35b34801561043f57600080fd5b506104666004803603602081101561045657600080fd5b50356001600160a01b0316610da2565b6040518082606080838360005b8381101561048b578181015183820152602001610473565b5050505090500191505060405180910390f35b3480156104aa57600080fd5b506104b3610df6565b6040805163ffffffff9092168252519081900360200190f35b3480156104d857600080fd5b50610421610dfb565b3480156104ed57600080fd5b506104f6610e01565b604080516001600160a01b039092168252519081900360200190f35b34801561051e57600080fd5b506105976004803603604081101561053557600080fd5b60ff8235169190810190604081016020820135600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460018302840111600160201b8311171561058c57600080fd5b509092509050610e07565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105d15781810151838201526020016105b9565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561061857600080fd5b506104216004803603602081101561062f57600080fd5b50356001600160a01b0316610fc3565b34801561064b57600080fd5b50610654610fde565b6040805160ff9092168252519081900360200190f35b34801561067657600080fd5b50610654610fe3565b34801561068b57600080fd5b506104f6610fe8565b3480156106a057600080fd5b50610421610fee565b3480156106b557600080fd5b506104b3610ff4565b3480156106ca57600080fd5b50610421610ff9565b3480156106df57600080fd5b50610654611004565b3480156106f457600080fd5b50610421611009565b34801561070957600080fd5b506104f6611010565b34801561071e57600080fd5b50610727611016565b6040805161ffff9092168252519081900360200190f35b34801561074a57600080fd5b5061065461101c565b61040a6004803603604081101561076957600080fd5b506001600160a01b038135169060200135611021565b34801561078b57600080fd5b506104f661164e565b3480156107a057600080fd5b506104f6611654565b3480156107b557600080fd5b5061065461165a565b3480156107ca57600080fd5b5061042161165f565b3480156107df57600080fd5b50610421611665565b3480156107f457600080fd5b5061042161166e565b34801561080957600080fd5b5061042161180e565b61040a6004803603606081101561082857600080fd5b506001600160a01b03813581169160208101359091169060400135610d5f565b34801561085457600080fd5b506104f6611814565b34801561086957600080fd5b506104216004803603602081101561088057600080fd5b50356001600160a01b031661181a565b34801561089c57600080fd5b50610654611835565b3480156108b157600080fd5b5061065461183a565b3480156108c657600080fd5b50610421600480360360208110156108dd57600080fd5b50356001600160a01b031661183f565b3480156108f957600080fd5b506104f661185a565b34801561090e57600080fd5b50610654611860565b34801561092357600080fd5b506104f6611865565b34801561093857600080fd5b5061040a6004803603604081101561094f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561097357600080fd5b82018360208201111561098557600080fd5b803590602001918460018302840111600160201b831117156109a657600080fd5b50909250905061186b565b3480156109bd57600080fd5b50610654611b33565b3480156109d257600080fd5b506104f6611b38565b3480156109e757600080fd5b506104f6611b3e565b3480156109fc57600080fd5b50610a05611b44565b604080519115158252519081900360200190f35b348015610a2557600080fd5b506104f6611b4d565b348015610a3a57600080fd5b506104f6611b53565b348015610a4f57600080fd5b506104b361165a565b348015610a6457600080fd5b5061040a60048036036040811015610a7b57600080fd5b810190602081018135600160201b811115610a9557600080fd5b820183602082011115610aa757600080fd5b803590602001918460018302840111600160201b83111715610ac857600080fd5b919390929091602081019035600160201b811115610ae557600080fd5b820183602082011115610af757600080fd5b803590602001918460018302840111600160201b83111715610b1857600080fd5b509092509050611b59565b348015610b2f57600080fd5b506106546122eb565b348015610b4457600080fd5b506104216122f0565b348015610b5957600080fd5b5061042161248d565b348015610b6e57600080fd5b5061042160048036036040811015610b8557600080fd5b506001600160a01b0381358116916020013516612498565b348015610ba957600080fd5b506104216124c5565b348015610bbe57600080fd5b506104f66124cb565b348015610bd357600080fd5b5061040a60048036036040811015610bea57600080fd5b60ff8235169190810190604081016020820135600160201b811115610c0e57600080fd5b820183602082011115610c2057600080fd5b803590602001918460018302840111600160201b83111715610c4157600080fd5b5090925090506124d1565b348015610c5857600080fd5b5061042160048036036040811015610c6f57600080fd5b506001600160a01b03813581169160200135166126f4565b348015610c9357600080fd5b506104f661271f565b348015610ca857600080fd5b506104f6612725565b348015610cbd57600080fd5b5061042161272b565b348015610cd257600080fd5b50610654612738565b348015610ce757600080fd5b5061042160048036036060811015610cfe57600080fd5b506001600160a01b03813581169160208101358216916040909101351661273d565b348015610d2c57600080fd5b506104f6612772565b348015610d4157600080fd5b50610421612778565b348015610d5657600080fd5b506104f661277e565b6040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5c1c1bdc9d1959609a1b604482015290519081900360640190fd5b60035481565b610daa614801565b610db2614801565b6001600160a01b0383166000818152600b60209081526040808320548552838352600c82528083205485830152928252600d9052819020549082015290505b919050565b606481565b6108fc81565b61200181565b60603361200014610e495760405162461bcd60e51b815260040180806020018281038252602f8152602001806149e4602f913960400191505060405180910390fd5b60005460ff16610e8c576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b610e9461481f565b610edb610ed685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061278492505050565b6127a9565b90506000610ef0610eeb836127f3565b612841565b90506000606060ff831660041415610f1557610f0b846128f8565b9092509050610f6c565b60ff831660051415610f2a57610f0b84612ad8565b6040805162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e206576656e74207479706560701b604482015290519081900360640190fd5b63ffffffff821615610fb8576040805163ffffffff84168152905160ff8516917f391d6e5ea6ab6c49b9a0abb1782cae5def8d711f973b00c729658c0b2a80b31b919081900360200190a25b979650505050505050565b6001600160a01b031660009081526006602052604090205490565b600581565b600181565b61200581565b60015481565b606581565b662386f26fc1000081565b600381565b620a8c0081565b61100181565b6102ca81565b600881565b60105460ff166002141561106d576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be400340615801561109557506402540be4008106155b6110e6576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16611129576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b600154341015611177576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b600354821015611232573360009081526005602090815260408083206001600160a01b038716845290915290205482146111e9576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6002548211611232576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b3360009081526007602090815260408083206001600160a01b03871684529091529020544210156112aa576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720756e64656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b604080518082018252601081526f6e6f7420656e6f7567682066756e647360801b602080830191909152336000908152600582528381206001600160a01b03881682529091529182205461130591859063ffffffff612df816565b9050801561134d57600254811161134d5760405162461bcd60e51b81526004018080602001828103825260258152602001806149bf6025913960400191505060405180910390fd5b6000611364846402540be40063ffffffff612e8f16565b600254909150349060009061138090839063ffffffff612ed816565b6040805160038082526080820190925291925060609190816020015b606081526020019060019003908161139c5790505090506113bc33612f1a565b816000815181106113c957fe5b60200260200101819052506113e6886001600160a01b0316612f1a565b816001815181106113f357fe5b602002602001018190525061140784612f3d565b8160028151811061141457fe5b60200260200101819052506060611434600261142f84612f50565b612fda565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600c909352912080549091019055905061148542620a8c0063ffffffff61306016565b3360009081526007602090815260408083206001600160a01b038e16845290915290205561200063f7a251d76010836114c9876402540be40063ffffffff612e8f16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561152757818101518382015260200161150f565b50505050905090810190601f1680156115545780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561157557600080fd5b505af1158015611589573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f193505050501580156115bc573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f193505050501580156115ed573d6000803e3d6000fd5b50604080518981526020810185905281516001600160a01b038c169233927fdf0b6ac27f3f3bb31cee3dab0f4fe40cc19c6a3f8daaec52e06b261e58a12519929081900390910190a350506010805460ff1916600117905550505050505050565b61200681565b61200081565b600081565b60025481565b6402540be40081565b60105460009060ff16600214156116bd576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480611724576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d806000811461177a576040519150601f19603f3d011682016040523d82523d6000602084013e61177f565b606091505b50509050806117c7576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b61100581565b6001600160a01b031660009081526004602052604090205490565b600281565b601081565b6001600160a01b031660009081526008602052604090205490565b61100881565b600b81565b61200381565b33612000146118ab5760405162461bcd60e51b815260040180806020018281038252602f8152602001806149e4602f913960400191505060405180910390fd5b60005460ff166118ee576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6118f661481f565b611938610ed684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061278492505050565b905060008060606000805b61194c866130ba565b156119b7578061196957611962610eeb876127f3565b94506119af565b80600114156119855761197e610eeb876127f3565b93506119af565b80600214156119aa5761199f61199a876127f3565b6130db565b9250600191506119af565b6119b7565b600101611943565b816119fd576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b611a068361314b565b611a49576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b611a55610ed684612784565b95506000611a65610eeb886127f3565b9050611a6f61481f565b611a78886130ba565b15611a9b57611a94610ed6611a8f61199a8b6127f3565b612784565b9050611adc565b6040805162461bcd60e51b8152602060048201526011602482015270656d7074792061636b207061636b61676560781b604482015290519081900360640190fd5b60ff821660011415611af857611af381888861319f565b611b26565b60ff821660021415611b0f57611af3818888613556565b60ff821660031415610f2a57611af3818888613823565b5050505050505050505050565b600981565b61100781565b61100681565b60005460ff1681565b61200281565b61300081565b60005460ff16611bb0576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b3361100714611bf05760405162461bcd60e51b815260040180806020018281038252602e815260200180614935602e913960400191505060405180910390fd5b611c5184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526972656c6179657246656560b01b60208201529150613b889050565b15611db75760208114611cab576040805162461bcd60e51b815260206004820152601d60248201527f6c656e677468206f662072656c61796572466565206d69736d61746368000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091611ce991858580838501838280828437600092019190915250613c6f92505050565b90506003548110611d2b5760405162461bcd60e51b815260040180806020018281038252602e815260200180614963602e913960400191505060405180910390fd5b6002548111611d6b5760405162461bcd60e51b815260040180806020018281038252602e815260200180614991602e913960400191505060405180910390fd5b6402540be400810615611daf5760405162461bcd60e51b815260040180806020018281038252602c815260200180614909602c913960400191505060405180910390fd5b600155612259565b611e1b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c62534352656c6179657246656560981b60208201529150613b889050565b15611f7d5760208114611e75576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f662062534352656c61796572466565206d69736d61746368604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091611eb391858580838501838280828437600092019190915250613c6f92505050565b905080611ef15760405162461bcd60e51b8152600401808060200182810382526022815260200180614a136022913960400191505060405180910390fd5b6001548110611f315760405162461bcd60e51b815260040180806020018281038252602e815260200180614889602e913960400191505060405180910390fd5b6402540be400810615611f755760405162461bcd60e51b815260040180806020018281038252602f81526020018061485a602f913960400191505060405180910390fd5b600255612259565b611fe184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c36b4b72232b632b3b0ba34b7b760991b60208201529150613b889050565b156120c3576020811461203b576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f66206d696e44656c65676174696f6e206d69736d61746368604482015290519081900360640190fd5b604080516020601f840181900481028201810190925282815260009161207991858580838501838280828437600092019190915250613c6f92505050565b905060015481116120bb5760405162461bcd60e51b81526004018080602001828103825260318152602001806148b76031913960400191505060405180910390fd5b600355612259565b61212584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a7472616e7366657247617360a81b60208201529150613b889050565b1561221c576020811461217f576040805162461bcd60e51b815260206004820152601e60248201527f6c656e677468206f66207472616e73666572476173206d69736d617463680000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916121bd91858580838501838280828437600092019190915250613c6f92505050565b905060008111612214576040805162461bcd60e51b815260206004820152601e60248201527f746865207472616e736665724761732063616e6e6f74206265207a65726f0000604482015290519081900360640190fd5b601155612259565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b600481565b60105460009060ff166002141561233f576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff1916600217905533600090815260066020526040902054806123a3576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d80600081146123f9576040519150601f19603f3d011682016040523d82523d6000602084013e6123fe565b606091505b5050905080612446576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b038083166000908152600760209081526040808320938516835292905220545b92915050565b60015490565b61100281565b33612000146125115760405162461bcd60e51b815260040180806020018281038252602f8152602001806149e4602f913960400191505060405180910390fd5b60005460ff16612554576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b61259382828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061314b92505050565b6125d6576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b6125de61481f565b612620610ed684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061278492505050565b90506000612630610eeb836127f3565b905061263a61481f565b612643836130ba565b156126615761265a610ed6611a8f61199a866127f3565b90506126a7565b6040805162461bcd60e51b8152602060048201526016602482015275656d707479206661696c2061636b207061636b61676560501b604482015290519081900360640190fd5b60ff8216600114156126c1576126bc81613c74565b6126eb565b60ff8216600214156126d6576126bc81613e8e565b60ff821660031415610f2a576126bc81613fb8565b5050505b505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b61200481565b68056bc75e2d6310000081565b601181565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b61278c61483f565b506040805180820190915281518152602082810190820152919050565b6127b161481f565b6127ba8261411d565b6127c357600080fd5b60006127d28360200151614157565b60208085015160408051808201909152868152920190820152915050919050565b6127fb61483f565b612804826130ba565b61280d57600080fd5b6020820151600061281d826141ba565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061285657508151602110155b61285f57600080fd5b600061286e8360200151614157565b905080836000015110156128c9576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156128ef57826020036101000a820491505b50949350505050565b600060606000806000805b61290c876130ba565b1561295e578261292e57612927612922886127f3565b6142ed565b9150612953565b826001141561294e57612943610eeb886127f3565b905060019350612953565b61295e565b826001019250612903565b836129a4576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156129ee57600080fd5b505af1158015612a02573d6000803e3d6000fd5b505050506040513d6020811015612a1857600080fd5b5051905080612a3d57612a2f600484846065614307565b965096505050505050612ad3565b6001600160a01b038316600090815260066020526040902054612a66908363ffffffff61306016565b6001600160a01b038416600081815260066020908152604091829020939093558051858152905191927f7cc266c7b444f808013fa187f7b904d470a051a6564e78f482aa496581ba4bf892918290030190a260408051600080825260208201909252909750955050505050505b915091565b600060606000806000806000805b612aef896130ba565b15612b795784612b0c57612b056129228a6127f3565b9350612b6e565b8460011415612b2857612b216129228a6127f3565b9250612b6e565b8460021415612b4857612b3d610eeb8a6127f3565b915060019550612b6e565b8460031415612b6957612b62612b5d8a6127f3565b614403565b9050612b6e565b612b79565b846001019450612ae6565b85612bbf576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612c0957600080fd5b505af1158015612c1d573d6000803e3d6000fd5b505050506040513d6020811015612c3357600080fd5b5051905080612c5a57612c4a600586856065614307565b9850985050505050505050612ad3565b6001600160a01b038086166000818152600760209081526040808320948916835293815283822082905591815260089091522054612c9e908463ffffffff61306016565b6001600160a01b0386166000908152600860205260409020558115612d8c576001600160a01b038516600090815260046020526040902054612ce6908463ffffffff612ed816565b6001600160a01b03808716600090815260046020908152604080832094909455600581528382209288168252919091522054612d28908463ffffffff612ed816565b6001600160a01b038087166000818152600560209081526040808320948a16808452948252918290209490945580518781529051929391927fd6f878a5bcbbe79a64e6418bb0d56aaa20b9a60587d45749819df88dfc7c3c44929181900390910190a35b836001600160a01b0316856001600160a01b03167f35a799836f74fac7eccf5c73902823b970543d2274d3b93d8da3d37a255772a2856040518082815260200191505060405180910390a360408051600080825260208201909252909950975050505050505050915091565b60008184841115612e875760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e4c578181015183820152602001612e34565b50505050905090810190601f168015612e795780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000612ed183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614447565b9392505050565b6000612ed183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612df8565b60408051600560a21b8318601482015260348101909152606090612ed1816144ac565b60606124bf612f4b83614502565b6144ac565b6060815160001415612f715750604080516000815260208101909152610df1565b606082600081518110612f8057fe5b602002602001015190506000600190505b8351811015612fc157612fb782858381518110612faa57fe5b60200260200101516145e8565b9150600101612f91565b50612ed1612fd4825160c060ff16614665565b826145e8565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081612ff35790505090506130168460ff16612f3d565b8160008151811061302357fe5b6020026020010181905250613037836144ac565b8160018151811061304457fe5b602002602001018190525061305881612f50565b949350505050565b600082820183811015612ed1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006130c461483f565b505080518051602091820151919092015191011190565b80516060906130e957600080fd5b60006130f88360200151614157565b83516040805191839003808352601f19601f820116830160200190915291925060609082801561312f576020820181803683370190505b50905060008160200190506128ef84876020015101828561475d565b8051602080830191909120600e546000908152600a909252604082205480821461317a57600092505050610df1565b5050600e80546000908152600a60205260408120558054600190810190915592915050565b60008060008060005b6131b1886130ba565b1561321a57836131ce576131c7612922896127f3565b925061320f565b83600114156131ea576131e3612922896127f3565b915061320f565b836002141561320a576131ff610eeb896127f3565b90506001945061320f565b61321a565b8360010193506131a8565b84613260576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613277826402540be40063ffffffff6147a816565b6001600160a01b0385166000908152600b602052604090208054600019019055905060ff8816600114156133bd5760ff8716156132ea576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054613313908263ffffffff61306016565b6001600160a01b03808616600090815260046020908152604080832094909455600581528382209287168252919091522054613355908263ffffffff61306016565b6001600160a01b038086166000818152600560209081526040808320948916808452948252918290209490945580518581529051929391927f9a57c81564ab02642f34fd87e41baa9b074c18342cec3b7268b62bf752018fd1929181900390910190a361354b565b60ff881661350f576001600160a01b0384166000908152600860205260409020546133ee908263ffffffff61306016565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b15801561344a57600080fd5b505af115801561345e573d6000803e3d6000fd5b505050506040513d602081101561347457600080fd5b50516134bd576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040805182815260ff8916602082015281516001600160a01b0380871693908816927fcbd481ae600289fad8c0484d07ce0ffe4f010d7c844ecfdeaf2a13fead52886e929081900390910190a361354b565b6040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b505050505050505050565b60008060008060005b613568886130ba565b156135d157836135855761357e612922896127f3565b92506135c6565b83600114156135a15761359a612922896127f3565b91506135c6565b83600214156135c1576135b6610eeb896127f3565b9050600194506135c6565b6135d1565b83600101935061355f565b84613617576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b600061362e826402540be40063ffffffff6147a816565b6001600160a01b0385166000908152600c602052604090208054600019019055905060ff8816600114156137ad5760ff8716156136a1576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b0384166000908152600460205260409020546136ca908263ffffffff612ed816565b6001600160a01b0380861660009081526004602090815260408083209490945560058152838220928716825291909152205461370c908263ffffffff612ed816565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205561374542620a8c0063ffffffff61306016565b6001600160a01b038086166000818152600760209081526040808320948916808452948252918290209490945580518581529051929391927fd6f878a5bcbbe79a64e6418bb0d56aaa20b9a60587d45749819df88dfc7c3c44929181900390910190a361354b565b60ff881661350f576001600160a01b03808516600081815260076020908152604080832094881680845294825280832092909255815185815260ff8c169181019190915281517f4417d10c1e33efa83a770b8d4f47176e78c08c1298d534901ad3b16bb585fa2e929181900390910190a361354b565b6000806000806000805b613836896130ba565b156138bb57846138535761384c6129228a6127f3565b93506138b0565b846001141561386f576138686129228a6127f3565b92506138b0565b846002141561388b576138846129228a6127f3565b91506138b0565b84600314156138ab576138a0610eeb8a6127f3565b9050600195506138b0565b6138bb565b84600101945061382d565b85613901576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613918826402540be40063ffffffff6147a816565b6001600160a01b0386166000908152600d602052604090208054600019019055905060ff891660011415613aeb5760ff88161561398b576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038086166000908152600560209081526040808320938816835292905220546139c1908263ffffffff612ed816565b6001600160a01b038681166000908152600560209081526040808320898516845290915280822093909355908516815220546139fd9082613060565b6001600160a01b03808716600090815260056020908152604080832093881683529290522055613a3642620a8c0063ffffffff61306016565b6001600160a01b0380871660009081526009602090815260408083208985168452825280832093881683529290522055613a7942620a8c0063ffffffff61306016565b6001600160a01b038087166000818152600960209081526040808320898616808552908352818420958b1680855295835292819020959095558451868152945191947f78bffae3f8c6691ac7fc1a3bff800cb2d612f5ad9ae5b0444cfe2eb15c189e18929081900390910190a4613b7c565b60ff891661350f576001600160a01b038581166000818152600960209081526040808320898616808552818452828520968a16808652968452828520859055908352818420818552835281842093909355805186815260ff8e169281019290925280519293927fb93bee5c59f85ede6b074a99f4ffcd3e3fc0d5c3d8156de331de89a49e0ce77c9281900390910190a45b50505050505050505050565b6000816040516020018082805190602001908083835b60208310613bbd5780518252601f199092019160209182019101613b9e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310613c2b5780518252601f199092019160209182019101613c0c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60008060008060005b613c86866130ba565b15613cef5783613ca357613c9c612922876127f3565b9250613ce4565b8360011415613cbf57613cb8612922876127f3565b9150613ce4565b8360021415613cdf57613cd4610eeb876127f3565b905060019450613ce4565b613cef565b836001019350613c7d565b84613d35576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613d4c826402540be40063ffffffff6147a816565b6001600160a01b0385166000908152600b6020908152604080832080546000190190556008909152902054909150613d8a908263ffffffff61306016565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b158015613de657600080fd5b505af1158015613dfa573d6000803e3d6000fd5b505050506040513d6020811015613e1057600080fd5b5051613e59576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040516001907ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b90600090a250505050505050565b60008060008060005b613ea0866130ba565b15613f095783613ebd57613eb6612922876127f3565b9250613efe565b8360011415613ed957613ed2612922876127f3565b9150613efe565b8360021415613ef957613eee610eeb876127f3565b905060019450613efe565b613f09565b836001019350613e97565b84613f4f576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600c60209081526040808320805460001901905560078252808320938616835292905281812081905590516002917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a2505050505050565b6000806000806000805b613fcb876130ba565b156140505784613fe857613fe1612922886127f3565b9350614045565b846001141561400457613ffd612922886127f3565b9250614045565b846002141561402057614019612922886127f3565b9150614045565b846003141561404057614035610eeb886127f3565b905060019550614045565b614050565b846001019450613fc2565b85614096576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038481166000908152600d602090815260408083208054600019019055600982528083208785168085528184528285209588168552948352818420849055825280832093835292905281812081905590516003917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a250505050505050565b805160009061412e57506000610df1565b6020820151805160001a9060c082101561414d57600092505050610df1565b5060019392505050565b8051600090811a6080811015614171576000915050610df1565b60b881108061418c575060c0811080159061418c575060f881105b1561419b576001915050610df1565b60c08110156141af5760b519019050610df1565b60f519019050610df1565b80516000908190811a60808110156141d557600191506142e6565b60b88110156141ea57607e19810191506142e6565b60c081101561426457600060b78203600186019550806020036101000a86510491506001810182019350508083101561425e576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142e6565b60f88110156142795760be19810191506142e6565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e4576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906015146142fe57600080fd5b6124bf82612841565b60006060614320846402540be40063ffffffff612e8f16565b60408051600480825260a0820190925291955060609190816020015b606081526020019060019003908161433c57905050905061435f8760ff16612f3d565b8160008151811061436c57fe5b6020026020010181905250614389866001600160a01b0316612f1a565b8160018151811061439657fe5b60200260200101819052506143aa85612f3d565b816002815181106143b757fe5b60200260200101819052506143d18463ffffffff16612f3d565b816003815181106143de57fe5b602002602001018190525060606143f482612f50565b94989497509395505050505050565b805160009060011461441457600080fd5b6020820151805160001a9081158061442c5750608082145b1561443c57600092505050610df1565b600192505050610df1565b600081836144965760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e4c578181015183820152602001612e34565b5060008385816144a257fe5b0495945050505050565b6060815160011480156144de5750607f60f81b826000815181106144cc57fe5b01602001516001600160f81b03191611155b156144ea575080610df1565b6124bf6144fc8351608060ff16614665565b836145e8565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166145465750601861456a565b6fffffffffffffffffffffffffffffffff1984166145665750601061456a565b5060005b60208110156145a05781818151811061457f57fe5b01602001516001600160f81b03191615614598576145a0565b60010161456a565b60008160200390506060816040519080825280601f01601f1916602001820160405280156145d5576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015614619578051835260209283019201614601565b50855184518101855292509050808201602086015b8183101561464657805183526020928301920161462e565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106146b5576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161470f5782840160f81b816000815181106146f157fe5b60200101906001600160f81b031916908160001a90535090506124bf565b606061471a85614502565b90508381510160370160f81b8260008151811061473357fe5b60200101906001600160f81b031916908160001a90535061475482826145e8565b95945050505050565b80614767576126ef565b5b60208110614787578251825260209283019290910190601f1901614768565b915181516020939093036101000a6000190180199091169216919091179052565b6000826147b7575060006124bf565b828202828482816147c457fe5b0414612ed15760405162461bcd60e51b81526004018080602001828103825260218152602001806148e86021913960400191505060405180910390fd5b60405180606001604052806003906020820280368337509192915050565b604051806040016040528061483261483f565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe7468652042534352656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f7468652042534352656c61796572466565206d757374206265206c657373207468616e2072656c61796572466565746865206d696e44656c65676174696f6e206d7573742062652067726561746572207468616e2072656c61796572466565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777468652072656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163747468652072656c61796572466565206d757374206265206c657373207468616e206d696e44656c65676174696f6e7468652072656c61796572466565206d757374206265206d6f7265207468616e2042534352656c61796572466565696e73756666696369656e742062616c616e636520616674657220756e64656c6567617465746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747468652042534352656c61796572466565206d757374206e6f74206265207a65726fa164736f6c6343000604000a", }, { ContractAddr: common.HexToAddress(StakeHubContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", - Code: "608060405260043610620003db5760003560e01c806386d545061162000203578063d115a2061162000117578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000bed578063fb50b31f1462000c12578063fc0c5ff11462000c37578063ff69ab611462000c4f57600080fd5b8063e992aaf51462000b6a578063efdbf0e11462000b82578063f1f74d841462000bbe578063f1fad1041462000bd657600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000afd578063daacdb661462000b15578063dbda7fb31462000b2d578063e8f67c3b1462000b5257600080fd5b8063d115a2061462000a9b578063d6ca429d1462000ab3578063d7c2dfc81462000ad857600080fd5b8063b187bd261162000199578063c38fbec81162000164578063c38fbec81462000a1d578063c473318f1462000a42578063c8509d81146200083b578063cbb04d9d1462000a5a57600080fd5b8063b187bd26146200098a578063baa7199e14620009aa578063bdceadf314620009cf578063bff02e2014620009e757600080fd5b8063982ef0a711620001da578063982ef0a714620008f5578063a43569b3146200090c578063aad3ec961462000940578063ac431751146200096557600080fd5b806386d5450614620008785780638a4d3fa814620008b25780638cd22b2214620008d057600080fd5b80634bf6c88211620002fb578063663706d3116200029157806376e7d6d6116200025c57806376e7d6d6146200080b5780638129fc1c1462000823578063831d65d1146200083b5780638456cb59146200086057600080fd5b8063663706d314620007385780636ec01b2714620007695780636f8e2fa414620007c157806375cc7d8914620007e657600080fd5b80635949187111620002d25780635949187114620006a05780635e7cc1c914620006c557806363a036b514620006ea57806364028fbd146200072157600080fd5b80634bf6c88214620006395780634d99dd1614620006635780634e6fd6c4146200068857600080fd5b80631fa8882b1162000371578063449ecfe61162000348578063449ecfe6146200058557806345211bfd14620005aa5780634838d16514620005cf5780634a49ac4c146200061457600080fd5b80631fa8882b1462000531578063384099881462000548578063417c73a7146200056057600080fd5b8063092193ab11620003b2578063092193ab146200047c5780630e9fbf5114620004935780631182b87514620004b857806317b4f35314620004ec57600080fd5b8063046f7da214620003fb578063059ddd2214620004135780630661806e146200045557600080fd5b36620003f65760345460ff16600114620003f457600080fd5b005b600080fd5b3480156200040857600080fd5b50620003f462000c67565b3480156200042057600080fd5b506200043862000432366004620093cc565b62000cf9565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200046257600080fd5b506200046d60365481565b6040519081526020016200044c565b620003f46200048d366004620093cc565b6200110e565b348015620004a057600080fd5b50620003f4620004b236600462009430565b6200174c565b348015620004c557600080fd5b50620004dd620004d736600462009475565b62001a74565b6040516200044c919062009528565b348015620004f957600080fd5b50620004386200050b3660046200961e565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200053e57600080fd5b506200046d603c81565b3480156200055557600080fd5b506200046d60375481565b3480156200056d57600080fd5b50620003f46200057f366004620093cc565b62001d4d565b3480156200059257600080fd5b50620003f4620005a4366004620093cc565b62001dcf565b348015620005b757600080fd5b50620003f4620005c9366004620093cc565b62001fb4565b348015620005dc57600080fd5b5062000603620005ee366004620093cc565b60016020526000908152604090205460ff1681565b60405190151581526020016200044c565b3480156200062157600080fd5b50620003f462000633366004620093cc565b6200218f565b3480156200064657600080fd5b5062000650600881565b60405160ff90911681526020016200044c565b3480156200067057600080fd5b50620003f46200068236600462009673565b6200220b565b3480156200069557600080fd5b506200043861dead81565b348015620006ad57600080fd5b50620003f4620006bf366004620096b1565b62002828565b348015620006d257600080fd5b50620003f4620006e436600462009721565b620035fa565b348015620006f757600080fd5b506200070f6200070936600462009741565b62003800565b6040516200044c9493929190620097aa565b620003f46200073236600462009866565b62003e92565b3480156200074557600080fd5b506200046d62000757366004620093cc565b60446020526000908152604090205481565b3480156200077657600080fd5b506200078e62000788366004620093cc565b620044dc565b6040805182516001600160401b03908116825260208085015182169083015292820151909216908201526060016200044c565b348015620007ce57600080fd5b50620004dd620007e0366004620093cc565b62004586565b348015620007f357600080fd5b50620003f462000805366004620093cc565b6200499f565b3480156200081857600080fd5b506200046d603d5481565b3480156200083057600080fd5b50620003f462004b71565b3480156200084857600080fd5b50620003f46200085a36600462009475565b62004e83565b3480156200086d57600080fd5b50620003f462004eed565b3480156200088557600080fd5b506200043862000897366004620093cc565b6043602052600090815260409020546001600160a01b031681565b348015620008bf57600080fd5b506200046d670de0b6b3a764000081565b348015620008dd57600080fd5b506200046d620008ef36600462009673565b62004f85565b620003f4620009063660046200993e565b6200503e565b3480156200091957600080fd5b50620009316200092b366004620093cc565b620056c8565b6040516200044c91906200997c565b3480156200094d57600080fd5b50620003f46200095f36600462009673565b620059b5565b3480156200097257600080fd5b50620003f462000984366004620099f9565b62005a22565b3480156200099757600080fd5b5060005462010000900460ff1662000603565b348015620009b757600080fd5b50620003f4620009c936600462009ab2565b620068c1565b348015620009dc57600080fd5b506200046d603c5481565b348015620009f457600080fd5b5062000a0c62000a0636600462009741565b62006a8e565b6040516200044c9392919062009b0e565b34801562000a2a57600080fd5b50620003f462000a3c366004620093cc565b62006c6a565b34801562000a4f57600080fd5b506200046d60385481565b34801562000a6757600080fd5b5062000a7f62000a79366004620093cc565b62006f28565b604080519384529115156020840152908201526060016200044c565b34801562000aa857600080fd5b506200046d61271081565b34801562000ac057600080fd5b50620003f462000ad236600462009b6b565b62007358565b34801562000ae557600080fd5b50620003f462000af736600462009c54565b6200755a565b34801562000b0a57600080fd5b506200046d603b5481565b34801562000b2257600080fd5b506200046d60495481565b34801562000b3a57600080fd5b506200043862000b4c366004620093cc565b62007650565b34801562000b5f57600080fd5b506200046d60355481565b34801562000b7757600080fd5b506200046d603a5481565b34801562000b8f57600080fd5b506200046d62000ba13660046200961e565b805160208183018101805160468252928201919093012091525481565b34801562000bcb57600080fd5b506200046d603e5481565b34801562000be357600080fd5b5062000650601181565b34801562000bfa57600080fd5b506200046d62000c0c36600462009673565b62007a67565b34801562000c1f57600080fd5b50620003f462000c31366004620099f9565b62007ad8565b34801562000c4457600080fd5b506200046d60395481565b34801562000c5c57600080fd5b506200046d604a5481565b600054630100000090046001600160a01b0316331462000c9a576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000cc457604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000d649062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462000d929062009cba565b801562000de35780601f1062000db75761010080835404028352916020019162000de3565b820191906000526020600020905b81548152906001019060200180831162000dc557829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000e0e9062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3c9062009cba565b801562000e8d5780601f1062000e615761010080835404028352916020019162000e8d565b820191906000526020600020905b81548152906001019060200180831162000e6f57829003601f168201915b5050505050815260200160018201805462000ea89062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462000ed69062009cba565b801562000f275780601f1062000efb5761010080835404028352916020019162000f27565b820191906000526020600020905b81548152906001019060200180831162000f0957829003601f168201915b5050505050815260200160028201805462000f429062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462000f709062009cba565b801562000fc15780601f1062000f955761010080835404028352916020019162000fc1565b820191906000526020600020905b81548152906001019060200180831162000fa357829003601f168201915b5050505050815260200160038201805462000fdc9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200100a9062009cba565b80156200105b5780601f106200102f576101008083540402835291602001916200105b565b820191906000526020600020905b8154815290600101906020018083116200103d57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620010e7575050509190925250509051949350505050565b33611000146200113a57604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b03808216600090815260436020908152604080832054841680845260418352818420825161016081018452815487168152600182015487169481019490945260028101549095169183019190915260038401546060830152600484018054919491608084019190620011b39062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620011e19062009cba565b8015620012325780601f10620012065761010080835404028352916020019162001232565b820191906000526020600020905b8154815290600101906020018083116200121457829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200125d9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200128b9062009cba565b8015620012dc5780601f10620012b057610100808354040283529160200191620012dc565b820191906000526020600020905b815481529060010190602001808311620012be57829003601f168201915b50505050508152602001600182018054620012f79062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620013259062009cba565b8015620013765780601f106200134a5761010080835404028352916020019162001376565b820191906000526020600020905b8154815290600101906020018083116200135857829003601f168201915b50505050508152602001600282018054620013919062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620013bf9062009cba565b8015620014105780601f10620013e45761010080835404028352916020019162001410565b820191906000526020600020905b815481529060010190602001808311620013f257829003601f168201915b505050505081526020016003820180546200142b9062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620014599062009cba565b8015620014aa5780601f106200147e57610100808354040283529160200191620014aa565b820191906000526020600020905b8154815290600101906020018083116200148c57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162001536575050509190925250505060408101519091506001600160a01b031615806200157357508060e001515b156200163057604051611002903490600081818185875af1925050503d8060008114620015bd576040519150601f19603f3d011682016040523d82523d6000602084013e620015c2565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016239060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200168757600080fd5b505af11580156200169c573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620016dd91815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017129190869060040162009cf0565b600060405180830381600087803b1580156200172d57600080fd5b505af115801562001742573d6000803e3d6000fd5b5050505050505b50565b33611001146200177457604051630f22c43960e41b8152611001600482015260240162001131565b60005462010000900460ff16156200179f57604051631785c68160e01b815260040160405180910390fd5b600060458383604051620017b592919062009d0a565b908152604051908190036020019020546001600160a01b03169050620017dd603f8262007d2a565b620017fb5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062001821603c4262009d30565b604a546000828152604b602052604090205491925011620018555760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b602052604081208054600192906200187690849062009d53565b909155505060405160469062001890908790879062009d0a565b908152602001604051809103902054600014158015620018df575042603c60468787604051620018c292919062009d0a565b908152602001604051809103902054620018dd919062009d53565b105b15620018fe57604051631898eb6b60e01b815260040160405180910390fd5b6000806200190e85600262007d4d565b91509150816200193157604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562001984573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019aa919062009d69565b9050620019b8858362007dd7565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb283836002604051620019f89392919062009d99565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001a36916001600160a01b0316908a9060040162009cf0565b600060405180830381600087803b15801562001a5157600080fd5b505af115801562001a66573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001a9e57604051630f22c43960e41b8152612000600482015260240162001131565b6034805460ff19166001179055604080516020601f8501819004810282018101909252838152600091829162001aef91879087908190840183828082843760009201919091525062007f9e92505050565b915091508062001b125760405163035ede3560e21b815260040160405180910390fd5b816060015160000362001b38575050604080516000815260208101909152905062001d3c565b606082015160405163e04c83a760e01b81526000916110049163e04c83a79162001b689160040190815260200190565b6020604051808303816000875af115801562001b88573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bae919062009dc8565b90508062001c555782602001516001600160a01b031683600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a8560600151600160405162001c0a92919062009de8565b60405180910390a385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092965062001d3c95505050505050565b600062001c628462008101565b9050600081600381111562001c7b5762001c7b62009d83565b0362001c9d575050604080516000815260208101909152925062001d3c915050565b83602001516001600160a01b031684600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a86606001518460405162001cf092919062009de8565b60405180910390a386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092975062001d3c9650505050505050565b6034805460ff191690559392505050565b600054630100000090046001600160a01b0316331462001d80576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001dfa57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001e2c5760405163b1d02c3d60e01b815260040160405180910390fd5b8062001e3a603f8262007d2a565b62001e585760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001e9657604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001ee6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f0c919062009d69565b101562001f2c576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001f525760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff19169055604980546001919060009062001f7690849062009e0f565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff161562001fdf57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620020115760405163b1d02c3d60e01b815260040160405180910390fd5b336200201f603f8262007d2a565b6200203d5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166200206557604051636520611b60e11b815260040160405180910390fd5b6001600160a01b0382811660009081526043602052604090205416151580620020a657506001600160a01b03821660009081526047602052604090205460ff165b15620020c557604051631e6f587560e11b815260040160405180910390fd5b336000818152604160205260409020600c8101544290620020e990603c9062009d53565b11156200210957604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b600054630100000090046001600160a01b03163314620021c2576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff16156200223657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620022685760405163b1d02c3d60e01b815260040160405180910390fd5b8162002276603f8262007d2a565b620022945760405163056e881160e01b815260040160405180910390fd5b81600003620022b657604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b03808416600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805433949160808401916200231e9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200234c9062009cba565b80156200239d5780601f1062002371576101008083540402835291602001916200239d565b820191906000526020600020905b8154815290600101906020018083116200237f57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620023c89062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620023f69062009cba565b8015620024475780601f106200241b5761010080835404028352916020019162002447565b820191906000526020600020905b8154815290600101906020018083116200242957829003601f168201915b50505050508152602001600182018054620024629062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620024909062009cba565b8015620024e15780601f10620024b557610100808354040283529160200191620024e1565b820191906000526020600020905b815481529060010190602001808311620024c357829003601f168201915b50505050508152602001600282018054620024fc9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200252a9062009cba565b80156200257b5780601f106200254f576101008083540402835291602001916200257b565b820191906000526020600020905b8154815290600101906020018083116200255d57829003601f168201915b50505050508152602001600382018054620025969062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620025c49062009cba565b8015620026155780601f10620025e95761010080835404028352916020019162002615565b820191906000526020600020905b815481529060010190602001808311620025f757829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620026a1575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af11580156200271b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002741919062009d69565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b40829802878460405162002792929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b031603620027bf57620027bf8662008794565b6040808301519051633041949b60e01b815261200591633041949b91620027ec9190879060040162009cf0565b600060405180830381600087803b1580156200280757600080fd5b505af11580156200281c573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff16156200285357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620028855760405163b1d02c3d60e01b815260040160405180910390fd5b8362002893603f8262007d2a565b620028b15760405163056e881160e01b815260040160405180910390fd5b83620028bf603f8262007d2a565b620028dd5760405163056e881160e01b815260040160405180910390fd5b6034805460ff1916600117905560008490036200290d57604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b031603620029405760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b0380871660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620029a89062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620029d69062009cba565b801562002a275780601f10620029fb5761010080835404028352916020019162002a27565b820191906000526020600020905b81548152906001019060200180831162002a0957829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002a529062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002a809062009cba565b801562002ad15780601f1062002aa55761010080835404028352916020019162002ad1565b820191906000526020600020905b81548152906001019060200180831162002ab357829003601f168201915b5050505050815260200160018201805462002aec9062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002b1a9062009cba565b801562002b6b5780601f1062002b3f5761010080835404028352916020019162002b6b565b820191906000526020600020905b81548152906001019060200180831162002b4d57829003601f168201915b5050505050815260200160028201805462002b869062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002bb49062009cba565b801562002c055780601f1062002bd95761010080835404028352916020019162002c05565b820191906000526020600020905b81548152906001019060200180831162002be757829003601f168201915b5050505050815260200160038201805462002c209062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002c4e9062009cba565b801562002c9f5780601f1062002c735761010080835404028352916020019162002c9f565b820191906000526020600020905b81548152906001019060200180831162002c8157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002d2b57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002db69062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002de49062009cba565b801562002e355780601f1062002e095761010080835404028352916020019162002e35565b820191906000526020600020905b81548152906001019060200180831162002e1757829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002e609062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002e8e9062009cba565b801562002edf5780601f1062002eb35761010080835404028352916020019162002edf565b820191906000526020600020905b81548152906001019060200180831162002ec157829003601f168201915b5050505050815260200160018201805462002efa9062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002f289062009cba565b801562002f795780601f1062002f4d5761010080835404028352916020019162002f79565b820191906000526020600020905b81548152906001019060200180831162002f5b57829003601f168201915b5050505050815260200160028201805462002f949062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462002fc29062009cba565b8015620030135780601f1062002fe75761010080835404028352916020019162003013565b820191906000526020600020905b81548152906001019060200180831162002ff557829003601f168201915b505050505081526020016003820180546200302e9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200305c9062009cba565b8015620030ad5780601f106200308157610100808354040283529160200191620030ad565b820191906000526020600020905b8154815290600101906020018083116200308f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620031395750505050508152505090508060e0015180156200317c5750876001600160a01b0316836001600160a01b031614155b156200319b57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af1158015620031f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003218919062009d69565b90506037548110156200323e5760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b0316148015620032d357506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa158015620032ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032d1919062009d69565b105b15620032f2576040516317b204bf60e11b815260040160405180910390fd5b6000612710603a548362003307919062009e25565b62003313919062009d30565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d806000811462003368576040519150601f19603f3d011682016040523d82523d6000602084013e6200336d565b606091505b505090508062003390576040516312171d8360e31b815260040160405180910390fd5b6200339c828462009e0f565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af1158015620033f2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062003419919062009d69565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e85896040516200347e939291909283526020830191909152604082015260600190565b60405180910390a4604080516002808252606082018352600092602083019080368337019050509050866040015181600081518110620034c257620034c262009e3f565b60200260200101906001600160a01b031690816001600160a01b031681525050856040015181600181518110620034fd57620034fd62009e3f565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b8152612005906344840775906200353e9084908c9060040162009e55565b600060405180830381600087803b1580156200355957600080fd5b505af11580156200356e573d6000803e3d6000fd5b505050508a15620035e0576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b8152600401620035ab92919062009cf0565b600060405180830381600087803b158015620035c657600080fd5b505af1158015620035db573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff16156200362557604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620036575760405163b1d02c3d60e01b815260040160405180910390fd5b3362003665603f8262007d2a565b620036835760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c8101544290620036a790603c9062009d53565b1115620036c757604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620037015760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b0390811690861610156200373f576009820154620037399086906001600160401b031662009e81565b62003759565b600982015462003759906001600160401b03168662009e81565b60098301546001600160401b039182169250600160801b900416811115620037945760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b6060806060600062003813603f620088ba565b90508086101562003e895784156200382c57846200382e565b805b94506000856200383f888462009e0f565b11620038575762003851878362009e0f565b62003859565b855b9050806001600160401b038111156200387657620038766200953d565b604051908082528060200260200182016040528015620038a0578160200160208202803683370190505b509450806001600160401b03811115620038be57620038be6200953d565b604051908082528060200260200182016040528015620038e8578160200160208202803683370190505b509350806001600160401b038111156200390657620039066200953d565b6040519080825280602002602001820160405280156200393b57816020015b6060815260200190600190039081620039255790505b50925060005b8181101562003e86576000620039656200395c838b62009d53565b603f90620088c5565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805494955091939092916080840191620039d29062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462003a009062009cba565b801562003a515780601f1062003a255761010080835404028352916020019162003a51565b820191906000526020600020905b81548152906001019060200180831162003a3357829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003a7c9062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462003aaa9062009cba565b801562003afb5780601f1062003acf5761010080835404028352916020019162003afb565b820191906000526020600020905b81548152906001019060200180831162003add57829003601f168201915b5050505050815260200160018201805462003b169062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462003b449062009cba565b801562003b955780601f1062003b695761010080835404028352916020019162003b95565b820191906000526020600020905b81548152906001019060200180831162003b7757829003601f168201915b5050505050815260200160028201805462003bb09062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462003bde9062009cba565b801562003c2f5780601f1062003c035761010080835404028352916020019162003c2f565b820191906000526020600020905b81548152906001019060200180831162003c1157829003601f168201915b5050505050815260200160038201805462003c4a9062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462003c789062009cba565b801562003cc95780601f1062003c9d5761010080835404028352916020019162003cc9565b820191906000526020600020905b81548152906001019060200180831162003cab57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162003d55575050505050815250509050806000015188848151811062003d8e5762003d8e62009e3f565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003e275780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003dfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003e21919062009d69565b62003e2a565b60005b87848151811062003e3f5762003e3f62009e3f565b602002602001018181525050806080015186848151811062003e655762003e6562009e3f565b602002602001018190525050508062003e7e9062009ea4565b905062003941565b50505b92959194509250565b60005462010000900460ff161562003ebd57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562003eef5760405163b1d02c3d60e01b815260040160405180910390fd5b3362003efd603f8262007d2a565b1562003f1c57604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b038881166000908152604360205260409020541615158062003f5d57506001600160a01b03881660009081526047602052604090205460ff165b1562003f7c57604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b03166045888860405162003f9b92919062009d0a565b908152604051908190036020019020546001600160a01b031614158062003fe557506048878760405162003fd192919062009d0a565b9081526040519081900360200190205460ff165b1562004004576040516311fdb94760e01b815260040160405180910390fd5b600062004012838062009ec0565b6040516020016200402592919062009d0a565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff16156200406f5760405163c0bf414360e01b815260040160405180910390fd5b600062004085670de0b6b3a76400003462009e0f565b9050603654811015620040ab576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a16620040d357604051636520611b60e11b815260040160405180910390fd5b611388620040e8604087016020880162009721565b6001600160401b031611806200412e57506200410b604086016020870162009721565b6001600160401b031662004123602087018762009721565b6001600160401b0316115b806200416d575062004147604086016020870162009721565b6001600160401b031662004162606087016040880162009721565b6001600160401b0316115b156200418c5760405163dc81db8560e01b815260040160405180910390fd5b620041d76200419c858062009ec0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620088d392505050565b620041f557604051635dba5ad760e01b815260040160405180910390fd5b62004204838a8a8a8a62008a75565b6200422257604051631647e3cb60e11b815260040160405180910390fd5b6000620042708462004235878062009ec0565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062008ba592505050565b90506200427f603f8562008ca6565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620042ff8b8d8362009f68565b5085600582016200431182826200a030565b50879050600982016200432582826200a169565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004373908e908e9062009d0a565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e604051620043f69291906200a239565b60405180910390a460408051848152602081018590526001600160a01b0387169182916000805160206200b540833981519152910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816916000805160206200b540833981519152910160405180910390a3604051633041949b60e01b815261200590633041949b906200449a908590899060040162009cf0565b600060405180830381600087803b158015620044b557600080fd5b505af1158015620044ca573d6000803e3d6000fd5b50505050505050505050505050505050565b60408051606081018252600080825260208201819052918101919091528162004507603f8262007d2a565b620045255760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915291505b50919050565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082810191909152600484018054919491608084019190620045f39062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620046219062009cba565b8015620046725780601f10620046465761010080835404028352916020019162004672565b820191906000526020600020905b8154815290600101906020018083116200465457829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200469d9062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620046cb9062009cba565b80156200471c5780601f10620046f0576101008083540402835291602001916200471c565b820191906000526020600020905b815481529060010190602001808311620046fe57829003601f168201915b50505050508152602001600182018054620047379062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620047659062009cba565b8015620047b65780601f106200478a57610100808354040283529160200191620047b6565b820191906000526020600020905b8154815290600101906020018083116200479857829003601f168201915b50505050508152602001600282018054620047d19062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620047ff9062009cba565b8015620048505780601f10620048245761010080835404028352916020019162004850565b820191906000526020600020905b8154815290600101906020018083116200483257829003601f168201915b505050505081526020016003820180546200486b9062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620048999062009cba565b8015620048ea5780601f10620048be57610100808354040283529160200191620048ea565b820191906000526020600020905b815481529060010190602001808311620048cc57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620049765750505091909252505050608001519392505050565b3361100114620049c757604051630f22c43960e41b8152611001600482015260240162001131565b6001600160a01b0380821660009081526043602052604090205416620049ef603f8262007d2a565b62004a0d5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004a70573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004a96919062009d69565b90506000603d544262004aaa919062009d53565b905062004ab8838262007dd7565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004af89392919062009d99565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004b36916001600160a01b031690889060040162009cf0565b600060405180830381600087803b15801562004b5157600080fd5b505af115801562004b66573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004b925750600054600160ff909116105b8062004bae5750303b15801562004bae575060005460ff166001145b62004c135760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162001131565b6000805460ff19166001179055801562004c37576000805461ff0019166101001790555b33411462004c585760405163022d8c9560e31b815260040160405180910390fd5b3a1562004c78576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d603855607860398190556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c55603d9190915560b4603e55604a556040805160c0810190915260a080825260609182916200b560602083013980602001905181019062004d0491906200a275565b9150604051806101e001604052806101c081526020016200b6006101c0913980602001905181019062004d3891906200a319565b905060005b825181101562004da75760016047600085848151811062004d625762004d6262009e3f565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562004d9f8162009ea4565b905062004d3d565b5060005b815181101562004e18576001604883838151811062004dce5762004dce62009e3f565b602002602001015160405162004de591906200a416565b908152604051908190036020019020805491151560ff1990921691909117905562004e108162009ea4565b905062004dab565b5062004e3873df87f0e2b8519ea2dd4abd8b639cdd628497ed2562008cbd565b5050801562001749576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b336120001462004eab57604051630f22c43960e41b8152612000600482015260240162001131565b7faa5ba621c8b3d7d05bb9e51a7506108251d4d5dbe542ca66fc7bb52aacb02b6583838360405162004ee0939291906200a434565b60405180910390a1505050565b600054630100000090046001600160a01b0316331462004f20576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff161562004f4b57604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600062004f94603f8462007d2a565b62004fb25760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa1580156200500f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062005035919062009d69565b90505b92915050565b60005462010000900460ff16156200506957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200509b5760405163b1d02c3d60e01b815260040160405180910390fd5b81620050a9603f8262007d2a565b620050c75760405163056e881160e01b815260040160405180910390fd5b6037543490811015620050ed5760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620051559062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620051839062009cba565b8015620051d45780601f10620051a857610100808354040283529160200191620051d4565b820191906000526020600020905b815481529060010190602001808311620051b657829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620051ff9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200522d9062009cba565b80156200527e5780601f1062005252576101008083540402835291602001916200527e565b820191906000526020600020905b8154815290600101906020018083116200526057829003601f168201915b50505050508152602001600182018054620052999062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620052c79062009cba565b8015620053185780601f10620052ec5761010080835404028352916020019162005318565b820191906000526020600020905b815481529060010190602001808311620052fa57829003601f168201915b50505050508152602001600282018054620053339062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620053619062009cba565b8015620053b25780601f106200538657610100808354040283529160200191620053b2565b820191906000526020600020905b8154815290600101906020018083116200539457829003601f168201915b50505050508152602001600382018054620053cd9062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620053fb9062009cba565b80156200544c5780601f1062005420576101008083540402835291602001916200544c565b820191906000526020600020905b8154815290600101906020018083116200542e57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620054d85750505050508152505090508060e0015180156200551b5750856001600160a01b0316826001600160a01b031614155b156200553a57604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af11580156200558b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620055b2919062009d69565b9050826001600160a01b0316876001600160a01b03166000805160206200b5408339815191528387604051620055f2929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b91620056279190879060040162009cf0565b600060405180830381600087803b1580156200564257600080fd5b505af115801562005657573d6000803e3d6000fd5b50505050851562001742576040516372f6ad8f60e11b81526120059063e5ed5b1e906200568b9086908b9060040162009cf0565b600060405180830381600087803b158015620056a657600080fd5b505af1158015620056bb573d6000803e3d6000fd5b5050505050505050505050565b620056f46040518060800160405280606081526020016060815260200160608152602001606081525090565b8162005702603f8262007d2a565b620057205760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602052604090819020815160808101909252600501805482908290620057579062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620057859062009cba565b8015620057d65780601f10620057aa57610100808354040283529160200191620057d6565b820191906000526020600020905b815481529060010190602001808311620057b857829003601f168201915b50505050508152602001600182018054620057f19062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200581f9062009cba565b8015620058705780601f10620058445761010080835404028352916020019162005870565b820191906000526020600020905b8154815290600101906020018083116200585257829003601f168201915b505050505081526020016002820180546200588b9062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620058b99062009cba565b80156200590a5780601f10620058de576101008083540402835291602001916200590a565b820191906000526020600020905b815481529060010190602001808311620058ec57829003601f168201915b50505050508152602001600382018054620059259062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620059539062009cba565b8015620059a45780601f106200597857610100808354040283529160200191620059a4565b820191906000526020600020905b8154815290600101906020018083116200598657829003601f168201915b505050505081525050915050919050565b60005462010000900460ff1615620059e057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005a125760405163b1d02c3d60e01b815260040160405180910390fd5b62005a1e828262008d56565b5050565b336110071462005a4a57604051630f22c43960e41b8152611007600482015260240162001131565b62005ab76040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b1562005b72576020811462005ae95783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f840181900481028201810190925282815260009162005b2c91858580838501838280828437600092019190915250929392505062008ebf9050565b90506108fc81108062005b40575061271081115b1562005b695784848484604051630a5a604160e01b81526004016200113194939291906200a453565b6035556200687c565b62005be36040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b1562005cad576020811462005c155783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f840181900481028201810190925282815260009162005c5891858580838501838280828437600092019190915250929392505062008ebf9050565b9050683635c9adc5dea0000081108062005c7b575069152d02c7e14af680000081115b1562005ca45784848484604051630a5a604160e01b81526004016200113194939291906200a453565b6036556200687c565b62005d20604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b1562005de7576020811462005d525783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f840181900481028201810190925282815260009162005d9591858580838501838280828437600092019190915250929392505062008ebf9050565b905067016345785d8a000081108062005db55750678ac7230489e8000081115b1562005dde5784848484604051630a5a604160e01b81526004016200113194939291906200a453565b6037556200687c565b62005e58604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b1562005f10576020811462005e8a5783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f840181900481028201810190925282815260009162005ecd91858580838501838280828437600092019190915250929392505062008ebf9050565b905080158062005ede57506101f481115b1562005f075784848484604051630a5a604160e01b81526004016200113194939291906200a453565b6038556200687c565b62005f796040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b1562006036576020811462005fab5783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f840181900481028201810190925282815260009162005fee91858580838501838280828437600092019190915250929392505062008ebf9050565b90506203f48081108062006004575062278d0081115b156200602d5784848484604051630a5a604160e01b81526004016200113194939291906200a453565b6039556200687c565b620060a460405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b15620061515760208114620060d65783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f84018190048102820181019092528281526000916200611991858580838501838280828437600092019190915250929392505062008ebf9050565b90506064811115620061485784848484604051630a5a604160e01b81526004016200113194939291906200a453565b603a556200687c565b620061c160405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b15620062825760208114620061f35783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f84018190048102820181019092528281526000916200623691858580838501838280828437600092019190915250929392505062008ebf9050565b9050674563918244f40000811080620062505750603c5481115b15620062795784848484604051630a5a604160e01b81526004016200113194939291906200a453565b603b556200687c565b620062f06040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b15620063b35760208114620063225783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f84018190048102820181019092528281526000916200636591858580838501838280828437600092019190915250929392505062008ebf9050565b905068056bc75e2d63100000811080620063815750603b548111155b15620063aa5784848484604051630a5a604160e01b81526004016200113194939291906200a453565b603c556200687c565b620064206040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b15620064dd5760208114620064525783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f84018190048102820181019092528281526000916200649591858580838501838280828437600092019190915250929392505062008ebf9050565b90506202a300811080620064ab5750603e548110155b15620064d45784848484604051630a5a604160e01b81526004016200113194939291906200a453565b603d556200687c565b620065486040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b156200660557602081146200657a5783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f8401819004810282018101909252828152600091620065bd91858580838501838280828437600092019190915250929392505062008ebf9050565b9050620d2f00811080620065d35750603d548111155b15620065fc5784848484604051630a5a604160e01b81526004016200113194939291906200a453565b603e556200687c565b6200667f6040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b156200672b5760208114620066b15783838383604051630a5a604160e01b81526004016200113194939291906200a453565b604080516020601f8401819004810282018101909252828152600091620066f491858580838501838280828437600092019190915250929392505062008ebf9050565b905080600003620067225784848484604051630a5a604160e01b81526004016200113194939291906200a453565b604a556200687c565b620067996040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008e629050565b15620068595760148114620067cb5783838383604051630a5a604160e01b81526004016200113194939291906200a453565b600062006813601484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b90506001600160a01b038116620068475784848484604051630a5a604160e01b81526004016200113194939291906200a453565b620068528162008ec4565b506200687c565b838383836040516325ee20d560e21b81526004016200113194939291906200a453565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051620068b394939291906200a453565b60405180910390a150505050565b60005462010000900460ff1615620068ec57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200691e5760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b038111156200693c576200693c6200953d565b60405190808252806020026020018201604052801562006966578160200160208202803683370190505b5090506000805b8381101562006a6457620069af8787838181106200698f576200698f62009e3f565b9050602002016020810190620069a69190620093cc565b603f9062007d2a565b620069cd5760405163056e881160e01b815260040160405180910390fd5b60416000888884818110620069e657620069e662009e3f565b9050602002016020810190620069fd9190620093cc565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006a395762006a3962009e3f565b6001600160a01b039092166020928302919091019091015262006a5c8162009ea4565b90506200696d565b50604051634484077560e01b815261200590634484077590620027ec908590889060040162009e55565b606080600062006a9f603f620088ba565b90508085101562006c6357831562006ab8578362006aba565b805b935060008462006acb878462009e0f565b1162006ae35762006add868362009e0f565b62006ae5565b845b9050806001600160401b0381111562006b025762006b026200953d565b60405190808252806020026020018201604052801562006b2c578160200160208202803683370190505b509350806001600160401b0381111562006b4a5762006b4a6200953d565b60405190808252806020026020018201604052801562006b74578160200160208202803683370190505b50925060005b8181101562006c605762006b936200395c828962009d53565b85828151811062006ba85762006ba862009e3f565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006be15762006be162009e3f565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006c355762006c3562009e3f565b6001600160a01b039092166020928302919091019091015262006c588162009ea4565b905062006b7a565b50505b9250925092565b336110011462006c9257604051630f22c43960e41b8152611001600482015260240162001131565b60005462010000900460ff161562006cbd57604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006ce5603f8262007d2a565b62006d035760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006d29603c4262009d30565b604a546000828152604b60205260409020549192501162006d5d5760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006d7e90849062009d53565b90915550506001600160a01b0384166000908152604460205260409020541580159062006dd157506001600160a01b038416600090815260446020526040902054429062006dcf90603c9062009d53565b105b1562006df0576040516330abb81d60e21b815260040160405180910390fd5b60008062006e0085600062007d4d565b915091508162006e2357604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562006e76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062006e9c919062009d69565b905062006eaa858362007dd7565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600060405162006eea9392919062009d99565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b916200568b916001600160a01b0316908a9060040162009cf0565b6001600160a01b038082166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384938493849390929160808401919062006f999062009cba565b80601f016020809104026020016040519081016040528092919081815260200182805462006fc79062009cba565b8015620070185780601f1062006fec5761010080835404028352916020019162007018565b820191906000526020600020905b81548152906001019060200180831162006ffa57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620070439062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620070719062009cba565b8015620070c25780601f106200709657610100808354040283529160200191620070c2565b820191906000526020600020905b815481529060010190602001808311620070a457829003601f168201915b50505050508152602001600182018054620070dd9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200710b9062009cba565b80156200715c5780601f1062007130576101008083540402835291602001916200715c565b820191906000526020600020905b8154815290600101906020018083116200713e57829003601f168201915b50505050508152602001600282018054620071779062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620071a59062009cba565b8015620071f65780601f10620071ca57610100808354040283529160200191620071f6565b820191906000526020600020905b815481529060010190602001808311620071d857829003601f168201915b50505050508152602001600382018054620072119062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200723f9062009cba565b8015620072905780601f10620072645761010080835404028352916020019162007290565b820191906000526020600020905b8154815290600101906020018083116200727257829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b8154815260200190600101908083116200731c5750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200738357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620073b55760405163b1d02c3d60e01b815260040160405180910390fd5b33620073c3603f8262007d2a565b620073e15760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200740590603c9062009d53565b11156200742557604051631f92cdbd60e11b815260040160405180910390fd5b600581018054620074369062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620074649062009cba565b8015620074b55780601f106200748957610100808354040283529160200191620074b5565b820191906000526020600020905b8154815290600101906020018083116200749757829003601f168201915b5050508287525085916005840191508190620074d290826200a47e565b5060208201516001820190620074e990826200a47e565b50604082015160028201906200750090826200a47e565b50606082015160038201906200751790826200a47e565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff16156200758557604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620075b75760405163b1d02c3d60e01b815260040160405180910390fd5b828114620075d8576040516341abc80160e01b815260040160405180910390fd5b60005b83811015620076495762007636858583818110620075fd57620075fd62009e3f565b9050602002016020810190620076149190620093cc565b84848481811062007629576200762962009e3f565b9050602002013562008d56565b620076418162009ea4565b9050620075db565b5050505050565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849390916080840191620076bb9062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620076e99062009cba565b80156200773a5780601f106200770e576101008083540402835291602001916200773a565b820191906000526020600020905b8154815290600101906020018083116200771c57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620077659062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620077939062009cba565b8015620077e45780601f10620077b857610100808354040283529160200191620077e4565b820191906000526020600020905b815481529060010190602001808311620077c657829003601f168201915b50505050508152602001600182018054620077ff9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200782d9062009cba565b80156200787e5780601f1062007852576101008083540402835291602001916200787e565b820191906000526020600020905b8154815290600101906020018083116200786057829003601f168201915b50505050508152602001600282018054620078999062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620078c79062009cba565b8015620079185780601f10620078ec5761010080835404028352916020019162007918565b820191906000526020600020905b815481529060010190602001808311620078fa57829003601f168201915b50505050508152602001600382018054620079339062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620079619062009cba565b8015620079b25780601f106200798657610100808354040283529160200191620079b2565b820191906000526020600020905b8154815290600101906020018083116200799457829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162007a3e5750505091909252505050604001519392505050565b600062007a76603f8462007d2a565b62007a945760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd9060240162004ff1565b60005462010000900460ff161562007b0357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007b355760405163b1d02c3d60e01b815260040160405180910390fd5b3362007b43603f8262007d2a565b62007b615760405163056e881160e01b815260040160405180910390fd5b3362007b71818787878762008a75565b62007b8f57604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007bae92919062009d0a565b908152604051908190036020019020546001600160a01b031614158062007bf857506048868660405162007be492919062009d0a565b9081526040519081900360200190205460ff165b1562007c17576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007c4490603c9062009d53565b111562007c6457604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007c7a91906200a546565b908152604051908190036020019020556004810162007c9b87898362009f68565b5042600c820155604051829060459062007cb9908a908a9062009d0a565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007d19908a908a906200a239565b60405180910390a250505050505050565b6001600160a01b0381166000908152600183016020526040812054151562005035565b6000806000848460405160200162007d679291906200a5c4565b60408051601f1981840301815291815281516020928301206000818152604c9093529120549091504281111562007da75760008093509350505062007dd0565b603e5462007db6904262009d53565b6000928352604c6020526040909220829055506001925090505b9250929050565b8154604051631507fdb760e11b81526001600160a01b03909116600482015261100090632a0ffb6e90602401600060405180830381600087803b15801562007e1e57600080fd5b505af115801562007e33573d6000803e3d6000fd5b505050506000600162007e47603f620088ba565b62007e53919062009e0f565b604954108015915062007f115760405163d31f968d60e01b81526110006004820152600860248201526120009063d31f968d90604401602060405180830381865afa15801562007ea7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062007ecd919062009dc8565b62007f115760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b015482111562007f2657600b83018290555b600a83015460ff1662007f9957600a8301805460ff191660019081179091556049805460009062007f5990849062009d53565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845283820183905283860183905283018290528451808601865282815281018290528451808601909552855185528581019085015291928290620080109062008f30565b90506000805b620080218362008fa3565b15620080f457806000036200805657620080456200803f8462008fc9565b6200902d565b6001600160a01b03168452620080e1565b8060010362008082576200806e6200803f8462008fc9565b6001600160a01b03166020850152620080e1565b80600203620080ae576200809a6200803f8462008fc9565b6001600160a01b03166040850152620080e1565b80600303620080db57620080cc620080c68462008fc9565b62009045565b606085015260019150620080e1565b620080f4565b620080ec8162009ea4565b905062008016565b5091959194509092505050565b6000805462010000900460ff16156200812d57604051631785c68160e01b815260040160405180910390fd5b6020808301516001600160a01b031660009081526001909152604090205460ff168062008165575060208201516001600160a01b0316155b15620081845760405163b1d02c3d60e01b815260040160405180910390fd5b81516200819490603f9062007d2a565b620081a157506002919050565b81516001600160a01b039081166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929391926080840191906200820d9062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200823b9062009cba565b80156200828c5780601f1062008260576101008083540402835291602001916200828c565b820191906000526020600020905b8154815290600101906020018083116200826e57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620082b79062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620082e59062009cba565b8015620083365780601f106200830a5761010080835404028352916020019162008336565b820191906000526020600020905b8154815290600101906020018083116200831857829003601f168201915b50505050508152602001600182018054620083519062009cba565b80601f01602080910402602001604051908101604052809291908181526020018280546200837f9062009cba565b8015620083d05780601f10620083a457610100808354040283529160200191620083d0565b820191906000526020600020905b815481529060010190602001808311620083b257829003601f168201915b50505050508152602001600282018054620083eb9062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620084199062009cba565b80156200846a5780601f106200843e576101008083540402835291602001916200846a565b820191906000526020600020905b8154815290600101906020018083116200844c57829003601f168201915b50505050508152602001600382018054620084859062009cba565b80601f0160208091040260200160405190810160405280929190818152602001828054620084b39062009cba565b8015620085045780601f10620084d85761010080835404028352916020019162008504565b820191906000526020600020905b815481529060010190602001808311620084e657829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620085905750505050508152505090508060e001518015620085db575082600001516001600160a01b031683602001516001600160a01b031614155b15620085ea5750600392915050565b6040808201516060850151602086015192516317066a5760e21b81526001600160a01b03938416600482015260009390921691635c19a95c919060240160206040518083038185885af115801562008646573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200866d919062009d69565b905083602001516001600160a01b031684600001516001600160a01b03166000805160206200b540833981519152838760600151604051620086b9929190918252602082015260400190565b60405180910390a383602001516001600160a01b031684600001516001600160a01b03167f607b17598da6bdca05650a2fc08bd2bc8e38c3236806a0fa8e0daabc1d6cb1d88387606001516040516200871c929190918252602082015260400190565b60405180910390a360408083015160208601519151633041949b60e01b815261200592633041949b92620087569290919060040162009cf0565b600060405180830381600087803b1580156200877157600080fd5b505af115801562008786573d6000803e3d6000fd5b506000979650505050505050565b6001600160a01b0381166000908152604160205260409020600a81015460ff1615620087be575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa1580156200880e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008834919062009d69565b101562005a1e576200885681603d544262008850919062009d53565b62007dd7565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200889d57600080fd5b505af1158015620088b2573d6000803e3d6000fd5b505050505050565b600062005038825490565b60006200503583836200911d565b600080829050600381511080620088eb575060098151115b15620088fa5750600092915050565b60418160008151811062008912576200891262009e3f565b016020015160f81c1080620089445750605a816000815181106200893a576200893a62009e3f565b016020015160f81c115b15620089535750600092915050565b60015b815181101562008a6b57603082828151811062008977576200897762009e3f565b016020015160f81c1080620089a8575060398282815181106200899e576200899e62009e3f565b016020015160f81c115b8015620089f857506041828281518110620089c757620089c762009e3f565b016020015160f81c1080620089f85750605a828281518110620089ee57620089ee62009e3f565b016020015160f81c115b801562008a485750606182828151811062008a175762008a1762009e3f565b016020015160f81c108062008a485750607a82828151811062008a3e5762008a3e62009e3f565b016020015160f81c115b1562008a58575060009392505050565b62008a638162009ea4565b905062008956565b5060019392505050565b600060308414158062008a89575060608214155b1562008a985750600062008b9c565b60008686864660405160200162008ab394939291906200a602565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a60405160200162008b0d9594939291906200a62f565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa62008b5757600080fd5b5060008160008151811062008b705762008b7062009e3f565b016020015160f81c90506001811462008b925760009550505050505062008b9c565b6001955050505050505b95945050505050565b60008061200361dead60405162008bbc90620093a8565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f08015801562008bff573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b815260040162008c339291906200a667565b6000604051808303818588803b15801562008c4d57600080fd5b505af115801562008c62573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b600062005035836001600160a01b0384166200914a565b600054610100900460ff1662008d2a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001131565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008d64603f8262007d2a565b62008d825760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562008de6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008e0c919062009d69565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd39926838360405162008e5491815260200190565b60405180910390a350505050565b60008160405160200162008e7791906200a416565b604051602081830303815290604052805190602001208360405160200162008ea091906200a416565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b604080516080810182526000918101828152606082018390528152602081019190915262008f5e826200919c565b62008f6857600080fd5b600062008f798360200151620091cf565b836020015162008f8a919062009d53565b6040805180820190915293845260208401525090919050565b8051805160208201516000929162008fbb9162009d53565b836020015110915050919050565b604080518082019091526000808252602082015262008fe88262008fa3565b62008ff257600080fd5b6020820151600062009004826200925e565b905062009012818362009d53565b60209485015260408051808201909152908152928301525090565b80516000906015146200903f57600080fd5b62005038825b8051600090158015906200905b57508151602110155b6200906557600080fd5b6000620090768360200151620091cf565b90508083600001511015620090ce5760405162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015260640162001131565b8251600090620090e090839062009e0f565b9050600080838660200151620090f7919062009d53565b90508051915060208310156200911457826020036101000a820491505b50949350505050565b600082600001828154811062009137576200913762009e3f565b9060005260206000200154905092915050565b6000818152600183016020526040812054620091935750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562005038565b50600062005038565b80516000908103620091b057506000919050565b6020820151805160001a9060c082101562008a6b575060009392505050565b8051600090811a6080811015620091e95750600092915050565b60b881108062009206575060c0811080159062009206575060f881105b15620092155750600192915050565b60c081101562009250576200922d600160b86200a68d565b6200923c9060ff168262009e0f565b6200924990600162009d53565b9392505050565b6200922d600160f86200a68d565b80516000908190811a60808110156200927b5760019150620093a1565b60b8811015620092a7576200929260808262009e0f565b6200929f90600162009d53565b9150620093a1565b60c08110156200932057600060b78203600186019550806020036101000a865104915060018101820193505080831015620093195760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001131565b50620093a1565b60f881101562009337576200929260c08262009e0f565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156200939f5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001131565b505b5092915050565b610e96806200a6aa83390190565b6001600160a01b03811681146200174957600080fd5b600060208284031215620093df57600080fd5b81356200924981620093b6565b60008083601f840112620093ff57600080fd5b5081356001600160401b038111156200941757600080fd5b60208301915083602082850101111562007dd057600080fd5b600080602083850312156200944457600080fd5b82356001600160401b038111156200945b57600080fd5b6200946985828601620093ec565b90969095509350505050565b6000806000604084860312156200948b57600080fd5b833560ff811681146200949d57600080fd5b925060208401356001600160401b03811115620094b957600080fd5b620094c786828701620093ec565b9497909650939450505050565b60005b83811015620094f1578181015183820152602001620094d7565b50506000910152565b6000815180845262009514816020860160208601620094d4565b601f01601f19169290920160200192915050565b602081526000620050356020830184620094fa565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200957857620095786200953d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620095a957620095a96200953d565b604052919050565b60006001600160401b03821115620095cd57620095cd6200953d565b50601f01601f191660200190565b6000620095f2620095ec84620095b1565b6200957e565b90508281528383830111156200960757600080fd5b828260208301376000602084830101529392505050565b6000602082840312156200963157600080fd5b81356001600160401b038111156200964857600080fd5b8201601f810184136200965a57600080fd5b6200966b84823560208401620095db565b949350505050565b600080604083850312156200968757600080fd5b82356200969481620093b6565b946020939093013593505050565b80151581146200174957600080fd5b60008060008060808587031215620096c857600080fd5b8435620096d581620093b6565b93506020850135620096e781620093b6565b92506040850135915060608501356200970081620096a2565b939692955090935050565b6001600160401b03811681146200174957600080fd5b6000602082840312156200973457600080fd5b813562009249816200970b565b600080604083850312156200975557600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156200979f5781516001600160a01b03168752958201959082019060010162009778565b509495945050505050565b608081526000620097bf608083018762009764565b82810360208481019190915286518083528782019282019060005b81811015620097f857845183529383019391830191600101620097da565b5050848103604086015286518082528282019350600581901b8201830183890160005b838110156200984d57601f198584030187526200983a838351620094fa565b968601969250908501906001016200981b565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e08112156200988357600080fd5b88356200989081620093b6565b975060208901356001600160401b0380821115620098ad57600080fd5b620098bb8c838d01620093ec565b909950975060408b0135915080821115620098d557600080fd5b620098e38c838d01620093ec565b90975095508591506060605f1984011215620098fe57600080fd5b60608b01945060c08b01359250808311156200991957600080fd5b505088016080818b0312156200992e57600080fd5b8091505092959891949750929550565b600080604083850312156200995257600080fd5b82356200995f81620093b6565b915060208301356200997181620096a2565b809150509250929050565b6020815260008251608060208401526200999a60a0840182620094fa565b90506020840151601f1980858403016040860152620099ba8383620094fa565b92506040860151915080858403016060860152620099d98383620094fa565b925060608601519150808584030160808601525062008b9c8282620094fa565b6000806000806040858703121562009a1057600080fd5b84356001600160401b038082111562009a2857600080fd5b62009a3688838901620093ec565b9096509450602087013591508082111562009a5057600080fd5b5062009a5f87828801620093ec565b95989497509550505050565b60008083601f84011262009a7e57600080fd5b5081356001600160401b0381111562009a9657600080fd5b6020830191508360208260051b850101111562007dd057600080fd5b60008060006040848603121562009ac857600080fd5b83356001600160401b0381111562009adf57600080fd5b62009aed8682870162009a6b565b909450925050602084013562009b0381620093b6565b809150509250925092565b60608152600062009b23606083018662009764565b828103602084015262009b37818662009764565b915050826040830152949350505050565b600082601f83011262009b5a57600080fd5b6200503583833560208501620095db565b60006020828403121562009b7e57600080fd5b81356001600160401b038082111562009b9657600080fd5b908301906080828603121562009bab57600080fd5b62009bb562009553565b82358281111562009bc557600080fd5b62009bd38782860162009b48565b82525060208301358281111562009be957600080fd5b62009bf78782860162009b48565b60208301525060408301358281111562009c1057600080fd5b62009c1e8782860162009b48565b60408301525060608301358281111562009c3757600080fd5b62009c458782860162009b48565b60608301525095945050505050565b6000806000806040858703121562009c6b57600080fd5b84356001600160401b038082111562009c8357600080fd5b62009c918883890162009a6b565b9096509450602087013591508082111562009cab57600080fd5b5062009a5f8782880162009a6b565b600181811c9082168062009ccf57607f821691505b6020821081036200458057634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b60008262009d4e57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562005038576200503862009d1a565b60006020828403121562009d7c57600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260208101839052606081016003831062009dba5762009dba62009d83565b826040830152949350505050565b60006020828403121562009ddb57600080fd5b81516200924981620096a2565b828152604081016004831062009e025762009e0262009d83565b8260208301529392505050565b8181038181111562005038576200503862009d1a565b808202811582820484141762005038576200503862009d1a565b634e487b7160e01b600052603260045260246000fd5b60408152600062009e6a604083018562009764565b905060018060a01b03831660208301529392505050565b6001600160401b03828116828216039080821115620093a157620093a162009d1a565b60006001820162009eb95762009eb962009d1a565b5060010190565b6000808335601e1984360301811262009ed857600080fd5b8301803591506001600160401b0382111562009ef357600080fd5b60200191503681900382131562007dd057600080fd5b601f82111562007f9957600081815260208120601f850160051c8101602086101562009f325750805b601f850160051c820191505b81811015620088b25782815560010162009f3e565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562009f825762009f826200953d565b62009f9a8362009f93835462009cba565b8362009f09565b6000601f84116001811462009fcd576000851562009fb85750838201355b62009fc4868262009f53565b84555062007649565b600083815260209020601f19861690835b828110156200a000578685013582556020948501946001909201910162009fde565b50868210156200a01e5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200a03c828362009ec0565b6001600160401b038111156200a056576200a0566200953d565b6200a06e816200a067855462009cba565b8562009f09565b6000601f8211600181146200a0a157600083156200a08c5750838201355b6200a098848262009f53565b8655506200a0fe565b600085815260209020601f19841690835b828110156200a0d457868501358255602094850194600190920191016200a0b2565b50848210156200a0f25760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506200a111602083018362009ec0565b6200a12181836001860162009f68565b50506200a132604083018362009ec0565b6200a14281836002860162009f68565b50506200a153606083018362009ec0565b6200a16381836003860162009f68565b50505050565b81356200a176816200970b565b6001600160401b03811690508154816001600160401b0319821617835560208401356200a1a3816200970b565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff198316841781178555908501356200a1e3816200970b565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006200966b6020830184866200a210565b60006001600160401b038211156200a26b576200a26b6200953d565b5060051b60200190565b600060208083850312156200a28957600080fd5b82516001600160401b038111156200a2a057600080fd5b8301601f810185136200a2b257600080fd5b80516200a2c3620095ec826200a24f565b81815260059190911b820183019083810190878311156200a2e357600080fd5b928401925b828410156200a30e5783516200a2fe81620093b6565b825292840192908401906200a2e8565b979650505050505050565b600060208083850312156200a32d57600080fd5b82516001600160401b03808211156200a34557600080fd5b818501915085601f8301126200a35a57600080fd5b81516200a36b620095ec826200a24f565b81815260059190911b830184019084810190888311156200a38b57600080fd5b8585015b838110156200a409578051858111156200a3a95760008081fd5b8601603f81018b136200a3bc5760008081fd5b8781015160406200a3d1620095ec83620095b1565b8281528d828486010111156200a3e75760008081fd5b6200a3f8838c8301848701620094d4565b86525050509186019186016200a38f565b5098975050505050505050565b600082516200a42a818460208701620094d4565b9190910192915050565b60ff8416815260406020820152600062008b9c6040830184866200a210565b6040815260006200a4696040830186886200a210565b82810360208401526200a30e8185876200a210565b81516001600160401b038111156200a49a576200a49a6200953d565b6200a4b2816200a4ab845462009cba565b8462009f09565b602080601f8311600181146200a4e657600084156200a4d15750858301515b6200a4dd858262009f53565b865550620088b2565b600085815260208120601f198616915b828110156200a517578886015182559484019460019091019084016200a4f6565b50858210156200a5365787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200a5568162009cba565b600182811680156200a57157600181146200a587576200a5b8565b60ff19841687528215158302870194506200a5b8565b8760005260208060002060005b858110156200a5af5781548a8201529084019082016200a594565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200a5ee576200a5ee62009d83565b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b600086516200a643818460208b01620094d4565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b03831681526040602082018190526000906200966b90830184620094fa565b60ff828116828216039081111562005038576200503862009d1a56fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656424d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e0400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000030b86b3146bdd2200b1dbdb1cea5e40d3451c028cbb4fb03b1826f7f2d82bee76bbd5cd68a74a16a7eceea093fd5826b9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003087ce273bb9b51fd69e50de7a8d9a99cfb3b1a5c6a7b85f6673d137a5a2ce7df3d6ee4e6d579a142d58b0606c4a7a1c27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a33ac14980d85c0d154c5909ebf7a11d455f54beb4d5d0dc1d8b3670b9c4a6b6c450ee3d623ecc48026f09ed1f0b5c1200000000000000000000000000000000a164736f6c6343000811000a", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", + Code: "608060405260043610620003db5760003560e01c806386d545061162000203578063d115a2061162000117578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000bed578063fb50b31f1462000c12578063fc0c5ff11462000c37578063ff69ab611462000c4f57600080fd5b8063e992aaf51462000b6a578063efdbf0e11462000b82578063f1f74d841462000bbe578063f1fad1041462000bd657600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000afd578063daacdb661462000b15578063dbda7fb31462000b2d578063e8f67c3b1462000b5257600080fd5b8063d115a2061462000a9b578063d6ca429d1462000ab3578063d7c2dfc81462000ad857600080fd5b8063b187bd261162000199578063c38fbec81162000164578063c38fbec81462000a1d578063c473318f1462000a42578063c8509d81146200083b578063cbb04d9d1462000a5a57600080fd5b8063b187bd26146200098a578063baa7199e14620009aa578063bdceadf314620009cf578063bff02e2014620009e757600080fd5b8063982ef0a711620001da578063982ef0a714620008f5578063a43569b3146200090c578063aad3ec961462000940578063ac431751146200096557600080fd5b806386d5450614620008785780638a4d3fa814620008b25780638cd22b2214620008d057600080fd5b80634bf6c88211620002fb578063663706d3116200029157806376e7d6d6116200025c57806376e7d6d6146200080b5780638129fc1c1462000823578063831d65d1146200083b5780638456cb59146200086057600080fd5b8063663706d314620007385780636ec01b2714620007695780636f8e2fa414620007c157806375cc7d8914620007e657600080fd5b80635949187111620002d25780635949187114620006a05780635e7cc1c914620006c557806363a036b514620006ea57806364028fbd146200072157600080fd5b80634bf6c88214620006395780634d99dd1614620006635780634e6fd6c4146200068857600080fd5b80631fa8882b1162000371578063449ecfe61162000348578063449ecfe6146200058557806345211bfd14620005aa5780634838d16514620005cf5780634a49ac4c146200061457600080fd5b80631fa8882b1462000531578063384099881462000548578063417c73a7146200056057600080fd5b8063092193ab11620003b2578063092193ab146200047c5780630e9fbf5114620004935780631182b87514620004b857806317b4f35314620004ec57600080fd5b8063046f7da214620003fb578063059ddd2214620004135780630661806e146200045557600080fd5b36620003f65760345460ff16600114620003f457600080fd5b005b600080fd5b3480156200040857600080fd5b50620003f462000c67565b3480156200042057600080fd5b50620004386200043236600462009429565b62000cf9565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200046257600080fd5b506200046d60365481565b6040519081526020016200044c565b620003f46200048d36600462009429565b6200110e565b348015620004a057600080fd5b50620003f4620004b23660046200948d565b6200174c565b348015620004c557600080fd5b50620004dd620004d7366004620094d2565b62001a74565b6040516200044c919062009585565b348015620004f957600080fd5b50620004386200050b3660046200967b565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200053e57600080fd5b506200046d603c81565b3480156200055557600080fd5b506200046d60375481565b3480156200056d57600080fd5b50620003f46200057f36600462009429565b62001de7565b3480156200059257600080fd5b50620003f4620005a436600462009429565b62001e69565b348015620005b757600080fd5b50620003f4620005c936600462009429565b6200204e565b348015620005dc57600080fd5b5062000603620005ee36600462009429565b60016020526000908152604090205460ff1681565b60405190151581526020016200044c565b3480156200062157600080fd5b50620003f46200063336600462009429565b62002229565b3480156200064657600080fd5b5062000650600881565b60405160ff90911681526020016200044c565b3480156200067057600080fd5b50620003f462000682366004620096d0565b620022a5565b3480156200069557600080fd5b506200043861dead81565b348015620006ad57600080fd5b50620003f4620006bf3660046200970e565b620028c2565b348015620006d257600080fd5b50620003f4620006e43660046200977e565b62003694565b348015620006f757600080fd5b506200070f620007093660046200979e565b6200389a565b6040516200044c949392919062009807565b620003f462000732366004620098c3565b62003f2c565b3480156200074557600080fd5b506200046d6200075736600462009429565b60446020526000908152604090205481565b3480156200077657600080fd5b506200078e6200078836600462009429565b62004576565b6040805182516001600160401b03908116825260208085015182169083015292820151909216908201526060016200044c565b348015620007ce57600080fd5b50620004dd620007e036600462009429565b62004620565b348015620007f357600080fd5b50620003f46200080536600462009429565b62004a39565b3480156200081857600080fd5b506200046d603d5481565b3480156200083057600080fd5b50620003f462004c0b565b3480156200084857600080fd5b50620003f46200085a366004620094d2565b62004f1d565b3480156200086d57600080fd5b50620003f462004f87565b3480156200088557600080fd5b50620004386200089736600462009429565b6043602052600090815260409020546001600160a01b031681565b348015620008bf57600080fd5b506200046d670de0b6b3a764000081565b348015620008dd57600080fd5b506200046d620008ef366004620096d0565b6200501f565b620003f4620009063660046200999b565b620050d8565b3480156200091957600080fd5b50620009316200092b36600462009429565b62005762565b6040516200044c9190620099d9565b3480156200094d57600080fd5b50620003f46200095f366004620096d0565b62005a4f565b3480156200097257600080fd5b50620003f46200098436600462009a56565b62005abc565b3480156200099757600080fd5b5060005462010000900460ff1662000603565b348015620009b757600080fd5b50620003f4620009c936600462009b0f565b6200695b565b348015620009dc57600080fd5b506200046d603c5481565b348015620009f457600080fd5b5062000a0c62000a063660046200979e565b62006b28565b6040516200044c9392919062009b6b565b34801562000a2a57600080fd5b50620003f462000a3c36600462009429565b62006d04565b34801562000a4f57600080fd5b506200046d60385481565b34801562000a6757600080fd5b5062000a7f62000a7936600462009429565b62006fc2565b604080519384529115156020840152908201526060016200044c565b34801562000aa857600080fd5b506200046d61271081565b34801562000ac057600080fd5b50620003f462000ad236600462009bc8565b620073f2565b34801562000ae557600080fd5b50620003f462000af736600462009cb1565b620075f4565b34801562000b0a57600080fd5b506200046d603b5481565b34801562000b2257600080fd5b506200046d60495481565b34801562000b3a57600080fd5b506200043862000b4c36600462009429565b620076ea565b34801562000b5f57600080fd5b506200046d60355481565b34801562000b7757600080fd5b506200046d603a5481565b34801562000b8f57600080fd5b506200046d62000ba13660046200967b565b805160208183018101805160468252928201919093012091525481565b34801562000bcb57600080fd5b506200046d603e5481565b34801562000be357600080fd5b5062000650601181565b34801562000bfa57600080fd5b506200046d62000c0c366004620096d0565b62007b01565b34801562000c1f57600080fd5b50620003f462000c3136600462009a56565b62007b72565b34801562000c4457600080fd5b506200046d60395481565b34801562000c5c57600080fd5b506200046d604a5481565b600054630100000090046001600160a01b0316331462000c9a576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000cc457604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000d649062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462000d929062009d17565b801562000de35780601f1062000db75761010080835404028352916020019162000de3565b820191906000526020600020905b81548152906001019060200180831162000dc557829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000e0e9062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3c9062009d17565b801562000e8d5780601f1062000e615761010080835404028352916020019162000e8d565b820191906000526020600020905b81548152906001019060200180831162000e6f57829003601f168201915b5050505050815260200160018201805462000ea89062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462000ed69062009d17565b801562000f275780601f1062000efb5761010080835404028352916020019162000f27565b820191906000526020600020905b81548152906001019060200180831162000f0957829003601f168201915b5050505050815260200160028201805462000f429062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462000f709062009d17565b801562000fc15780601f1062000f955761010080835404028352916020019162000fc1565b820191906000526020600020905b81548152906001019060200180831162000fa357829003601f168201915b5050505050815260200160038201805462000fdc9062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200100a9062009d17565b80156200105b5780601f106200102f576101008083540402835291602001916200105b565b820191906000526020600020905b8154815290600101906020018083116200103d57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620010e7575050509190925250509051949350505050565b33611000146200113a57604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b03808216600090815260436020908152604080832054841680845260418352818420825161016081018452815487168152600182015487169481019490945260028101549095169183019190915260038401546060830152600484018054919491608084019190620011b39062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620011e19062009d17565b8015620012325780601f10620012065761010080835404028352916020019162001232565b820191906000526020600020905b8154815290600101906020018083116200121457829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200125d9062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200128b9062009d17565b8015620012dc5780601f10620012b057610100808354040283529160200191620012dc565b820191906000526020600020905b815481529060010190602001808311620012be57829003601f168201915b50505050508152602001600182018054620012f79062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620013259062009d17565b8015620013765780601f106200134a5761010080835404028352916020019162001376565b820191906000526020600020905b8154815290600101906020018083116200135857829003601f168201915b50505050508152602001600282018054620013919062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620013bf9062009d17565b8015620014105780601f10620013e45761010080835404028352916020019162001410565b820191906000526020600020905b815481529060010190602001808311620013f257829003601f168201915b505050505081526020016003820180546200142b9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620014599062009d17565b8015620014aa5780601f106200147e57610100808354040283529160200191620014aa565b820191906000526020600020905b8154815290600101906020018083116200148c57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162001536575050509190925250505060408101519091506001600160a01b031615806200157357508060e001515b156200163057604051611002903490600081818185875af1925050503d8060008114620015bd576040519150601f19603f3d011682016040523d82523d6000602084013e620015c2565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016239060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200168757600080fd5b505af11580156200169c573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620016dd91815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017129190869060040162009d4d565b600060405180830381600087803b1580156200172d57600080fd5b505af115801562001742573d6000803e3d6000fd5b5050505050505b50565b33611001146200177457604051630f22c43960e41b8152611001600482015260240162001131565b60005462010000900460ff16156200179f57604051631785c68160e01b815260040160405180910390fd5b600060458383604051620017b592919062009d67565b908152604051908190036020019020546001600160a01b03169050620017dd603f8262007dc4565b620017fb5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062001821603c4262009d8d565b604a546000828152604b602052604090205491925011620018555760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b602052604081208054600192906200187690849062009db0565b909155505060405160469062001890908790879062009d67565b908152602001604051809103902054600014158015620018df575042603c60468787604051620018c292919062009d67565b908152602001604051809103902054620018dd919062009db0565b105b15620018fe57604051631898eb6b60e01b815260040160405180910390fd5b6000806200190e85600262007de7565b91509150816200193157604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562001984573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019aa919062009dc6565b9050620019b8858362007e71565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb283836002604051620019f89392919062009df6565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001a36916001600160a01b0316908a9060040162009d4d565b600060405180830381600087803b15801562001a5157600080fd5b505af115801562001a66573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001a9e57604051630f22c43960e41b8152612000600482015260240162001131565b60005462010000900460ff161562001ac957604051631785c68160e01b815260040160405180910390fd5b6034805460ff19166001179055604080516020601f8501819004810282018101909252838152600091829162001b1a9187908790819084018382808284376000920191909152506200803892505050565b915091508062001b3d5760405163035ede3560e21b815260040160405180910390fd5b816060015160000362001b63575050604080516000815260208101909152905062001dd6565b606082015160405163e04c83a760e01b81526000916110049163e04c83a79162001b939160040190815260200190565b6020604051808303816000875af115801562001bb3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bd9919062009e25565b90508062001c805782602001516001600160a01b031683600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a8560600151600160405162001c3592919062009e45565b60405180910390a385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092965062001dd695505050505050565b600062001c8d846200819b565b9050600081600481111562001ca65762001ca662009de0565b0362001cc8575050604080516000815260208101909152925062001dd6915050565b6040516000906110049047908381818185875af1925050503d806000811462001d0e576040519150601f19603f3d011682016040523d82523d6000602084013e62001d13565b606091505b505090508062001d36576040516312171d8360e31b815260040160405180910390fd5b84602001516001600160a01b031685600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a87606001518560405162001d8992919062009e45565b60405180910390a387878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092985062001dd6975050505050505050565b6034805460ff191690559392505050565b600054630100000090046001600160a01b0316331462001e1a576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001e9457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001ec65760405163b1d02c3d60e01b815260040160405180910390fd5b8062001ed4603f8262007dc4565b62001ef25760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001f3057604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001f80573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001fa6919062009dc6565b101562001fc6576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001fec5760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff1916905560498054600191906000906200201090849062009e6c565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff16156200207957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620020ab5760405163b1d02c3d60e01b815260040160405180910390fd5b33620020b9603f8262007dc4565b620020d75760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038216620020ff57604051636520611b60e11b815260040160405180910390fd5b6001600160a01b03828116600090815260436020526040902054161515806200214057506001600160a01b03821660009081526047602052604090205460ff165b156200215f57604051631e6f587560e11b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200218390603c9062009db0565b1115620021a357604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b600054630100000090046001600160a01b031633146200225c576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff1615620022d057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620023025760405163b1d02c3d60e01b815260040160405180910390fd5b8162002310603f8262007dc4565b6200232e5760405163056e881160e01b815260040160405180910390fd5b816000036200235057604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b0380841660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620023b89062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620023e69062009d17565b8015620024375780601f106200240b5761010080835404028352916020019162002437565b820191906000526020600020905b8154815290600101906020018083116200241957829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620024629062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620024909062009d17565b8015620024e15780601f10620024b557610100808354040283529160200191620024e1565b820191906000526020600020905b815481529060010190602001808311620024c357829003601f168201915b50505050508152602001600182018054620024fc9062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200252a9062009d17565b80156200257b5780601f106200254f576101008083540402835291602001916200257b565b820191906000526020600020905b8154815290600101906020018083116200255d57829003601f168201915b50505050508152602001600282018054620025969062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620025c49062009d17565b8015620026155780601f10620025e95761010080835404028352916020019162002615565b820191906000526020600020905b815481529060010190602001808311620025f757829003601f168201915b50505050508152602001600382018054620026309062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200265e9062009d17565b8015620026af5780601f106200268357610100808354040283529160200191620026af565b820191906000526020600020905b8154815290600101906020018083116200269157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b8154815260200190600101908083116200273b575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af1158015620027b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027db919062009dc6565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b4082980287846040516200282c929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b03160362002859576200285986620087f1565b6040808301519051633041949b60e01b815261200591633041949b91620028869190879060040162009d4d565b600060405180830381600087803b158015620028a157600080fd5b505af1158015620028b6573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff1615620028ed57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200291f5760405163b1d02c3d60e01b815260040160405180910390fd5b836200292d603f8262007dc4565b6200294b5760405163056e881160e01b815260040160405180910390fd5b8362002959603f8262007dc4565b620029775760405163056e881160e01b815260040160405180910390fd5b6034805460ff191660011790556000849003620029a757604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b031603620029da5760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002a429062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002a709062009d17565b801562002ac15780601f1062002a955761010080835404028352916020019162002ac1565b820191906000526020600020905b81548152906001019060200180831162002aa357829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002aec9062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002b1a9062009d17565b801562002b6b5780601f1062002b3f5761010080835404028352916020019162002b6b565b820191906000526020600020905b81548152906001019060200180831162002b4d57829003601f168201915b5050505050815260200160018201805462002b869062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002bb49062009d17565b801562002c055780601f1062002bd95761010080835404028352916020019162002c05565b820191906000526020600020905b81548152906001019060200180831162002be757829003601f168201915b5050505050815260200160028201805462002c209062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002c4e9062009d17565b801562002c9f5780601f1062002c735761010080835404028352916020019162002c9f565b820191906000526020600020905b81548152906001019060200180831162002c8157829003601f168201915b5050505050815260200160038201805462002cba9062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002ce89062009d17565b801562002d395780601f1062002d0d5761010080835404028352916020019162002d39565b820191906000526020600020905b81548152906001019060200180831162002d1b57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002dc557505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002e509062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002e7e9062009d17565b801562002ecf5780601f1062002ea35761010080835404028352916020019162002ecf565b820191906000526020600020905b81548152906001019060200180831162002eb157829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002efa9062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002f289062009d17565b801562002f795780601f1062002f4d5761010080835404028352916020019162002f79565b820191906000526020600020905b81548152906001019060200180831162002f5b57829003601f168201915b5050505050815260200160018201805462002f949062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462002fc29062009d17565b8015620030135780601f1062002fe75761010080835404028352916020019162003013565b820191906000526020600020905b81548152906001019060200180831162002ff557829003601f168201915b505050505081526020016002820180546200302e9062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200305c9062009d17565b8015620030ad5780601f106200308157610100808354040283529160200191620030ad565b820191906000526020600020905b8154815290600101906020018083116200308f57829003601f168201915b50505050508152602001600382018054620030c89062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620030f69062009d17565b8015620031475780601f106200311b5761010080835404028352916020019162003147565b820191906000526020600020905b8154815290600101906020018083116200312957829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620031d35750505050508152505090508060e001518015620032165750876001600160a01b0316836001600160a01b031614155b156200323557604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af11580156200328c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032b2919062009dc6565b9050603754811015620032d85760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b03161480156200336d57506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa15801562003345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200336b919062009dc6565b105b156200338c576040516317b204bf60e11b815260040160405180910390fd5b6000612710603a5483620033a1919062009e82565b620033ad919062009d8d565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d806000811462003402576040519150601f19603f3d011682016040523d82523d6000602084013e62003407565b606091505b50509050806200342a576040516312171d8360e31b815260040160405180910390fd5b62003436828462009e6c565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af11580156200348c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620034b3919062009dc6565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e858960405162003518939291909283526020830191909152604082015260600190565b60405180910390a46040805160028082526060820183526000926020830190803683370190505090508660400151816000815181106200355c576200355c62009e9c565b60200260200101906001600160a01b031690816001600160a01b03168152505085604001518160018151811062003597576200359762009e9c565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620035d89084908c9060040162009eb2565b600060405180830381600087803b158015620035f357600080fd5b505af115801562003608573d6000803e3d6000fd5b505050508a156200367a576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200364592919062009d4d565b600060405180830381600087803b1580156200366057600080fd5b505af115801562003675573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff1615620036bf57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620036f15760405163b1d02c3d60e01b815260040160405180910390fd5b33620036ff603f8262007dc4565b6200371d5760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200374190603c9062009db0565b11156200376157604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b909104811690851611156200379b5760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b039081169086161015620037d9576009820154620037d39086906001600160401b031662009ede565b620037f3565b6009820154620037f3906001600160401b03168662009ede565b60098301546001600160401b039182169250600160801b9004168111156200382e5760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b60608060606000620038ad603f62008917565b90508086101562003f23578415620038c65784620038c8565b805b9450600085620038d9888462009e6c565b11620038f157620038eb878362009e6c565b620038f3565b855b9050806001600160401b038111156200391057620039106200959a565b6040519080825280602002602001820160405280156200393a578160200160208202803683370190505b509450806001600160401b038111156200395857620039586200959a565b60405190808252806020026020018201604052801562003982578160200160208202803683370190505b509350806001600160401b03811115620039a057620039a06200959a565b604051908082528060200260200182016040528015620039d557816020015b6060815260200190600190039081620039bf5790505b50925060005b8181101562003f20576000620039ff620039f6838b62009db0565b603f9062008922565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003a6c9062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462003a9a9062009d17565b801562003aeb5780601f1062003abf5761010080835404028352916020019162003aeb565b820191906000526020600020905b81548152906001019060200180831162003acd57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003b169062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462003b449062009d17565b801562003b955780601f1062003b695761010080835404028352916020019162003b95565b820191906000526020600020905b81548152906001019060200180831162003b7757829003601f168201915b5050505050815260200160018201805462003bb09062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462003bde9062009d17565b801562003c2f5780601f1062003c035761010080835404028352916020019162003c2f565b820191906000526020600020905b81548152906001019060200180831162003c1157829003601f168201915b5050505050815260200160028201805462003c4a9062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462003c789062009d17565b801562003cc95780601f1062003c9d5761010080835404028352916020019162003cc9565b820191906000526020600020905b81548152906001019060200180831162003cab57829003601f168201915b5050505050815260200160038201805462003ce49062009d17565b80601f016020809104026020016040519081016040528092919081815260200182805462003d129062009d17565b801562003d635780601f1062003d375761010080835404028352916020019162003d63565b820191906000526020600020905b81548152906001019060200180831162003d4557829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162003def575050505050815250509050806000015188848151811062003e285762003e2862009e9c565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003ec15780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003e95573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003ebb919062009dc6565b62003ec4565b60005b87848151811062003ed95762003ed962009e9c565b602002602001018181525050806080015186848151811062003eff5762003eff62009e9c565b602002602001018190525050508062003f189062009f01565b9050620039db565b50505b92959194509250565b60005462010000900460ff161562003f5757604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562003f895760405163b1d02c3d60e01b815260040160405180910390fd5b3362003f97603f8262007dc4565b1562003fb657604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b038881166000908152604360205260409020541615158062003ff757506001600160a01b03881660009081526047602052604090205460ff165b156200401657604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b0316604588886040516200403592919062009d67565b908152604051908190036020019020546001600160a01b03161415806200407f5750604887876040516200406b92919062009d67565b9081526040519081900360200190205460ff165b156200409e576040516311fdb94760e01b815260040160405180910390fd5b6000620040ac838062009f1d565b604051602001620040bf92919062009d67565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff1615620041095760405163c0bf414360e01b815260040160405180910390fd5b60006200411f670de0b6b3a76400003462009e6c565b905060365481101562004145576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a166200416d57604051636520611b60e11b815260040160405180910390fd5b6113886200418260408701602088016200977e565b6001600160401b03161180620041c85750620041a560408601602087016200977e565b6001600160401b0316620041bd60208701876200977e565b6001600160401b0316115b80620042075750620041e160408601602087016200977e565b6001600160401b0316620041fc60608701604088016200977e565b6001600160401b0316115b15620042265760405163dc81db8560e01b815260040160405180910390fd5b6200427162004236858062009f1d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200893092505050565b6200428f57604051635dba5ad760e01b815260040160405180910390fd5b6200429e838a8a8a8a62008ad2565b620042bc57604051631647e3cb60e11b815260040160405180910390fd5b60006200430a84620042cf878062009f1d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062008c0292505050565b905062004319603f8562008d03565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620043998b8d8362009fc5565b508560058201620043ab82826200a08d565b5087905060098201620043bf82826200a1c6565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b031916928816929092179091555185906045906200440d908e908e9062009d67565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e604051620044909291906200a296565b60405180910390a460408051848152602081018590526001600160a01b0387169182916000805160206200b59d833981519152910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816916000805160206200b59d833981519152910160405180910390a3604051633041949b60e01b815261200590633041949b9062004534908590899060040162009d4d565b600060405180830381600087803b1580156200454f57600080fd5b505af115801562004564573d6000803e3d6000fd5b50505050505050505050505050505050565b604080516060810182526000808252602082018190529181019190915281620045a1603f8262007dc4565b620045bf5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915291505b50919050565b6001600160a01b038082166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060828101919091526004840180549194916080840191906200468d9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620046bb9062009d17565b80156200470c5780601f10620046e0576101008083540402835291602001916200470c565b820191906000526020600020905b815481529060010190602001808311620046ee57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620047379062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620047659062009d17565b8015620047b65780601f106200478a57610100808354040283529160200191620047b6565b820191906000526020600020905b8154815290600101906020018083116200479857829003601f168201915b50505050508152602001600182018054620047d19062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620047ff9062009d17565b8015620048505780601f10620048245761010080835404028352916020019162004850565b820191906000526020600020905b8154815290600101906020018083116200483257829003601f168201915b505050505081526020016002820180546200486b9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620048999062009d17565b8015620048ea5780601f10620048be57610100808354040283529160200191620048ea565b820191906000526020600020905b815481529060010190602001808311620048cc57829003601f168201915b50505050508152602001600382018054620049059062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620049339062009d17565b8015620049845780601f10620049585761010080835404028352916020019162004984565b820191906000526020600020905b8154815290600101906020018083116200496657829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162004a105750505091909252505050608001519392505050565b336110011462004a6157604051630f22c43960e41b8152611001600482015260240162001131565b6001600160a01b038082166000908152604360205260409020541662004a89603f8262007dc4565b62004aa75760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004b0a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004b30919062009dc6565b90506000603d544262004b44919062009db0565b905062004b52838262007e71565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004b929392919062009df6565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004bd0916001600160a01b031690889060040162009d4d565b600060405180830381600087803b15801562004beb57600080fd5b505af115801562004c00573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004c2c5750600054600160ff909116105b8062004c485750303b15801562004c48575060005460ff166001145b62004cad5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162001131565b6000805460ff19166001179055801562004cd1576000805461ff0019166101001790555b33411462004cf25760405163022d8c9560e31b815260040160405180910390fd5b3a1562004d12576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755602d603855607860398190556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c55603d9190915560b4603e55604a556040805160c0810190915260a080825260609182916200b5bd602083013980602001905181019062004d9e91906200a2d2565b9150604051806101e001604052806101c081526020016200b65d6101c0913980602001905181019062004dd291906200a376565b905060005b825181101562004e415760016047600085848151811062004dfc5762004dfc62009e9c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562004e398162009f01565b905062004dd7565b5060005b815181101562004eb2576001604883838151811062004e685762004e6862009e9c565b602002602001015160405162004e7f91906200a473565b908152604051908190036020019020805491151560ff1990921691909117905562004eaa8162009f01565b905062004e45565b5062004ed273df87f0e2b8519ea2dd4abd8b639cdd628497ed2562008d1a565b5050801562001749576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b336120001462004f4557604051630f22c43960e41b8152612000600482015260240162001131565b7faa5ba621c8b3d7d05bb9e51a7506108251d4d5dbe542ca66fc7bb52aacb02b6583838360405162004f7a939291906200a491565b60405180910390a1505050565b600054630100000090046001600160a01b0316331462004fba576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff161562004fe557604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b60006200502e603f8462007dc4565b6200504c5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa158015620050a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620050cf919062009dc6565b90505b92915050565b60005462010000900460ff16156200510357604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620051355760405163b1d02c3d60e01b815260040160405180910390fd5b8162005143603f8262007dc4565b620051615760405163056e881160e01b815260040160405180910390fd5b6037543490811015620051875760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620051ef9062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200521d9062009d17565b80156200526e5780601f1062005242576101008083540402835291602001916200526e565b820191906000526020600020905b8154815290600101906020018083116200525057829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620052999062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620052c79062009d17565b8015620053185780601f10620052ec5761010080835404028352916020019162005318565b820191906000526020600020905b815481529060010190602001808311620052fa57829003601f168201915b50505050508152602001600182018054620053339062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620053619062009d17565b8015620053b25780601f106200538657610100808354040283529160200191620053b2565b820191906000526020600020905b8154815290600101906020018083116200539457829003601f168201915b50505050508152602001600282018054620053cd9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620053fb9062009d17565b80156200544c5780601f1062005420576101008083540402835291602001916200544c565b820191906000526020600020905b8154815290600101906020018083116200542e57829003601f168201915b50505050508152602001600382018054620054679062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620054959062009d17565b8015620054e65780601f10620054ba57610100808354040283529160200191620054e6565b820191906000526020600020905b815481529060010190602001808311620054c857829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620055725750505050508152505090508060e001518015620055b55750856001600160a01b0316826001600160a01b031614155b15620055d457604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562005625573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200564c919062009dc6565b9050826001600160a01b0316876001600160a01b03166000805160206200b59d83398151915283876040516200568c929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b91620056c19190879060040162009d4d565b600060405180830381600087803b158015620056dc57600080fd5b505af1158015620056f1573d6000803e3d6000fd5b50505050851562001742576040516372f6ad8f60e11b81526120059063e5ed5b1e90620057259086908b9060040162009d4d565b600060405180830381600087803b1580156200574057600080fd5b505af115801562005755573d6000803e3d6000fd5b5050505050505050505050565b6200578e6040518060800160405280606081526020016060815260200160608152602001606081525090565b816200579c603f8262007dc4565b620057ba5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602052604090819020815160808101909252600501805482908290620057f19062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200581f9062009d17565b8015620058705780601f10620058445761010080835404028352916020019162005870565b820191906000526020600020905b8154815290600101906020018083116200585257829003601f168201915b505050505081526020016001820180546200588b9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620058b99062009d17565b80156200590a5780601f10620058de576101008083540402835291602001916200590a565b820191906000526020600020905b815481529060010190602001808311620058ec57829003601f168201915b50505050508152602001600282018054620059259062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620059539062009d17565b8015620059a45780601f106200597857610100808354040283529160200191620059a4565b820191906000526020600020905b8154815290600101906020018083116200598657829003601f168201915b50505050508152602001600382018054620059bf9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620059ed9062009d17565b801562005a3e5780601f1062005a125761010080835404028352916020019162005a3e565b820191906000526020600020905b81548152906001019060200180831162005a2057829003601f168201915b505050505081525050915050919050565b60005462010000900460ff161562005a7a57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005aac5760405163b1d02c3d60e01b815260040160405180910390fd5b62005ab8828262008db3565b5050565b336110071462005ae457604051630f22c43960e41b8152611007600482015260240162001131565b62005b516040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b1562005c0c576020811462005b835783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f840181900481028201810190925282815260009162005bc691858580838501838280828437600092019190915250929392505062008f1c9050565b90506108fc81108062005bda575061271081115b1562005c035784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b60355562006916565b62005c7d6040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b1562005d47576020811462005caf5783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f840181900481028201810190925282815260009162005cf291858580838501838280828437600092019190915250929392505062008f1c9050565b9050683635c9adc5dea0000081108062005d15575069152d02c7e14af680000081115b1562005d3e5784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b60365562006916565b62005dba604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b1562005e81576020811462005dec5783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f840181900481028201810190925282815260009162005e2f91858580838501838280828437600092019190915250929392505062008f1c9050565b905067016345785d8a000081108062005e4f5750678ac7230489e8000081115b1562005e785784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b60375562006916565b62005ef2604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b1562005faa576020811462005f245783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f840181900481028201810190925282815260009162005f6791858580838501838280828437600092019190915250929392505062008f1c9050565b905080158062005f7857506101f481115b1562005fa15784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b60385562006916565b620060136040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b15620060d05760208114620060455783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f84018190048102820181019092528281526000916200608891858580838501838280828437600092019190915250929392505062008f1c9050565b90506203f4808110806200609e575062278d0081115b15620060c75784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b60395562006916565b6200613e60405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b15620061eb5760208114620061705783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f8401819004810282018101909252828152600091620061b391858580838501838280828437600092019190915250929392505062008f1c9050565b90506064811115620061e25784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b603a5562006916565b6200625b60405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b156200631c57602081146200628d5783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f8401819004810282018101909252828152600091620062d091858580838501838280828437600092019190915250929392505062008f1c9050565b9050674563918244f40000811080620062ea5750603c5481115b15620063135784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b603b5562006916565b6200638a6040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b156200644d5760208114620063bc5783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f8401819004810282018101909252828152600091620063ff91858580838501838280828437600092019190915250929392505062008f1c9050565b905068056bc75e2d631000008110806200641b5750603b548111155b15620064445784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b603c5562006916565b620064ba6040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b15620065775760208114620064ec5783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f84018190048102820181019092528281526000916200652f91858580838501838280828437600092019190915250929392505062008f1c9050565b90506202a300811080620065455750603e548110155b156200656e5784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b603d5562006916565b620065e26040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b156200669f5760208114620066145783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f84018190048102820181019092528281526000916200665791858580838501838280828437600092019190915250929392505062008f1c9050565b9050620d2f008110806200666d5750603d548111155b15620066965784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b603e5562006916565b620067196040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b15620067c557602081146200674b5783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b604080516020601f84018190048102820181019092528281526000916200678e91858580838501838280828437600092019190915250929392505062008f1c9050565b905080600003620067bc5784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b604a5562006916565b620068336040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ebf9050565b15620068f35760148114620068655783838383604051630a5a604160e01b81526004016200113194939291906200a4b0565b6000620068ad601484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008f1c9050565b90506001600160a01b038116620068e15784848484604051630a5a604160e01b81526004016200113194939291906200a4b0565b620068ec8162008f21565b5062006916565b838383836040516325ee20d560e21b81526004016200113194939291906200a4b0565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516200694d94939291906200a4b0565b60405180910390a150505050565b60005462010000900460ff16156200698657604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620069b85760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b03811115620069d657620069d66200959a565b60405190808252806020026020018201604052801562006a00578160200160208202803683370190505b5090506000805b8381101562006afe5762006a4987878381811062006a295762006a2962009e9c565b905060200201602081019062006a40919062009429565b603f9062007dc4565b62006a675760405163056e881160e01b815260040160405180910390fd5b6041600088888481811062006a805762006a8062009e9c565b905060200201602081019062006a97919062009429565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006ad35762006ad362009e9c565b6001600160a01b039092166020928302919091019091015262006af68162009f01565b905062006a07565b50604051634484077560e01b81526120059063448407759062002886908590889060040162009eb2565b606080600062006b39603f62008917565b90508085101562006cfd57831562006b52578362006b54565b805b935060008462006b65878462009e6c565b1162006b7d5762006b77868362009e6c565b62006b7f565b845b9050806001600160401b0381111562006b9c5762006b9c6200959a565b60405190808252806020026020018201604052801562006bc6578160200160208202803683370190505b509350806001600160401b0381111562006be45762006be46200959a565b60405190808252806020026020018201604052801562006c0e578160200160208202803683370190505b50925060005b8181101562006cfa5762006c2d620039f6828962009db0565b85828151811062006c425762006c4262009e9c565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006c7b5762006c7b62009e9c565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006ccf5762006ccf62009e9c565b6001600160a01b039092166020928302919091019091015262006cf28162009f01565b905062006c14565b50505b9250925092565b336110011462006d2c57604051630f22c43960e41b8152611001600482015260240162001131565b60005462010000900460ff161562006d5757604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006d7f603f8262007dc4565b62006d9d5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006dc3603c4262009d8d565b604a546000828152604b60205260409020549192501162006df75760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006e1890849062009db0565b90915550506001600160a01b0384166000908152604460205260409020541580159062006e6b57506001600160a01b038416600090815260446020526040902054429062006e6990603c9062009db0565b105b1562006e8a576040516330abb81d60e21b815260040160405180910390fd5b60008062006e9a85600062007de7565b915091508162006ebd57604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562006f10573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062006f36919062009dc6565b905062006f44858362007e71565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600060405162006f849392919062009df6565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162005725916001600160a01b0316908a9060040162009d4d565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849384938493909291608084019190620070339062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620070619062009d17565b8015620070b25780601f106200708657610100808354040283529160200191620070b2565b820191906000526020600020905b8154815290600101906020018083116200709457829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620070dd9062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200710b9062009d17565b80156200715c5780601f1062007130576101008083540402835291602001916200715c565b820191906000526020600020905b8154815290600101906020018083116200713e57829003601f168201915b50505050508152602001600182018054620071779062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620071a59062009d17565b8015620071f65780601f10620071ca57610100808354040283529160200191620071f6565b820191906000526020600020905b815481529060010190602001808311620071d857829003601f168201915b50505050508152602001600282018054620072119062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200723f9062009d17565b8015620072905780601f10620072645761010080835404028352916020019162007290565b820191906000526020600020905b8154815290600101906020018083116200727257829003601f168201915b50505050508152602001600382018054620072ab9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620072d99062009d17565b80156200732a5780601f10620072fe576101008083540402835291602001916200732a565b820191906000526020600020905b8154815290600101906020018083116200730c57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620073b65750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200741d57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200744f5760405163b1d02c3d60e01b815260040160405180910390fd5b336200745d603f8262007dc4565b6200747b5760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200749f90603c9062009db0565b1115620074bf57604051631f92cdbd60e11b815260040160405180910390fd5b600581018054620074d09062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620074fe9062009d17565b80156200754f5780601f1062007523576101008083540402835291602001916200754f565b820191906000526020600020905b8154815290600101906020018083116200753157829003601f168201915b50505082875250859160058401915081906200756c90826200a4db565b50602082015160018201906200758390826200a4db565b50604082015160028201906200759a90826200a4db565b5060608201516003820190620075b190826200a4db565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff16156200761f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620076515760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007672576040516341abc80160e01b815260040160405180910390fd5b60005b83811015620076e357620076d085858381811062007697576200769762009e9c565b9050602002016020810190620076ae919062009429565b848484818110620076c357620076c362009e9c565b9050602002013562008db3565b620076db8162009f01565b905062007675565b5050505050565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849390916080840191620077559062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620077839062009d17565b8015620077d45780601f10620077a857610100808354040283529160200191620077d4565b820191906000526020600020905b815481529060010190602001808311620077b657829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620077ff9062009d17565b80601f01602080910402602001604051908101604052809291908181526020018280546200782d9062009d17565b80156200787e5780601f1062007852576101008083540402835291602001916200787e565b820191906000526020600020905b8154815290600101906020018083116200786057829003601f168201915b50505050508152602001600182018054620078999062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620078c79062009d17565b8015620079185780601f10620078ec5761010080835404028352916020019162007918565b820191906000526020600020905b815481529060010190602001808311620078fa57829003601f168201915b50505050508152602001600282018054620079339062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620079619062009d17565b8015620079b25780601f106200798657610100808354040283529160200191620079b2565b820191906000526020600020905b8154815290600101906020018083116200799457829003601f168201915b50505050508152602001600382018054620079cd9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620079fb9062009d17565b801562007a4c5780601f1062007a205761010080835404028352916020019162007a4c565b820191906000526020600020905b81548152906001019060200180831162007a2e57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162007ad85750505091909252505050604001519392505050565b600062007b10603f8462007dc4565b62007b2e5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd906024016200508b565b60005462010000900460ff161562007b9d57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007bcf5760405163b1d02c3d60e01b815260040160405180910390fd5b3362007bdd603f8262007dc4565b62007bfb5760405163056e881160e01b815260040160405180910390fd5b3362007c0b818787878762008ad2565b62007c2957604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007c4892919062009d67565b908152604051908190036020019020546001600160a01b031614158062007c9257506048868660405162007c7e92919062009d67565b9081526040519081900360200190205460ff165b1562007cb1576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007cde90603c9062009db0565b111562007cfe57604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007d1491906200a5a3565b908152604051908190036020019020556004810162007d3587898362009fc5565b5042600c820155604051829060459062007d53908a908a9062009d67565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007db3908a908a906200a296565b60405180910390a250505050505050565b6001600160a01b03811660009081526001830160205260408120541515620050cf565b6000806000848460405160200162007e019291906200a621565b60408051601f1981840301815291815281516020928301206000818152604c9093529120549091504281111562007e415760008093509350505062007e6a565b603e5462007e50904262009db0565b6000928352604c6020526040909220829055506001925090505b9250929050565b8154604051631507fdb760e11b81526001600160a01b03909116600482015261100090632a0ffb6e90602401600060405180830381600087803b15801562007eb857600080fd5b505af115801562007ecd573d6000803e3d6000fd5b505050506000600162007ee1603f62008917565b62007eed919062009e6c565b604954108015915062007fab5760405163d31f968d60e01b81526110006004820152600860248201526120009063d31f968d90604401602060405180830381865afa15801562007f41573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062007f67919062009e25565b62007fab5760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b015482111562007fc057600b83018290555b600a83015460ff166200803357600a8301805460ff191660019081179091556049805460009062007ff390849062009db0565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845283820183905283860183905283018290528451808601865282815281018290528451808601909552855185528581019085015291928290620080aa9062008f8d565b90506000805b620080bb8362009000565b156200818e5780600003620080f057620080df620080d98462009026565b6200908a565b6001600160a01b031684526200817b565b806001036200811c5762008108620080d98462009026565b6001600160a01b031660208501526200817b565b80600203620081485762008134620080d98462009026565b6001600160a01b031660408501526200817b565b80600303620081755762008166620081608462009026565b620090a2565b6060850152600191506200817b565b6200818e565b620081868162009f01565b9050620080b0565b5091959194509092505050565b6020808201516001600160a01b031660009081526001909152604081205460ff1680620081d3575060208201516001600160a01b0316155b15620081e157506004919050565b8151620081f190603f9062007dc4565b620081fe57506002919050565b81516001600160a01b039081166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929391926080840191906200826a9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620082989062009d17565b8015620082e95780601f10620082bd57610100808354040283529160200191620082e9565b820191906000526020600020905b815481529060010190602001808311620082cb57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620083149062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620083429062009d17565b8015620083935780601f10620083675761010080835404028352916020019162008393565b820191906000526020600020905b8154815290600101906020018083116200837557829003601f168201915b50505050508152602001600182018054620083ae9062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620083dc9062009d17565b80156200842d5780601f1062008401576101008083540402835291602001916200842d565b820191906000526020600020905b8154815290600101906020018083116200840f57829003601f168201915b50505050508152602001600282018054620084489062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620084769062009d17565b8015620084c75780601f106200849b57610100808354040283529160200191620084c7565b820191906000526020600020905b815481529060010190602001808311620084a957829003601f168201915b50505050508152602001600382018054620084e29062009d17565b80601f0160208091040260200160405190810160405280929190818152602001828054620085109062009d17565b8015620085615780601f10620085355761010080835404028352916020019162008561565b820191906000526020600020905b8154815290600101906020018083116200854357829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620085ed5750505050508152505090508060e00151801562008638575082600001516001600160a01b031683602001516001600160a01b031614155b15620086475750600392915050565b6040808201516060850151602086015192516317066a5760e21b81526001600160a01b03938416600482015260009390921691635c19a95c919060240160206040518083038185885af1158015620086a3573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620086ca919062009dc6565b905083602001516001600160a01b031684600001516001600160a01b03166000805160206200b59d83398151915283876060015160405162008716929190918252602082015260400190565b60405180910390a383602001516001600160a01b031684600001516001600160a01b03167f607b17598da6bdca05650a2fc08bd2bc8e38c3236806a0fa8e0daabc1d6cb1d883876060015160405162008779929190918252602082015260400190565b60405180910390a360408083015160208601519151633041949b60e01b815261200592633041949b92620087b39290919060040162009d4d565b600060405180830381600087803b158015620087ce57600080fd5b505af1158015620087e3573d6000803e3d6000fd5b506000979650505050505050565b6001600160a01b0381166000908152604160205260409020600a81015460ff16156200881b575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa1580156200886b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008891919062009dc6565b101562005ab857620088b381603d5442620088ad919062009db0565b62007e71565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b158015620088fa57600080fd5b505af11580156200890f573d6000803e3d6000fd5b505050505050565b6000620050d2825490565b6000620050cf83836200917a565b60008082905060038151108062008948575060098151115b15620089575750600092915050565b6041816000815181106200896f576200896f62009e9c565b016020015160f81c1080620089a15750605a8160008151811062008997576200899762009e9c565b016020015160f81c115b15620089b05750600092915050565b60015b815181101562008ac8576030828281518110620089d457620089d462009e9c565b016020015160f81c108062008a0557506039828281518110620089fb57620089fb62009e9c565b016020015160f81c115b801562008a555750604182828151811062008a245762008a2462009e9c565b016020015160f81c108062008a555750605a82828151811062008a4b5762008a4b62009e9c565b016020015160f81c115b801562008aa55750606182828151811062008a745762008a7462009e9c565b016020015160f81c108062008aa55750607a82828151811062008a9b5762008a9b62009e9c565b016020015160f81c115b1562008ab5575060009392505050565b62008ac08162009f01565b9050620089b3565b5060019392505050565b600060308414158062008ae6575060608214155b1562008af55750600062008bf9565b60008686864660405160200162008b1094939291906200a65f565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a60405160200162008b6a9594939291906200a68c565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa62008bb457600080fd5b5060008160008151811062008bcd5762008bcd62009e9c565b016020015160f81c90506001811462008bef5760009550505050505062008bf9565b6001955050505050505b95945050505050565b60008061200361dead60405162008c199062009405565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f08015801562008c5c573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b815260040162008c909291906200a6c4565b6000604051808303818588803b15801562008caa57600080fd5b505af115801562008cbf573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b6000620050cf836001600160a01b038416620091a7565b600054610100900460ff1662008d875760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001131565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008dc1603f8262007dc4565b62008ddf5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562008e43573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008e69919062009dc6565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd39926838360405162008eb191815260200190565b60405180910390a350505050565b60008160405160200162008ed491906200a473565b604051602081830303815290604052805190602001208360405160200162008efd91906200a473565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b604080516080810182526000918101828152606082018390528152602081019190915262008fbb82620091f9565b62008fc557600080fd5b600062008fd683602001516200922c565b836020015162008fe7919062009db0565b6040805180820190915293845260208401525090919050565b80518051602082015160009291620090189162009db0565b836020015110915050919050565b6040805180820190915260008082526020820152620090458262009000565b6200904f57600080fd5b602082015160006200906182620092bb565b90506200906f818362009db0565b60209485015260408051808201909152908152928301525090565b80516000906015146200909c57600080fd5b620050d2825b805160009015801590620090b857508151602110155b620090c257600080fd5b6000620090d383602001516200922c565b905080836000015110156200912b5760405162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015260640162001131565b82516000906200913d90839062009e6c565b905060008083866020015162009154919062009db0565b90508051915060208310156200917157826020036101000a820491505b50949350505050565b600082600001828154811062009194576200919462009e9c565b9060005260206000200154905092915050565b6000818152600183016020526040812054620091f057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620050d2565b506000620050d2565b805160009081036200920d57506000919050565b6020820151805160001a9060c082101562008ac8575060009392505050565b8051600090811a6080811015620092465750600092915050565b60b881108062009263575060c0811080159062009263575060f881105b15620092725750600192915050565b60c0811015620092ad576200928a600160b86200a6ea565b620092999060ff168262009e6c565b620092a690600162009db0565b9392505050565b6200928a600160f86200a6ea565b80516000908190811a6080811015620092d85760019150620093fe565b60b88110156200930457620092ef60808262009e6c565b620092fc90600162009db0565b9150620093fe565b60c08110156200937d57600060b78203600186019550806020036101000a865104915060018101820193505080831015620093765760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001131565b50620093fe565b60f88110156200939457620092ef60c08262009e6c565b600060f78203600186019550806020036101000a865104915060018101820193505080831015620093fc5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001131565b505b5092915050565b610e96806200a70783390190565b6001600160a01b03811681146200174957600080fd5b6000602082840312156200943c57600080fd5b8135620092a68162009413565b60008083601f8401126200945c57600080fd5b5081356001600160401b038111156200947457600080fd5b60208301915083602082850101111562007e6a57600080fd5b60008060208385031215620094a157600080fd5b82356001600160401b03811115620094b857600080fd5b620094c68582860162009449565b90969095509350505050565b600080600060408486031215620094e857600080fd5b833560ff81168114620094fa57600080fd5b925060208401356001600160401b038111156200951657600080fd5b620095248682870162009449565b9497909650939450505050565b60005b838110156200954e57818101518382015260200162009534565b50506000910152565b600081518084526200957181602086016020860162009531565b601f01601f19169290920160200192915050565b602081526000620050cf602083018462009557565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620095d557620095d56200959a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200960657620096066200959a565b604052919050565b60006001600160401b038211156200962a576200962a6200959a565b50601f01601f191660200190565b60006200964f62009649846200960e565b620095db565b90508281528383830111156200966457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156200968e57600080fd5b81356001600160401b03811115620096a557600080fd5b8201601f81018413620096b757600080fd5b620096c88482356020840162009638565b949350505050565b60008060408385031215620096e457600080fd5b8235620096f18162009413565b946020939093013593505050565b80151581146200174957600080fd5b600080600080608085870312156200972557600080fd5b8435620097328162009413565b93506020850135620097448162009413565b92506040850135915060608501356200975d81620096ff565b939692955090935050565b6001600160401b03811681146200174957600080fd5b6000602082840312156200979157600080fd5b8135620092a68162009768565b60008060408385031215620097b257600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015620097fc5781516001600160a01b031687529582019590820190600101620097d5565b509495945050505050565b6080815260006200981c6080830187620097c1565b82810360208481019190915286518083528782019282019060005b81811015620098555784518352938301939183019160010162009837565b5050848103604086015286518082528282019350600581901b8201830183890160005b83811015620098aa57601f198584030187526200989783835162009557565b9686019692509085019060010162009878565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e0811215620098e057600080fd5b8835620098ed8162009413565b975060208901356001600160401b03808211156200990a57600080fd5b620099188c838d0162009449565b909950975060408b01359150808211156200993257600080fd5b620099408c838d0162009449565b90975095508591506060605f19840112156200995b57600080fd5b60608b01945060c08b01359250808311156200997657600080fd5b505088016080818b0312156200998b57600080fd5b8091505092959891949750929550565b60008060408385031215620099af57600080fd5b8235620099bc8162009413565b91506020830135620099ce81620096ff565b809150509250929050565b602081526000825160806020840152620099f760a084018262009557565b90506020840151601f198085840301604086015262009a17838362009557565b9250604086015191508085840301606086015262009a36838362009557565b925060608601519150808584030160808601525062008bf9828262009557565b6000806000806040858703121562009a6d57600080fd5b84356001600160401b038082111562009a8557600080fd5b62009a938883890162009449565b9096509450602087013591508082111562009aad57600080fd5b5062009abc8782880162009449565b95989497509550505050565b60008083601f84011262009adb57600080fd5b5081356001600160401b0381111562009af357600080fd5b6020830191508360208260051b850101111562007e6a57600080fd5b60008060006040848603121562009b2557600080fd5b83356001600160401b0381111562009b3c57600080fd5b62009b4a8682870162009ac8565b909450925050602084013562009b608162009413565b809150509250925092565b60608152600062009b806060830186620097c1565b828103602084015262009b948186620097c1565b915050826040830152949350505050565b600082601f83011262009bb757600080fd5b620050cf8383356020850162009638565b60006020828403121562009bdb57600080fd5b81356001600160401b038082111562009bf357600080fd5b908301906080828603121562009c0857600080fd5b62009c12620095b0565b82358281111562009c2257600080fd5b62009c308782860162009ba5565b82525060208301358281111562009c4657600080fd5b62009c548782860162009ba5565b60208301525060408301358281111562009c6d57600080fd5b62009c7b8782860162009ba5565b60408301525060608301358281111562009c9457600080fd5b62009ca28782860162009ba5565b60608301525095945050505050565b6000806000806040858703121562009cc857600080fd5b84356001600160401b038082111562009ce057600080fd5b62009cee8883890162009ac8565b9096509450602087013591508082111562009d0857600080fd5b5062009abc8782880162009ac8565b600181811c9082168062009d2c57607f821691505b6020821081036200461a57634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b60008262009dab57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620050d257620050d262009d77565b60006020828403121562009dd957600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260208101839052606081016003831062009e175762009e1762009de0565b826040830152949350505050565b60006020828403121562009e3857600080fd5b8151620092a681620096ff565b828152604081016005831062009e5f5762009e5f62009de0565b8260208301529392505050565b81810381811115620050d257620050d262009d77565b8082028115828204841417620050d257620050d262009d77565b634e487b7160e01b600052603260045260246000fd5b60408152600062009ec76040830185620097c1565b905060018060a01b03831660208301529392505050565b6001600160401b03828116828216039080821115620093fe57620093fe62009d77565b60006001820162009f165762009f1662009d77565b5060010190565b6000808335601e1984360301811262009f3557600080fd5b8301803591506001600160401b0382111562009f5057600080fd5b60200191503681900382131562007e6a57600080fd5b601f8211156200803357600081815260208120601f850160051c8101602086101562009f8f5750805b601f850160051c820191505b818110156200890f5782815560010162009f9b565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562009fdf5762009fdf6200959a565b62009ff78362009ff0835462009d17565b8362009f66565b6000601f8411600181146200a02a57600085156200a0155750838201355b6200a021868262009fb0565b845550620076e3565b600083815260209020601f19861690835b828110156200a05d57868501358255602094850194600190920191016200a03b565b50868210156200a07b5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200a099828362009f1d565b6001600160401b038111156200a0b3576200a0b36200959a565b6200a0cb816200a0c4855462009d17565b8562009f66565b6000601f8211600181146200a0fe57600083156200a0e95750838201355b6200a0f5848262009fb0565b8655506200a15b565b600085815260209020601f19841690835b828110156200a13157868501358255602094850194600190920191016200a10f565b50848210156200a14f5760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506200a16e602083018362009f1d565b6200a17e81836001860162009fc5565b50506200a18f604083018362009f1d565b6200a19f81836002860162009fc5565b50506200a1b0606083018362009f1d565b6200a1c081836003860162009fc5565b50505050565b81356200a1d38162009768565b6001600160401b03811690508154816001600160401b0319821617835560208401356200a2008162009768565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff198316841781178555908501356200a2408162009768565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000620096c86020830184866200a26d565b60006001600160401b038211156200a2c8576200a2c86200959a565b5060051b60200190565b600060208083850312156200a2e657600080fd5b82516001600160401b038111156200a2fd57600080fd5b8301601f810185136200a30f57600080fd5b80516200a32062009649826200a2ac565b81815260059190911b820183019083810190878311156200a34057600080fd5b928401925b828410156200a36b5783516200a35b8162009413565b825292840192908401906200a345565b979650505050505050565b600060208083850312156200a38a57600080fd5b82516001600160401b03808211156200a3a257600080fd5b818501915085601f8301126200a3b757600080fd5b81516200a3c862009649826200a2ac565b81815260059190911b830184019084810190888311156200a3e857600080fd5b8585015b838110156200a466578051858111156200a4065760008081fd5b8601603f81018b136200a4195760008081fd5b8781015160406200a42e62009649836200960e565b8281528d828486010111156200a4445760008081fd5b6200a455838c830184870162009531565b86525050509186019186016200a3ec565b5098975050505050505050565b600082516200a48781846020870162009531565b9190910192915050565b60ff8416815260406020820152600062008bf96040830184866200a26d565b6040815260006200a4c66040830186886200a26d565b82810360208401526200a36b8185876200a26d565b81516001600160401b038111156200a4f7576200a4f76200959a565b6200a50f816200a508845462009d17565b8462009f66565b602080601f8311600181146200a54357600084156200a52e5750858301515b6200a53a858262009fb0565b8655506200890f565b600085815260208120601f198616915b828110156200a574578886015182559484019460019091019084016200a553565b50858210156200a5935787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200a5b38162009d17565b600182811680156200a5ce57600181146200a5e4576200a615565b60ff19841687528215158302870194506200a615565b8760005260208060002060005b858110156200a60c5781548a8201529084019082016200a5f1565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200a64b576200a64b62009de0565b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b600086516200a6a0818460208b0162009531565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b0383168152604060208201819052600090620096c89083018462009557565b60ff8281168282160390811115620050d257620050d262009d7756fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656424d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e0400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000030b86b3146bdd2200b1dbdb1cea5e40d3451c028cbb4fb03b1826f7f2d82bee76bbd5cd68a74a16a7eceea093fd5826b9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003087ce273bb9b51fd69e50de7a8d9a99cfb3b1a5c6a7b85f6673d137a5a2ce7df3d6ee4e6d579a142d58b0606c4a7a1c27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a33ac14980d85c0d154c5909ebf7a11d455f54beb4d5d0dc1d8b3670b9c4a6b6c450ee3d623ecc48026f09ed1f0b5c1200000000000000000000000000000000a164736f6c6343000811000a", }, { ContractAddr: common.HexToAddress(StakeCreditContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "6080604052600436106101e75760003560e01c8063647df75911610102578063a9664feb11610095578063d241c1ea11610064578063d241c1ea1461068d578063dd62ed3e146106cf578063f1fad104146106ef578063f399e22e1461070457600080fd5b8063a9664feb14610600578063aa1966cd14610620578063aad3ec961461064d578063c2cde2b21461066d57600080fd5b806395d89b41116100d157806395d89b411461058b578063a457c2d7146105a0578063a5d059ca146105c0578063a9059cbb146105e057600080fd5b8063647df759146104e85780636bbf22491461050857806370a082311461053557806391faf0b41461056b57600080fd5b8063313ce5671161017a5780634bf6c882116101495780634bf6c8821461048b5780634d99dd16146104a05780635c19a95c146104c05780635e607d76146104d357600080fd5b8063313ce567146103f157806339509351146104135780633a5381b51461043357806345bc4d101461046b57600080fd5b806315d1f898116101b657806315d1f8981461038657806318160ddd1461039c57806323b872dd146103b15780632f2d448a146103d157600080fd5b8063038c0023146102e157806306fdde03146103145780630913db4714610336578063095ea7b31461035657600080fd5b366102dc57336120021461021757604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b60006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190611de4565b6102879042611e13565b6098546000828152609d6020908152604080832093909355609c9052908120805492935034929091906102bb908490611e35565b9250508190555034609860008282546102d49190611e35565b925050819055005b600080fd5b3480156102ed57600080fd5b506103016102fc366004611e60565b610717565b6040519081526020015b60405180910390f35b34801561032057600080fd5b50610329610747565b60405161030b9190611e84565b34801561034257600080fd5b50610301610351366004611e60565b6107d9565b34801561036257600080fd5b50610376610371366004611ed2565b6107fb565b604051901515815260200161030b565b34801561039257600080fd5b5061030160985481565b3480156103a857600080fd5b50606754610301565b3480156103bd57600080fd5b506103766103cc366004611efe565b610813565b3480156103dd57600080fd5b506103016103ec366004611e60565b610837565b3480156103fd57600080fd5b5060125b60405160ff909116815260200161030b565b34801561041f57600080fd5b5061037661042e366004611ed2565b6108fc565b34801561043f57600080fd5b50609754610453906001600160a01b031681565b6040516001600160a01b03909116815260200161030b565b34801561047757600080fd5b50610301610486366004611f3f565b61091e565b34801561049757600080fd5b50610401600881565b3480156104ac57600080fd5b506103016104bb366004611ed2565b610a11565b6103016104ce366004611e60565b610c28565b6104e66104e1366004611f58565b610c9e565b005b3480156104f457600080fd5b50610301610503366004611f3f565b610e11565b34801561051457600080fd5b50610301610523366004611f3f565b609d6020526000908152604090205481565b34801561054157600080fd5b50610301610550366004611e60565b6001600160a01b031660009081526065602052604090205490565b34801561057757600080fd5b50610301610586366004611f3f565b610e50565b34801561059757600080fd5b50610329610e8b565b3480156105ac57600080fd5b506103766105bb366004611ed2565b610e9a565b3480156105cc57600080fd5b506103016105db366004611ed2565b610f15565b3480156105ec57600080fd5b506103766105fb366004611ed2565b611016565b34801561060c57600080fd5b5061030161061b366004611ed2565b611024565b34801561062c57600080fd5b5061030161063b366004611f3f565b609c6020526000908152604090205481565b34801561065957600080fd5b50610301610668366004611ed2565b61114d565b34801561067957600080fd5b50610301610688366004611e60565b6113f0565b34801561069957600080fd5b506106ad6106a8366004611ed2565b61140e565b604080518251815260208084015190820152918101519082015260600161030b565b3480156106db57600080fd5b506103016106ea366004611f82565b611491565b3480156106fb57600080fd5b50610401601181565b6104e6610712366004611fbb565b6114bc565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b035b92915050565b60606068805461075690612040565b80601f016020809104026020016040519081016040528092919081815260200182805461078290612040565b80156107cf5780601f106107a4576101008083540402835291602001916107cf565b820191906000526020600020905b8154815290600101906020018083116107b257829003601f168201915b5050505050905090565b6001600160a01b03811660009081526065602052604081205461074190610e50565b600033610809818585611672565b5060019392505050565b60003361082185828561168b565b61082c8585856116ff565b506001949350505050565b6001600160a01b0381166000908152609a6020526040812054600f81810b600160801b909204900b0381805b828110156108f4576001600160a01b0385166000908152609a6020526040812061088d9083611718565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042106108da576108d384612074565b93506108e1565b50506108f4565b5050806108ed90612074565b9050610863565b509392505050565b60003361080981858561090f8383611491565b6109199190611e35565b611672565b6000336120021461094657604051630f22c43960e41b8152612002600482015260240161020e565b6097546001600160a01b03166000908152606560205260408120549061096b84610e11565b905081811161097a578061097c565b815b609754909150600090610998906001600160a01b031683611789565b6040519091506000906110029083908381818185875af1925050503d80600081146109df576040519150601f19603f3d011682016040523d82523d6000602084013e6109e4565b606091505b5050905080610a06576040516312171d8360e31b815260040160405180910390fd5b50925050505b919050565b60003361200214610a3957604051630f22c43960e41b8152612002600482015260240161020e565b81600003610a5a57604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610a9357604051631e9acf1760e31b815260040160405180910390fd5b610a9d8383611789565b905060006120026001600160a01b031663fc0c5ff16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b059190611de4565b610b0f9042611e35565b6040805160608101825285815260208101859052908101829052909150600085610b38816117be565b60405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160408051601f1981840301815291815281516020928301206000818152609990935291205490915015610ba35760405163b19e911560e01b815260040160405180910390fd5b600081815260996020908152604080832085518155828601516001820155818601516002909101556001600160a01b0389168352609a9091529020610c1f90828154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b50505092915050565b60003361200214610c5057604051630f22c43960e41b8152612002600482015260240161020e565b34600003610c7157604051631f2a200560e01b815260040160405180910390fd5b610c7b82346117e6565b905080600003610a0c57604051639811e0c760e01b815260040160405180910390fd5b3361200214610cc457604051630f22c43960e41b8152612002600482015260240161020e565b346000612710610cde67ffffffffffffffff85168461208d565b610ce89190611e13565b90506000610cf682846120a4565b905060006120026001600160a01b0316631fa8882b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5e9190611de4565b610d689042611e13565b6098546000828152609d6020908152604080832093909355609c905290812080549293508492909190610d9c908490611e35565b925050819055508160986000828254610db59190611e35565b9091555050609754610dd0906001600160a01b0316846117e6565b5060408051838152602081018590527ffb0e1482d62102ab9594f69d4c6d693749e3e2bf1c21af272f5456b2d5a4f6b5910160405180910390a15050505050565b6000609854600003610e36576040516307b76ce760e51b815260040160405180910390fd5b609854606754610e46908461208d565b6107419190611e13565b6000610e5b60675490565b600003610e7b57604051632fe8dae960e01b815260040160405180910390fd5b606754609854610e46908461208d565b60606069805461075690612040565b60003381610ea88286611491565b905083811015610f085760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161020e565b61082c8286868403611672565b60003361200214610f3d57604051630f22c43960e41b8152612002600482015260240161020e565b81600003610f5e57604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b038316600090815260656020526040902054821115610f9757604051631e9acf1760e31b815260040160405180910390fd5b610fa18383611789565b6040519091506000906120029083908381818185875af1925050503d8060008114610fe8576040519150601f19603f3d011682016040523d82523d6000602084013e610fed565b606091505b505090508061100f576040516312171d8360e31b815260040160405180910390fd5b5092915050565b6000336108098185856116ff565b6001600160a01b0382166000908152609a6020526040812054600f81810b600160801b909204900b0360000361105c57506000610741565b81158061109057506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b61109a57816110c4565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b91506000805b838110156108f4576001600160a01b0385166000908152609a602052604081206110f49083611718565b600081815260996020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252919250906111389085611e35565b935050508061114690612074565b90506110ca565b6000336120021461117557604051630f22c43960e41b8152612002600482015260240161020e565b61117d61180f565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b036000036111c65760405163ad41893760e01b815260040160405180910390fd5b8115806111fa57506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b611204578161122e565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b915060005b82156112e4576001600160a01b0384166000908152609a6020526040812061125a90611868565b6000818152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810182905291925042101561129f5750506112e4565b6001600160a01b0386166000908152609a602052604090206112c0906118bc565b5060208101516112d09084611e35565b92506112db856120b7565b94505050611233565b80600003611305576040516303cd8e0960e21b815260040160405180910390fd5b60006120026001600160a01b031663e8f67c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b9190611de4565b90506000856001600160a01b03168284604051600060405180830381858888f193505050503d80600081146113bc576040519150601f19603f3d011682016040523d82523d6000602084013e6113c1565b606091505b50509050806113e3576040516312171d8360e31b815260040160405180910390fd5b5050600180559050610741565b6001600160a01b0381166000908152609b6020526040812054610741565b61143260405180606001604052806000815260200160008152602001600081525090565b6001600160a01b0383166000908152609a602052604081206114549084611718565b6000908152609960209081526040918290208251606081018452815481526001820154928101929092526002015491810191909152949350505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b600054610100900460ff16158080156114dc5750600054600160ff909116105b806114f65750303b1580156114f6575060005460ff166001145b6115595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161020e565b6000805460ff19166001179055801561157c576000805461ff0019166101001790555b33612002146115a257604051630f22c43960e41b8152612002600482015260240161020e565b600083836040516020016115b79291906120ce565b6040516020818303038152906040529050600084846040516020016115dd9291906120fe565b60405160208183030381529060405290506115f88282611941565b611600611986565b609780546001600160a01b0319166001600160a01b038816179055611624346119ad565b5050801561166c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051632028747160e01b815260040160405180910390fd5b60006116978484611491565b9050600019811461166c57818110156116f25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161020e565b61166c8484848403611672565b604051638cd22d1960e01b815260040160405180910390fd5b60008061173b61172784611b1d565b85546117369190600f0b61211c565b611b8b565b8454909150600160801b9004600f90810b9082900b1261176e57604051632d0483c560e21b815260040160405180910390fd5b600f0b60009081526001939093016020525050604090205490565b600061179482610e50565b90506117a08383611bef565b80609860008282546117b291906120a4565b90915550909392505050565b6001600160a01b0381166000908152609b602052604090208054600181018255905b50919050565b60006117f182610e11565b90506117fd8382611d23565b81609860008282546117b29190611e35565b6002600154036118615760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161020e565b6002600155565b60006118838254600f81810b600160801b909204900b131590565b156118a157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b60009081526001909101602052604090205490565b60006118d78254600f81810b600160801b909204900b131590565b156118f557604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60018055565b600054610100900460ff166119685760405162461bcd60e51b815260040161020e90612144565b606861197483826121f3565b50606961198182826121f3565b505050565b600054610100900460ff1661193b5760405162461bcd60e51b815260040161020e90612144565b600054610100900460ff166119d45760405162461bcd60e51b815260040161020e90612144565b60006120026001600160a01b0316638a4d3fa86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3a9190611de4565b90508082111580611a5457506097546001600160a01b0316155b80611a60575060675415155b15611a7e57604051632163e6b960e21b815260040160405180910390fd5b60006120026001600160a01b0316634e6fd6c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae491906122b3565b9050611af08183611d23565b6000611afc83856120a4565b609754909150611b15906001600160a01b031682611d23565b505050609855565b60006001600160ff1b03821115611b875760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b606482015260840161020e565b5090565b80600f81900b8114610a0c5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b606482015260840161020e565b6001600160a01b038216611c4f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161020e565b6001600160a01b03821660009081526065602052604090205481811015611cc35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161020e565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b038216611d795760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161020e565b8060676000828254611d8b9190611e35565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208284031215611df657600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611e3057634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561074157610741611dfd565b6001600160a01b0381168114611e5d57600080fd5b50565b600060208284031215611e7257600080fd5b8135611e7d81611e48565b9392505050565b600060208083528351808285015260005b81811015611eb157858101830151858201604001528201611e95565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215611ee557600080fd5b8235611ef081611e48565b946020939093013593505050565b600080600060608486031215611f1357600080fd5b8335611f1e81611e48565b92506020840135611f2e81611e48565b929592945050506040919091013590565b600060208284031215611f5157600080fd5b5035919050565b600060208284031215611f6a57600080fd5b813567ffffffffffffffff81168114611e7d57600080fd5b60008060408385031215611f9557600080fd5b8235611fa081611e48565b91506020830135611fb081611e48565b809150509250929050565b600080600060408486031215611fd057600080fd5b8335611fdb81611e48565b9250602084013567ffffffffffffffff80821115611ff857600080fd5b818601915086601f83011261200c57600080fd5b81358181111561201b57600080fd5b87602082850101111561202d57600080fd5b6020830194508093505050509250925092565b600181811c9082168061205457607f821691505b6020821081036117e057634e487b7160e01b600052602260045260246000fd5b60006001820161208657612086611dfd565b5060010190565b808202811582820484141761074157610741611dfd565b8181038181111561074157610741611dfd565b6000816120c6576120c6611dfd565b506000190190565b65029ba30b5b2960d51b815281836006830137660810dc99591a5d60ca1b91016006810191909152600d01919050565b611cdd60f21b81528183600283013760009101600201908152919050565b808201828112600083128015821682158216171561213c5761213c611dfd565b505092915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561198157600081815260208120601f850160051c810160208610156121cc5750805b601f850160051c820191505b818110156121eb578281556001016121d8565b505050505050565b815167ffffffffffffffff81111561220d5761220d61218f565b6122218161221b8454612040565b846121a5565b602080601f831160018114612256576000841561223e5750858301515b600019600386901b1c1916600185901b1785556121eb565b600085815260208120601f198616915b8281101561228557888601518255948401946001909101908401612266565b50858210156122a35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156122c557600080fd5b8151611e7d81611e4856fea164736f6c6343000811000a", }, { ContractAddr: common.HexToAddress(GovernorContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "6080604052600436106103f35760003560e01c80637b3c71d311610208578063c28bc2fa11610118578063e23a9a52116100ab578063f1fad1041161007a578063f1fad10414610e46578063f23a6e6114610e5b578063f8ce560a14610e87578063fc0c546a14610ea7578063fe0d94c114610ec857600080fd5b8063e23a9a5214610d1b578063ea0217cf14610de6578063eb9019d414610e06578063ece40cc114610e2657600080fd5b8063da95691a116100e7578063da95691a14610c61578063dd4e2ba514610c81578063ddf0b00914610cc7578063deaaa7cc14610ce757600080fd5b8063c28bc2fa14610bef578063c59057e414610c02578063d07f91e914610c22578063d33219b414610c4257600080fd5b8063a7713a701161019b578063b187bd261161016a578063b187bd2614610b55578063b58131b014610b73578063bc197c8114610b88578063c01f9e3714610bb4578063c170ec0b14610bd457600080fd5b8063a7713a7014610ae0578063a890c91014610af5578063ab58fb8e14610b15578063ac43175114610b3557600080fd5b806384b0196e116101d757806384b0196e14610a5857806391ddadf414610a8057806397c3d33414610aac5780639a802a6d14610ac057600080fd5b80637b3c71d3146109ee5780637d5e81e214610a0e5780638129fc1c14610a2e5780638456cb5914610a4357600080fd5b80633932abb1116103035780634a49ac4c1161029657806354fd4d501161026557806354fd4d5014610944578063567813881461096e5780635f398a141461098e57806360c4247f146109ae57806370b0f660146109ce57600080fd5b80634a49ac4c146108b75780634bf5d7e9146108d75780634bf6c882146108ec578063533ddd141461091357600080fd5b8063417c73a7116102d2578063417c73a7146107fc578063438596321461081c578063452115d6146108675780634838d1651461088757600080fd5b80633932abb1146107795780633bccf4fd1461078f5780633e4f49e6146107af57806340e58ee5146107dc57600080fd5b8063150b7a02116103865780632656227d116103555780632656227d146106a25780632d63f693146106b55780632fe3e261146106ec578063328dd9821461072057806332b8113e1461075057600080fd5b8063150b7a02146105fb578063160cbed71461063f57806317977c611461065f57806324bc1a641461068d57600080fd5b8063046f7da2116103c2578063046f7da21461054e57806306f3f9e61461056357806306fdde0314610583578063143489d0146105a557600080fd5b8063013cf08b1461046357806301ffc9a7146104de57806302a251a31461050e578063034201811461052e57600080fd5b3661045e5730610401610edb565b6001600160a01b03161461045c5760405162461bcd60e51b815260206004820152601f60248201527f476f7665726e6f723a206d7573742073656e6420746f206578656375746f720060448201526064015b60405180910390fd5b005b600080fd5b34801561046f57600080fd5b5061048361047e366004615c87565b610ef5565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b3480156104ea57600080fd5b506104fe6104f9366004615ca0565b610fb0565b60405190151581526020016104d5565b34801561051a57600080fd5b50610195545b6040519081526020016104d5565b34801561053a57600080fd5b50610520610549366004615de6565b610fc1565b34801561055a57600080fd5b5061045c6110b9565b34801561056f57600080fd5b5061045c61057e366004615c87565b611149565b34801561058f57600080fd5b506105986111d4565b6040516104d59190615edc565b3480156105b157600080fd5b506105e36105c0366004615c87565b60009081526101636020526040902054600160401b90046001600160a01b031690565b6040516001600160a01b0390911681526020016104d5565b34801561060757600080fd5b50610626610616366004615f04565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016104d5565b34801561064b57600080fd5b5061052061065a3660046160db565b611267565b34801561066b57600080fd5b5061052061067a36600461616a565b6102c36020526000908152604090205481565b34801561069957600080fd5b50610520611352565b6105206106b03660046160db565b611378565b3480156106c157600080fd5b506105206106d0366004615c87565b600090815261016360205260409020546001600160401b031690565b3480156106f857600080fd5b506105207fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561072c57600080fd5b5061074061073b366004615c87565b61146b565b6040516104d59493929190616250565b34801561075c57600080fd5b5061028f546040516001600160401b0390911681526020016104d5565b34801561078557600080fd5b5061019454610520565b34801561079b57600080fd5b506105206107aa36600461629d565b6116fd565b3480156107bb57600080fd5b506107cf6107ca366004615c87565b611773565b6040516104d59190616301565b3480156107e857600080fd5b5061045c6107f7366004615c87565b61177e565b34801561080857600080fd5b5061045c61081736600461616a565b6117a9565b34801561082857600080fd5b506104fe610837366004616329565b60008281526101c6602090815260408083206001600160a01b038516845260080190915290205460ff1692915050565b34801561087357600080fd5b506105206108823660046160db565b61182a565b34801561089357600080fd5b506104fe6108a236600461616a565b60016020526000908152604090205460ff1681565b3480156108c357600080fd5b5061045c6108d236600461616a565b611838565b3480156108e357600080fd5b506105986118b3565b3480156108f857600080fd5b50610901600881565b60405160ff90911681526020016104d5565b34801561091f57600080fd5b506104fe61092e36600461616a565b6102c16020526000908152604090205460ff1681565b34801561095057600080fd5b506040805180820190915260018152603160f81b6020820152610598565b34801561097a57600080fd5b50610520610989366004616359565b611960565b34801561099a57600080fd5b506105206109a9366004616385565b611989565b3480156109ba57600080fd5b506105206109c9366004615c87565b6119d3565b3480156109da57600080fd5b5061045c6109e9366004615c87565b611a88565b3480156109fa57600080fd5b50610520610a09366004616408565b611b10565b348015610a1a57600080fd5b50610520610a29366004616461565b611b62565b348015610a3a57600080fd5b5061045c611c7d565b348015610a4f57600080fd5b5061045c611eab565b348015610a6457600080fd5b50610a6d611f41565b6040516104d59796959493929190616501565b348015610a8c57600080fd5b50610a95611fdf565b60405165ffffffffffff90911681526020016104d5565b348015610ab857600080fd5b506064610520565b348015610acc57600080fd5b50610520610adb366004616563565b612053565b348015610aec57600080fd5b5061052061206a565b348015610b0157600080fd5b5061045c610b1036600461616a565b612097565b348015610b2157600080fd5b50610520610b30366004615c87565b61211f565b348015610b4157600080fd5b5061045c610b503660046165bb565b6121bb565b348015610b6157600080fd5b5060005462010000900460ff166104fe565b348015610b7f57600080fd5b50610520612900565b348015610b9457600080fd5b50610626610ba336600461661a565b63bc197c8160e01b95945050505050565b348015610bc057600080fd5b50610520610bcf366004615c87565b61290c565b348015610be057600080fd5b506102c2546104fe9060ff1681565b61045c610bfd3660046166ad565b612917565b348015610c0e57600080fd5b50610520610c1d3660046160db565b612a27565b348015610c2e57600080fd5b5061045c610c3d3660046166f0565b612a61565b348015610c4e57600080fd5b5061022b546001600160a01b03166105e3565b348015610c6d57600080fd5b50610520610c7c366004616719565b612ae9565b348015610c8d57600080fd5b5060408051808201909152601a81527f737570706f72743d627261766f2671756f72756d3d627261766f0000000000006020820152610598565b348015610cd357600080fd5b5061045c610ce2366004615c87565b612b70565b348015610cf357600080fd5b506105207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610d2757600080fd5b50610db6610d36366004616329565b60408051606081018252600080825260208201819052918101919091525060009182526101c6602090815260408084206001600160a01b0393909316845260089092018152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b0316908201526060016104d5565b348015610df257600080fd5b5061045c610e01366004615c87565b612b93565b348015610e1257600080fd5b50610520610e213660046167ba565b612c1b565b348015610e3257600080fd5b5061045c610e41366004615c87565b612c3c565b348015610e5257600080fd5b50610901601181565b348015610e6757600080fd5b50610626610e763660046167e6565b63f23a6e6160e01b95945050505050565b348015610e9357600080fd5b50610520610ea2366004615c87565b612cc4565b348015610eb357600080fd5b506101f8546105e3906001600160a01b031681565b61045c610ed6366004615c87565b612d53565b6000610ef061022b546001600160a01b031690565b905090565b8060008080808080808080610f098a61211f565b60008c815261016360205260409020549098506001600160401b03169650610f308b61290c565b60008c81526101c66020526040812080546005820154600683015460078401546001600160a01b039093169e50949a509850929650919450610f718d611773565b90506002816007811115610f8757610f876162eb565b1493506007816007811115610f9e57610f9e6162eb565b14925050509193959799509193959799565b6000610fbb82612d76565b92915050565b60008061106561105d7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610ffd92919061684e565b60405180910390208b80519060200120604051602001611042959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120612d9b565b868686612dc8565b90506110ab8a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d9250612de6915050565b9a9950505050505050505050565b600054630100000090046001600160a01b031633146110eb576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1661111457604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b611151610edb565b6001600160a01b0316336001600160a01b0316146111815760405162461bcd60e51b81526004016104539061685e565b3061118a610edb565b6001600160a01b0316146111c857600080366040516111aa92919061684e565b604051809103902090505b806111c1610164612e4f565b036111b557505b6111d181612ece565b50565b606061016280546111e490616895565b80601f016020809104026020016040519081016040528092919081815260200182805461121090616895565b801561125d5780601f106112325761010080835404028352916020019161125d565b820191906000526020600020905b81548152906001019060200180831161124057829003601f168201915b5050505050905090565b6000805462010000900460ff161561129257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156112c35760405163b1d02c3d60e01b815260040160405180910390fd5b60005b855181101561133c576102c160008783815181106112e6576112e66168cf565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1661132a57604051630b094f2760e31b815260040160405180910390fd5b80611334816168fb565b9150506112c6565b506113498585858561303f565b95945050505050565b6000610ef06001611361611fdf565b61136b9190616914565b65ffffffffffff16612cc4565b60008061138786868686612a27565b9050600061139482611773565b905060048160078111156113aa576113aa6162eb565b14806113c7575060058160078111156113c5576113c56162eb565b145b6113e35760405162461bcd60e51b81526004016104539061693a565b6000828152610163602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906114329084815260200190565b60405180910390a16114478288888888613244565b61145482888888886132e5565b61146182888888886133c7565b5095945050505050565b60608060608060006101c66000878152602001908152602001600020905080600101816002018260030183600401838054806020026020016040519081016040528092919081815260200182805480156114ee57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114d0575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561154057602002820191906000526020600020905b81548152602001906001019080831161152c575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561161457838290600052602060002001805461158790616895565b80601f01602080910402602001604051908101604052809291908181526020018280546115b390616895565b80156116005780601f106115d557610100808354040283529160200191611600565b820191906000526020600020905b8154815290600101906020018083116115e357829003601f168201915b505050505081526020019060010190611568565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156116e757838290600052602060002001805461165a90616895565b80601f016020809104026020016040519081016040528092919081815260200182805461168690616895565b80156116d35780601f106116a8576101008083540402835291602001916116d3565b820191906000526020600020905b8154815290600101906020018083116116b657829003601f168201915b50505050508152602001906001019061163b565b5050505090509450945094509450509193509193565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff85166060820152600090819061174b9061105d90608001611042565b905061176887828860405180602001604052806000815250613402565b979650505050505050565b6000610fbb82613425565b60008060008061178d85613572565b93509350935093506117a18484848461182a565b505050505050565b600054630100000090046001600160a01b031633146117db576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b600061134985858585613803565b600054630100000090046001600160a01b0316331461186a576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b6101f85460408051634bf5d7e960e01b815290516060926001600160a01b031691634bf5d7e99160048083019260009291908290030181865afa92505050801561191f57506040513d6000823e601f3d908101601f1916820160405261191c919081019061697b565b60015b61195b575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b60008033905061198184828560405180602001604052806000815250613402565b949350505050565b60008033905061176887828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250612de6915050565b61025e546000908082036119ec57505061025d54919050565b600061025e6119fc6001846169e8565b81548110611a0c57611a0c6168cf565b60009182526020918290206040805180820190915291015463ffffffff8116808352600160201b9091046001600160e01b03169282019290925291508410611a6257602001516001600160e01b03169392505050565b611a77611a6e856138ce565b61025e90613937565b6001600160e01b0316949350505050565b611a90610edb565b6001600160a01b0316336001600160a01b031614611ac05760405162461bcd60e51b81526004016104539061685e565b30611ac9610edb565b6001600160a01b031614611b075760008036604051611ae992919061684e565b604051809103902090505b80611b00610164612e4f565b03611af457505b6111d1816139ea565b600080339050611b5886828787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061340292505050565b9695505050505050565b6000805462010000900460ff1615611b8d57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615611bbe5760405163b1d02c3d60e01b815260040160405180910390fd5b611bc6613a2d565b3360009081526102c360205260409020548015611c3b576000611be882611773565b90506001816007811115611bfe57611bfe6162eb565b1480611c1b57506000816007811115611c1957611c196162eb565b145b15611c395760405163867f3ee560e01b815260040160405180910390fd5b505b825160208401206000611c5088888885612a27565b3360009081526102c3602052604090208190559050611c7188888888613ad8565b98975050505050505050565b600054610100900460ff1615808015611c9d5750600054600160ff909116105b80611cb75750303b158015611cb7575060005460ff166001145b611d1a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610453565b6000805460ff191660011790558015611d3d576000805461ff0019166101001790555b334114611d5d5760405163022d8c9560e31b815260040160405180910390fd5b3a15611d7c576040516383f1b1d360e01b815260040160405180910390fd5b611da86040518060400160405280600b81526020016a2129a1a3b7bb32b93737b960a91b815250613b40565b611dd2611db76003603c616a11565b611dc360036078616a11565b680ad78ebc5ac6200000613b97565b611dda613bce565b611de5612005613bf5565b611df0612006613c25565b611dfa600a613c55565b611e0e611e096003603c616a11565b613c85565b6110076000526102c16020527f2f832952f0ef896b8c8edd6d16a2e4f2591a90375e33021e3b9ff197f3793fc0805460ff19166001179055611e6373df87f0e2b8519ea2dd4abd8b639cdd628497ed25613cb5565b80156111d1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b600054630100000090046001600160a01b03163314611edd576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1615611f0757604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b6000606080600080600060606098546000801b148015611f615750609954155b611fa55760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610453565b611fad613d08565b611fb5613d17565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6101f854604080516324776b7d60e21b815290516000926001600160a01b0316916391ddadf49160048083019260209291908290030181865afa925050508015612046575060408051601f3d908101601f1916820190925261204391810190616a33565b60015b61195b57610ef043613d26565b6000612060848484613d8d565b90505b9392505050565b61025e546000901561208f5761208161025e613e04565b6001600160e01b0316905090565b5061025d5490565b61209f610edb565b6001600160a01b0316336001600160a01b0316146120cf5760405162461bcd60e51b81526004016104539061685e565b306120d8610edb565b6001600160a01b03161461211657600080366040516120f892919061684e565b604051809103902090505b8061210f610164612e4f565b0361210357505b6111d181613e34565b61022b54600082815261022c602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa15801561217e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a29190616a5b565b9050806001146121b25780612063565b60009392505050565b33611007146121e157604051630f22c43960e41b81526110076004820152602401610453565b6122476040518060400160405280600b81526020016a766f74696e6744656c617960a81b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e9f9050565b156122fc57602081146122755783838383604051630a5a604160e01b81526004016104539493929190616a9d565b604080516020601f84018190048102820181019092528281526000916122b6918585808385018382808284376000920191909152509293925050613ef89050565b90508015806122c757506201518081115b156122ed5784848484604051630a5a604160e01b81526004016104539493929190616a9d565b6122f6816139ea565b506128bd565b6123636040518060400160405280600c81526020016b1d9bdd1a5b99d4195c9a5bd960a21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e9f9050565b1561241257602081146123915783838383604051630a5a604160e01b81526004016104539493929190616a9d565b604080516020601f84018190048102820181019092528281526000916123d2918585808385018382808284376000920191909152509293925050613ef89050565b90508015806123e3575062278d0081115b156124095784848484604051630a5a604160e01b81526004016104539493929190616a9d565b6122f681613efd565b61247e604051806040016040528060118152602001701c1c9bdc1bdcd85b151a1c995cda1bdb19607a1b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e9f9050565b1561253457602081146124ac5783838383604051630a5a604160e01b81526004016104539493929190616a9d565b604080516020601f84018190048102820181019092528281526000916124ed918585808385018382808284376000920191909152509293925050613ef89050565b9050801580612505575069021e19e0c9bab240000081115b1561252b5784848484604051630a5a604160e01b81526004016104539493929190616a9d565b6122f681613fa0565b61259e6040518060400160405280600f81526020016e38bab7b93ab6a73ab6b2b930ba37b960891b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e9f9050565b1561264d57602081146125cc5783838383604051630a5a604160e01b81526004016104539493929190616a9d565b604080516020601f840181900481028201810190925282815260009161260d918585808385018382808284376000920191909152509293925050613ef89050565b9050600581108061261e5750601481115b156126445784848484604051630a5a604160e01b81526004016104539493929190616a9d565b6122f681612ece565b6126bc604051806040016040528060148152602001736d696e506572696f64416674657251756f72756d60601b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e9f9050565b1561278257600881146126ea5783838383604051630a5a604160e01b81526004016104539493929190616a9d565b6000612730600884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ef89050565b90506001600160401b038116158061275357506202a300816001600160401b0316115b156127795784848484604051630a5a604160e01b81526004016104539493929190616a9d565b6122f681613fe3565b6127ee6040518060400160405280601181526020017033b7bb32b93737b9283937ba32b1ba37b960791b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613e9f9050565b1561289c576014811461281c5783838383604051630a5a604160e01b81526004016104539493929190616a9d565b6000612862601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050613ef89050565b90506001600160a01b0381166128935784848484604051630a5a604160e01b81526004016104539493929190616a9d565b6122f68161404f565b838383836040516325ee20d560e21b81526004016104539493929190616a9d565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516128f29493929190616a9d565b60405180910390a150505050565b6000610ef06101965490565b6000610fbb826140bb565b61291f610edb565b6001600160a01b0316336001600160a01b03161461294f5760405162461bcd60e51b81526004016104539061685e565b30612958610edb565b6001600160a01b031614612996576000803660405161297892919061684e565b604051809103902090505b8061298f610164612e4f565b0361298357505b600080856001600160a01b03168585856040516129b492919061684e565b60006040518083038185875af1925050503d80600081146129f1576040519150601f19603f3d011682016040523d82523d6000602084013e6129f6565b606091505b5091509150612a1e8282604051806060016040528060288152602001616efa602891396140f9565b50505050505050565b600084848484604051602001612a409493929190616ac4565b60408051601f19818403018152919052805160209091012095945050505050565b612a69610edb565b6001600160a01b0316336001600160a01b031614612a995760405162461bcd60e51b81526004016104539061685e565b30612aa2610edb565b6001600160a01b031614612ae05760008036604051612ac292919061684e565b604051809103902090505b80612ad9610164612e4f565b03612acd57505b6111d181613fe3565b60008251845114612b4d5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a20696e76616c6964207369676e61747572656044820152670e640d8cadccee8d60c31b6064820152608401610453565b612b5b338787878787614112565b611b588686612b6a87876141d0565b85611b62565b600080600080612b7f85613572565b93509350935093506117a184848484611267565b612b9b610edb565b6001600160a01b0316336001600160a01b031614612bcb5760405162461bcd60e51b81526004016104539061685e565b30612bd4610edb565b6001600160a01b031614612c125760008036604051612bf492919061684e565b604051809103902090505b80612c0b610164612e4f565b03612bff57505b6111d181613efd565b60006120638383612c3760408051602081019091526000815290565b613d8d565b612c44610edb565b6001600160a01b0316336001600160a01b031614612c745760405162461bcd60e51b81526004016104539061685e565b30612c7d610edb565b6001600160a01b031614612cbb5760008036604051612c9d92919061684e565b604051809103902090505b80612cb4610164612e4f565b03612ca857505b6111d181613fa0565b60006064612cd1836119d3565b6101f854604051632394e7a360e21b8152600481018690526001600160a01b0390911690638e539e8c90602401602060405180830381865afa158015612d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3f9190616a5b565b612d499190616b0f565b610fbb9190616a11565b600080600080612d6285613572565b93509350935093506117a184848484611378565b60006001600160e01b03198216636e665ced60e01b1480610fbb5750610fbb82614302565b6000610fbb612da861439e565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000612dd9878787876143a8565b915091506114618161446c565b6000805462010000900460ff1615612e1157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615612e425760405163b1d02c3d60e01b815260040160405180910390fd5b611b5886868686866145b6565b6000612e6a8254600f81810b600160801b909204900b131590565b15612e8857604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b6064811115612f515760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a401610453565b6000612f5b61206a565b90508015801590612f6d575061025e54155b15612fd257604080518082019091526000815261025e9060208101612f91846146b9565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b613000612fed612fe0611fdf565b65ffffffffffff166138ce565b612ff6846146b9565b61025e9190614722565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b60008061304e86868686612a27565b9050600461305b82611773565b600781111561306c5761306c6162eb565b146130895760405162461bcd60e51b81526004016104539061693a565b61022b546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa1580156130d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f89190616a5b565b61022b5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790613133908a908a908a906000908b90600401616b26565b602060405180830381865afa158015613150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131749190616a5b565b600083815261022c60205260408082209290925561022b5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb0916131c1918b918b918b91908b908990600401616b74565b600060405180830381600087803b1580156131db57600080fd5b505af11580156131ef573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426132219190616bcc565b604080519283526020830191909152015b60405180910390a15095945050505050565b3061324d610edb565b6001600160a01b0316146132de5760005b84518110156117a157306001600160a01b0316858281518110613283576132836168cf565b60200260200101516001600160a01b0316036132ce576132ce8382815181106132ae576132ae6168cf565b60200260200101518051906020012061016461473d90919063ffffffff16565b6132d7816168fb565b905061325e565b5050505050565b60005462010000900460ff161561330f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156133405760405163b1d02c3d60e01b815260040160405180910390fd5b60005b84518110156133b9576102c16000868381518110613363576133636168cf565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166133a757604051630b094f2760e31b815260040160405180910390fd5b806133b1816168fb565b915050613343565b506132de8585858585614779565b306133d0610edb565b6001600160a01b0316146132de5761016454600f81810b600160801b909204900b13156132de576000610164556132de565b60006113498585858561342060408051602081019091526000815290565b612de6565b600080613431836147ee565b90506004816007811115613447576134476162eb565b146134525792915050565b600083815261022c60205260409020548061346e575092915050565b61022b54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa1580156134b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134dc9190616bdf565b156134eb575060079392505050565b61022b54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa158015613535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135599190616bdf565b15613568575060059392505050565b5060029392505050565b60608060606000806101c660008781526020019081526020016000209050806001018160020161374483600301805480602002602001604051908101604052809291908181526020016000905b8282101561366b5783829060005260206000200180546135de90616895565b80601f016020809104026020016040519081016040528092919081815260200182805461360a90616895565b80156136575780601f1061362c57610100808354040283529160200191613657565b820191906000526020600020905b81548152906001019060200180831161363a57829003601f168201915b5050505050815260200190600101906135bf565b50505060048601805460408051602080840282018101909252828152935060009084015b8282101561373b5783829060005260206000200180546136ae90616895565b80601f01602080910402602001604051908101604052809291908181526020018280546136da90616895565b80156137275780601f106136fc57610100808354040283529160200191613727565b820191906000526020600020905b81548152906001019060200180831161370a57829003601f168201915b50505050508152602001906001019061368f565b505050506141d0565b600984015483546040805160208084028201810190925282815291869183018282801561379a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161377c575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156137ec57602002820191906000526020600020905b8154815260200190600101908083116137d8575b505050505092509450945094509450509193509193565b60008061381286868686612a27565b60008181526101c660205260409020549091506001600160a01b031633811480613866575061383f612900565b61386482600161384d611fdf565b6138579190616914565b65ffffffffffff16612c1b565b105b6138c25760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72427261766f3a2070726f706f7365722061626f76652074686044820152661c995cda1bdb1960ca1b6064820152608401610453565b61176887878787614926565b600063ffffffff8211156139335760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610453565b5090565b81546000908181600581111561399457600061395284614934565b61395c90856169e8565b60008881526020902090915081015463ffffffff908116908716101561398457809150613992565b61398f816001616bcc565b92505b505b60006139a287878585614a1c565b905080156139dd576139c7876139b96001846169e8565b600091825260209091200190565b54600160201b90046001600160e01b0316611768565b6000979650505050505050565b6101945460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a161019455565b6102c25460ff16613ad6576a084595161401484a0000006120056001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa89190616a5b565b1015613ac7576040516311b6707f60e01b815260040160405180910390fd5b6102c2805460ff191660011790555b565b6000613b3433868686516001600160401b03811115613af957613af9615d23565b604051908082528060200260200182016040528015613b2c57816020015b6060815260200190600190039081613b175790505b508787614112565b61134985858585614a72565b600054610100900460ff16613b675760405162461bcd60e51b815260040161045390616c01565b613b8e81613b896040805180820190915260018152603160f81b602082015290565b614e51565b6111d181614ea0565b600054610100900460ff16613bbe5760405162461bcd60e51b815260040161045390616c01565b613bc9838383614ed8565b505050565b600054610100900460ff16613ad65760405162461bcd60e51b815260040161045390616c01565b600054610100900460ff16613c1c5760405162461bcd60e51b815260040161045390616c01565b6111d181614f1a565b600054610100900460ff16613c4c5760405162461bcd60e51b815260040161045390616c01565b6111d181614f64565b600054610100900460ff16613c7c5760405162461bcd60e51b815260040161045390616c01565b6111d181614f8b565b600054610100900460ff16613cac5760405162461bcd60e51b815260040161045390616c01565b6111d181614fb2565b600054610100900460ff16613cdc5760405162461bcd60e51b815260040161045390616c01565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6060609a80546111e490616895565b6060609b80546111e490616895565b600065ffffffffffff8211156139335760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610453565b6101f854604051630748d63560e31b81526001600160a01b038581166004830152602482018590526000921690633a46b1a890604401602060405180830381865afa158015613de0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120609190616a5b565b805460009080156121b257613e1e836139b96001846169e8565b54600160201b90046001600160e01b0316612063565b61022b54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a161022b80546001600160a01b0319166001600160a01b0392909216919091179055565b600081604051602001613eb29190616c4c565b6040516020818303038152906040528051906020012083604051602001613ed99190616c4c565b6040516020818303038152906040528051906020012014905092915050565b015190565b60008111613f5d5760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b6064820152608401610453565b6101955460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a161019555565b6101965460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a161019655565b61028f54604080516001600160401b03928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a161028f805467ffffffffffffffff19166001600160401b0392909216919091179055565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60008181526101636020526040812060010154610fbb906001600160401b0316600084815261029060205260409020546001600160401b0316614fd9565b60608315614108575081612063565b6120638383614fef565b805160208201206000614130878761412a88886141d0565b85612a27565b60008181526101c6602052604090206009810154919250906141c55780546001600160a01b0319166001600160a01b038a16178155875161417a90600183019060208b0190615abe565b50865161419090600283019060208a0190615b1f565b5085516141a69060038301906020890190615b5a565b5084516141bc9060048301906020880190615bac565b50600981018390555b505050505050505050565b6060600082516001600160401b038111156141ed576141ed615d23565b60405190808252806020026020018201604052801561422057816020015b606081526020019060019003908161420b5790505b50905060005b81518110156142fa57848181518110614241576142416168cf565b6020026020010151516000146142b157848181518110614263576142636168cf565b602002602001015180519060200120848281518110614284576142846168cf565b602002602001015160405160200161429d929190616c68565b6040516020818303038152906040526142cc565b8381815181106142c3576142c36168cf565b60200260200101515b8282815181106142de576142de6168cf565b6020026020010181905250806142f3906168fb565b9050614226565b509392505050565b600063288ace0360e11b6318df743f60e31b63bf26d89760e01b6379dd796f60e01b6001600160e01b0319861682148061434857506001600160e01b0319868116908216145b8061435f57506001600160e01b0319868116908516145b8061437a57506001600160e01b03198616630271189760e51b145b80611b5857506301ffc9a760e01b6001600160e01b03198716149695505050505050565b6000610ef0615019565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156143df5750600090506003614463565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614433573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661445c57600060019250925050614463565b9150600090505b94509492505050565b6000816004811115614480576144806162eb565b036144885750565b600181600481111561449c5761449c6162eb565b036144e95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610453565b60028160048111156144fd576144fd6162eb565b0361454a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610453565b600381600481111561455e5761455e6162eb565b036111d15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610453565b6000806145c6878787878761508d565b600088815261029060205260409020549091506001600160401b03161580156145f357506145f3876151e3565b15611b5857600061460d61028f546001600160401b031690565b614615611fdf565b65ffffffffffff166146279190616c99565b90506146328861290c565b816001600160401b03161115614681576040516001600160401b038216815288907f541f725fb9f7c98a30cc9c0ff32fbb14358cd7159c847a3aa20a2bdc442ba5119060200160405180910390a25b600088815261029060205260409020805467ffffffffffffffff19166001600160401b03929092169190911790559695505050505050565b60006001600160e01b038211156139335760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610453565b600080614730858585615223565b915091505b935093915050565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61022b5460405163e38335e560e01b81526001600160a01b039091169063e38335e59034906147b5908890889088906000908990600401616b26565b6000604051808303818588803b1580156147ce57600080fd5b505af11580156147e2573d6000803e3d6000fd5b50505050505050505050565b600081815261016360205260408120600281015460ff16156148135750600792915050565b6002810154610100900460ff161561482e5750600292915050565b600083815261016360205260408120546001600160401b0316908190036148975760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c2069640000006044820152606401610453565b60006148a1611fdf565b65ffffffffffff1690508082106148bd57506000949350505050565b60006148c88661290c565b90508181106148dd5750600195945050505050565b6148e6866151e3565b8015614909575060008681526101c6602052604090206006810154600590910154115b1561491a5750600495945050505050565b50600395945050505050565b6000611349858585856153c2565b60008160000361494657506000919050565b6000600161495384615478565b901c6001901b9050600181848161496c5761496c6169fb565b048201901c90506001818481614984576149846169fb565b048201901c9050600181848161499c5761499c6169fb565b048201901c905060018184816149b4576149b46169fb565b048201901c905060018184816149cc576149cc6169fb565b048201901c905060018184816149e4576149e46169fb565b048201901c905060018184816149fc576149fc6169fb565b048201901c905061206381828581614a1657614a166169fb565b0461550c565b60005b818310156142fa576000614a33848461551b565b60008781526020902090915063ffffffff86169082015463ffffffff161115614a5e57809250614a6c565b614a69816001616bcc565b93505b50614a1f565b600033614a7f8184615536565b614acb5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73657220726573747269637465640000006044820152606401610453565b6000614ad5611fdf565b65ffffffffffff169050614ae7612900565b614af683610e216001856169e8565b1015614b5e5760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b6064820152608401610453565b6000614b738888888880519060200120612a27565b90508651885114614b965760405162461bcd60e51b815260040161045390616cb9565b8551885114614bb75760405162461bcd60e51b815260040161045390616cb9565b6000885111614c085760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c00000000000000006044820152606401610453565b600081815261016360205260409020546001600160401b031615614c785760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b6064820152608401610453565b6000614c846101945490565b614c8e9084616bcc565b90506000614c9c6101955490565b614ca69083616bcc565b90506040518060e00160405280614cbc84615627565b6001600160401b031681526001600160a01b038716602082015260006040820152606001614ce983615627565b6001600160401b03908116825260006020808401829052604080850183905260609485018390528883526101638252918290208551815492870151878501519186166001600160e01b031990941693909317600160401b6001600160a01b039094168402176001600160e01b0316600160e01b60e09290921c91909102178155938501516080860151908416921c0217600183015560a08301516002909201805460c09094015161ffff1990941692151561ff00191692909217610100931515939093029290921790558a517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e091859188918e918e91811115614dee57614dee615d23565b604051908082528060200260200182016040528015614e2157816020015b6060815260200190600190039081614e0c5790505b508d88888f604051614e3b99989796959493929190616cfa565b60405180910390a1509098975050505050505050565b600054610100900460ff16614e785760405162461bcd60e51b815260040161045390616c01565b609a614e848382616dd8565b50609b614e918282616dd8565b50506000609881905560995550565b600054610100900460ff16614ec75760405162461bcd60e51b815260040161045390616c01565b610162614ed48282616dd8565b5050565b600054610100900460ff16614eff5760405162461bcd60e51b815260040161045390616c01565b614f08836139ea565b614f1182613efd565b613bc981613fa0565b600054610100900460ff16614f415760405162461bcd60e51b815260040161045390616c01565b6101f880546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166121165760405162461bcd60e51b815260040161045390616c01565b600054610100900460ff166111c85760405162461bcd60e51b815260040161045390616c01565b600054610100900460ff16612ae05760405162461bcd60e51b815260040161045390616c01565b6000818311614fe85781612063565b5090919050565b815115614fff5781518083602001fd5b8060405162461bcd60e51b81526004016104539190615edc565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61504461568f565b61504c6156e8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008581526101636020526040812060016150a788611773565b60078111156150b8576150b86162eb565b146151115760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b6064820152608401610453565b805460009061512b9088906001600160401b031686613d8d565b905061513a8888888488615719565b835160000361518f57866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516151829493929190616e97565b60405180910390a2611768565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516151d0959493929190616ebf565b60405180910390a2979650505050505050565b60008181526101c660205260408120600581015461521a610ea285600090815261016360205260409020546001600160401b031690565b11159392505050565b825460009081908015615369576000615241876139b96001856169e8565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090871610156152c25760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606401610453565b805163ffffffff80881691160361530a57846152e3886139b96001866169e8565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055615359565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b6020015192508391506147359050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b029190931617920191909155905081614735565b6000806153d1868686866158b7565b600081815261022c6020526040902054909150156113495761022b54600082815261022c60205260409081902054905163c4d252f560e01b81526001600160a01b039092169163c4d252f59161542d9160040190815260200190565b600060405180830381600087803b15801561544757600080fd5b505af115801561545b573d6000803e3d6000fd5b505050600082815261022c60205260408120555095945050505050565b600080608083901c1561548d57608092831c92015b604083901c1561549f57604092831c92015b602083901c156154b157602092831c92015b601083901c156154c357601092831c92015b600883901c156154d557600892831c92015b600483901c156154e757600492831c92015b600283901c156154f957600292831c92015b600183901c15610fbb5760010192915050565b6000818310614fe85781612063565b600061552a6002848418616a11565b61206390848416616bcc565b8051600090603481101561554e576001915050610fbb565b82810160131901516001600160a01b031981166b046e0e4dee0dee6cae47a60f60a31b1461558157600192505050610fbb565b60008061558f6028856169e8565b90505b83811015615606576000806155c68884815181106155b2576155b26168cf565b01602001516001600160f81b0319166159c4565b91509150816155de5760019650505050505050610fbb565b8060ff166004856001600160a01b0316901b1793505050806155ff906168fb565b9050615592565b50856001600160a01b0316816001600160a01b031614935050505092915050565b60006001600160401b038211156139335760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401610453565b60008061569a613d08565b8051909150156156b1578051602090910120919050565b60985480156156c05792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806156f3613d17565b80519091501561570a578051602090910120919050565b60995480156156c05792915050565b60008581526101c6602090815260408083206001600160a01b038816845260088101909252909120805460ff16156157a95760405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20766f746560448201526c08185b1c9958591e4818d85cdd609a1b6064820152608401610453565b805460ff86166101000261ffff199091161760011781556157c984615a56565b81546001600160601b039190911662010000026dffffffffffffffffffffffff00001990911617815560ff8516615819578382600601600082825461580e9190616bcc565b90915550612a1e9050565b60001960ff861601615839578382600501600082825461580e9190616bcc565b60011960ff861601615859578382600701600082825461580e9190616bcc565b60405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20696e766160448201526c6c696420766f7465207479706560981b6064820152608401610453565b6000806158c686868686612a27565b905060006158d382611773565b905060028160078111156158e9576158e96162eb565b1415801561590957506006816007811115615906576159066162eb565b14155b801561592757506007816007811115615924576159246162eb565b14155b6159735760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74206163746976650000006044820152606401610453565b6000828152610163602052604090819020600201805461ff001916610100179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906132329084815260200190565b60008060f883901c602f811180156159df5750603a8160ff16105b156159f457600194602f199091019350915050565b8060ff166040108015615a0a575060478160ff16105b15615a1f576001946036199091019350915050565b8060ff166060108015615a35575060678160ff16105b15615a4a576001946056199091019350915050565b50600093849350915050565b60006001600160601b038211156139335760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401610453565b828054828255906000526020600020908101928215615b13579160200282015b82811115615b1357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615ade565b50613933929150615bfe565b828054828255906000526020600020908101928215615b13579160200282015b82811115615b13578251825591602001919060010190615b3f565b828054828255906000526020600020908101928215615ba0579160200282015b82811115615ba05782518290615b909082616dd8565b5091602001919060010190615b7a565b50613933929150615c13565b828054828255906000526020600020908101928215615bf2579160200282015b82811115615bf25782518290615be29082616dd8565b5091602001919060010190615bcc565b50613933929150615c30565b5b808211156139335760008155600101615bff565b80821115613933576000615c278282615c4d565b50600101615c13565b80821115613933576000615c448282615c4d565b50600101615c30565b508054615c5990616895565b6000825580601f10615c69575050565b601f0160209004906000526020600020908101906111d19190615bfe565b600060208284031215615c9957600080fd5b5035919050565b600060208284031215615cb257600080fd5b81356001600160e01b03198116811461206357600080fd5b803560ff8116811461195b57600080fd5b60008083601f840112615ced57600080fd5b5081356001600160401b03811115615d0457600080fd5b602083019150836020828501011115615d1c57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615d6157615d61615d23565b604052919050565b60006001600160401b03821115615d8257615d82615d23565b50601f01601f191660200190565b600082601f830112615da157600080fd5b8135615db4615daf82615d69565b615d39565b818152846020838601011115615dc957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b031215615e0257600080fd5b88359750615e1260208a01615cca565b965060408901356001600160401b0380821115615e2e57600080fd5b615e3a8c838d01615cdb565b909850965060608b0135915080821115615e5357600080fd5b50615e608b828c01615d90565b945050615e6f60808a01615cca565b925060a0890135915060c089013590509295985092959890939650565b60005b83811015615ea7578181015183820152602001615e8f565b50506000910152565b60008151808452615ec8816020860160208601615e8c565b601f01601f19169290920160200192915050565b6020815260006120636020830184615eb0565b6001600160a01b03811681146111d157600080fd5b60008060008060808587031215615f1a57600080fd5b8435615f2581615eef565b93506020850135615f3581615eef565b92506040850135915060608501356001600160401b03811115615f5757600080fd5b615f6387828801615d90565b91505092959194509250565b60006001600160401b03821115615f8857615f88615d23565b5060051b60200190565b600082601f830112615fa357600080fd5b81356020615fb3615daf83615f6f565b82815260059290921b84018101918181019086841115615fd257600080fd5b8286015b84811015615ff6578035615fe981615eef565b8352918301918301615fd6565b509695505050505050565b600082601f83011261601257600080fd5b81356020616022615daf83615f6f565b82815260059290921b8401810191818101908684111561604157600080fd5b8286015b84811015615ff65780358352918301918301616045565b600082601f83011261606d57600080fd5b8135602061607d615daf83615f6f565b82815260059290921b8401810191818101908684111561609c57600080fd5b8286015b84811015615ff65780356001600160401b038111156160bf5760008081fd5b6160cd8986838b0101615d90565b8452509183019183016160a0565b600080600080608085870312156160f157600080fd5b84356001600160401b038082111561610857600080fd5b61611488838901615f92565b9550602087013591508082111561612a57600080fd5b61613688838901616001565b9450604087013591508082111561614c57600080fd5b506161598782880161605c565b949793965093946060013593505050565b60006020828403121561617c57600080fd5b813561206381615eef565b600081518084526020808501945080840160005b838110156161c05781516001600160a01b03168752958201959082019060010161619b565b509495945050505050565b600081518084526020808501945080840160005b838110156161c0578151875295820195908201906001016161df565b600081518084526020808501808196508360051b8101915082860160005b85811015616243578284038952616231848351615eb0565b98850198935090840190600101616219565b5091979650505050505050565b6080815260006162636080830187616187565b828103602084015261627581876161cb565b9050828103604084015261628981866161fb565b9050828103606084015261176881856161fb565b600080600080600060a086880312156162b557600080fd5b853594506162c560208701615cca565b93506162d360408701615cca565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061632357634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561633c57600080fd5b82359150602083013561634e81615eef565b809150509250929050565b6000806040838503121561636c57600080fd5b8235915061637c60208401615cca565b90509250929050565b60008060008060006080868803121561639d57600080fd5b853594506163ad60208701615cca565b935060408601356001600160401b03808211156163c957600080fd5b6163d589838a01615cdb565b909550935060608801359150808211156163ee57600080fd5b506163fb88828901615d90565b9150509295509295909350565b6000806000806060858703121561641e57600080fd5b8435935061642e60208601615cca565b925060408501356001600160401b0381111561644957600080fd5b61645587828801615cdb565b95989497509550505050565b6000806000806080858703121561647757600080fd5b84356001600160401b038082111561648e57600080fd5b61649a88838901615f92565b955060208701359150808211156164b057600080fd5b6164bc88838901616001565b945060408701359150808211156164d257600080fd5b6164de8883890161605c565b935060608701359150808211156164f457600080fd5b50615f6387828801615d90565b60ff60f81b8816815260e06020820152600061652060e0830189615eb0565b82810360408401526165328189615eb0565b606084018890526001600160a01b038716608085015260a0840186905283810360c085015290506110ab81856161cb565b60008060006060848603121561657857600080fd5b833561658381615eef565b92506020840135915060408401356001600160401b038111156165a557600080fd5b6165b186828701615d90565b9150509250925092565b600080600080604085870312156165d157600080fd5b84356001600160401b03808211156165e857600080fd5b6165f488838901615cdb565b9096509450602087013591508082111561660d57600080fd5b5061645587828801615cdb565b600080600080600060a0868803121561663257600080fd5b853561663d81615eef565b9450602086013561664d81615eef565b935060408601356001600160401b038082111561666957600080fd5b61667589838a01616001565b9450606088013591508082111561668b57600080fd5b61669789838a01616001565b935060808801359150808211156163ee57600080fd5b600080600080606085870312156166c357600080fd5b84356166ce81615eef565b93506020850135925060408501356001600160401b0381111561644957600080fd5b60006020828403121561670257600080fd5b81356001600160401b038116811461206357600080fd5b600080600080600060a0868803121561673157600080fd5b85356001600160401b038082111561674857600080fd5b61675489838a01615f92565b9650602088013591508082111561676a57600080fd5b61677689838a01616001565b9550604088013591508082111561678c57600080fd5b61679889838a0161605c565b945060608801359150808211156167ae57600080fd5b61669789838a0161605c565b600080604083850312156167cd57600080fd5b82356167d881615eef565b946020939093013593505050565b600080600080600060a086880312156167fe57600080fd5b853561680981615eef565b9450602086013561681981615eef565b9350604086013592506060860135915060808601356001600160401b0381111561684257600080fd5b6163fb88828901615d90565b8183823760009101908152919050565b60208082526018908201527f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000604082015260600190565b600181811c908216806168a957607f821691505b6020821081036168c957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161690d5761690d6168e5565b5060010190565b65ffffffffffff828116828216039080821115616933576169336168e5565b5092915050565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b60006020828403121561698d57600080fd5b81516001600160401b038111156169a357600080fd5b8201601f810184136169b457600080fd5b80516169c2615daf82615d69565b8181528560208385010111156169d757600080fd5b611349826020830160208601615e8c565b81810381811115610fbb57610fbb6168e5565b634e487b7160e01b600052601260045260246000fd5b600082616a2e57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215616a4557600080fd5b815165ffffffffffff8116811461206357600080fd5b600060208284031215616a6d57600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000616ab1604083018688616a74565b8281036020840152611768818587616a74565b608081526000616ad76080830187616187565b8281036020840152616ae981876161cb565b90508281036040840152616afd81866161fb565b91505082606083015295945050505050565b8082028115828204841417610fbb57610fbb6168e5565b60a081526000616b3960a0830188616187565b8281036020840152616b4b81886161cb565b90508281036040840152616b5f81876161fb565b60608401959095525050608001529392505050565b60c081526000616b8760c0830189616187565b8281036020840152616b9981896161cb565b90508281036040840152616bad81886161fb565b60608401969096525050608081019290925260a0909101529392505050565b80820180821115610fbb57610fbb6168e5565b600060208284031215616bf157600080fd5b8151801515811461206357600080fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251616c5e818460208701615e8c565b9190910192915050565b6001600160e01b0319831681528151600090616c8b816004850160208701615e8c565b919091016004019392505050565b6001600160401b03818116838216019080821115616933576169336168e5565b60208082526021908201527f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e67746040820152600d60fb1b606082015260800190565b8981526001600160a01b038916602082015261012060408201819052600090616d258382018b616187565b90508281036060840152616d39818a6161cb565b90508281036080840152616d4d81896161fb565b905082810360a0840152616d6181886161fb565b90508560c08401528460e0840152828103610100840152616d828185615eb0565b9c9b505050505050505050505050565b601f821115613bc957600081815260208120601f850160051c81016020861015616db95750805b601f850160051c820191505b818110156117a157828155600101616dc5565b81516001600160401b03811115616df157616df1615d23565b616e0581616dff8454616895565b84616d92565b602080601f831160018114616e3a5760008415616e225750858301515b600019600386901b1c1916600185901b1785556117a1565b600085815260208120601f198616915b82811015616e6957888601518255948401946001909101908401616e4a565b5085821015616e875787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b84815260ff84166020820152826040820152608060608201526000611b586080830184615eb0565b85815260ff8516602082015283604082015260a060608201526000616ee760a0830185615eb0565b8281036080840152611c718185615eb056fe476f7665726e6f723a2072656c617920726576657274656420776974686f7574206d657373616765a164736f6c6343000811000a", }, { ContractAddr: common.HexToAddress(GovTokenContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "608060405234801561001057600080fd5b50600436106102065760003560e01c806370a082311161011a5780639ab24eb0116100ad578063d505accf1161007c578063d505accf1461049d578063dd62ed3e146104b0578063e5ed5b1e146104c3578063f1127ed8146104d6578063f1fad1041461051357600080fd5b80639ab24eb014610451578063a457c2d714610464578063a9059cbb14610477578063c3cda5201461048a57600080fd5b806384b0196e116100e957806384b0196e146103fc5780638e539e8c1461041757806391ddadf41461042a57806395d89b411461044957600080fd5b806370a08231146103aa57806379cc6790146103d35780637ecebe00146103e15780638129fc1c146103f457600080fd5b8063395093511161019d5780634bf5d7e91161016c5780634bf5d7e91461031b5780634bf6c88214610323578063587cde1e1461032b5780635c19a95c1461036f5780636fcfff451461038257600080fd5b806339509351146102cf5780633a46b1a8146102e257806342966c68146102f5578063448407751461030857600080fd5b806323b872dd116101d957806323b872dd1461028a5780633041949b1461029d578063313ce567146102b25780633644e515146102c757600080fd5b8063039c91fc1461020b57806306fdde031461024a578063095ea7b31461025f57806318160ddd14610282575b600080fd5b6102376102193660046120c7565b61013060209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61025261051b565b6040516102419190612140565b61027261026d366004612153565b6105ad565b6040519015158152602001610241565b603554610237565b61027261029836600461217d565b6105c7565b6102b06102ab3660046120c7565b6105eb565b005b60125b60405160ff9091168152602001610241565b610237610624565b6102726102dd366004612153565b610633565b6102376102f0366004612153565b610655565b6102b06103033660046121b9565b6106da565b6102b06103163660046121d2565b6106f3565b61025261076c565b6102b5600881565b610357610339366004612256565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b039091168152602001610241565b6102b061037d366004612256565b610804565b610395610390366004612256565b610811565b60405163ffffffff9091168152602001610241565b6102376103b8366004612256565b6001600160a01b031660009081526033602052604090205490565b6102b0610303366004612153565b6102376103ef366004612256565b610833565b6102b0610851565b610404610a31565b6040516102419796959493929190612271565b6102376104253660046121b9565b610acf565b610432610b37565b60405165ffffffffffff9091168152602001610241565b610252610b42565b61023761045f366004612256565b610b51565b610272610472366004612153565b610bd3565b610272610485366004612153565b610c4e565b6102b0610498366004612318565b610c5c565b6102b06104ab366004612370565b610d92565b6102376104be3660046120c7565b610ef6565b6102b06104d13660046120c7565b610f21565b6104e96104e43660046123da565b610f51565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610241565b6102b5601181565b60606036805461052a9061241a565b80601f01602080910402602001604051908101604052809291908181526020018280546105569061241a565b80156105a35780601f10610578576101008083540402835291602001916105a3565b820191906000526020600020905b81548152906001019060200180831161058657829003601f168201915b5050505050905090565b6000336105bb818585610fd5565b60019150505b92915050565b6000336105d5858285610fee565b6105e0858585611068565b506001949350505050565b336120021461061657604051630f22c43960e41b815261200260048201526024015b60405180910390fd5b6106208282611081565b5050565b600061062e6111b1565b905090565b6000336105bb8185856106468383610ef6565b6106509190612464565b610fd5565b600061065f610b37565b65ffffffffffff1682106106b15760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b604482015260640161060d565b6001600160a01b038316600090815260ff602052604090206106d390836111bb565b9392505050565b60405163e5d8776760e01b815260040160405180910390fd5b336120021461071957604051630f22c43960e41b8152612002600482015260240161060d565b8160005b818110156107655761075585858381811061073a5761073a612477565b905060200201602081019061074f9190612256565b84611081565b61075e8161248d565b905061071d565b5050505050565b606043610777610b37565b65ffffffffffff16146107cc5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f6465000000604482015260640161060d565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b61080e33826112a4565b50565b6001600160a01b038116600090815260ff60205260408120546105c19061131e565b6001600160a01b038116600090815260cb60205260408120546105c1565b600054610100900460ff16158080156108715750600054600160ff909116105b8061088b5750303b15801561088b575060005460ff166001145b6108ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161060d565b6000805460ff191660011790558015610911576000805461ff0019166101001790555b3341146109315760405163022d8c9560e31b815260040160405180910390fd5b3a15610950576040516383f1b1d360e01b815260040160405180910390fd5b6109a4604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506040518060400160405280600681526020016533b7bb21272160d11b815250611387565b6109ac6113b8565b6109e1604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506113e1565b6109e96113b8565b801561080e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000606080600080600060606097546000801b148015610a515750609854155b610a955760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b604482015260640161060d565b610a9d61142b565b610aa561143a565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610ad9610b37565b65ffffffffffff168210610b2b5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b604482015260640161060d565b6105c1610100836111bb565b600061062e43611449565b60606037805461052a9061241a565b6001600160a01b038116600090815260ff60205260408120548015610bc0576001600160a01b038316600090815260ff6020526040902080546000198301908110610b9e57610b9e612477565b60009182526020909120015464010000000090046001600160e01b0316610bc3565b60005b6001600160e01b03169392505050565b60003381610be18286610ef6565b905083811015610c415760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161060d565b6105e08286868403610fd5565b6000336105bb818585611068565b83421115610cac5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161060d565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610d2690610d1e9060a001604051602081830303815290604052805190602001206114b0565b8585856114dd565b9050610d3181611505565b8614610d7f5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161060d565b610d8981886112a4565b50505050505050565b83421115610de25760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161060d565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e118c611505565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610e6c826114b0565b90506000610e7c828787876114dd565b9050896001600160a01b0316816001600160a01b031614610edf5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161060d565b610eea8a8a8a610fd5565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3361200214610f4757604051630f22c43960e41b8152612002600482015260240161060d565b61062082826112a4565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff8416908110610f9557610f95612477565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b604051632028747160e01b815260040160405180910390fd5b6000610ffa8484610ef6565b9050600019811461106257818110156110555760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161060d565b6110628484848403610fd5565b50505050565b604051638cd22d1960e01b815260040160405180910390fd5b604051630913db4760e01b81526001600160a01b03828116600483015260009190841690630913db4790602401602060405180830381865afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef91906124bc565b6001600160a01b03808516600090815261013060209081526040808320938716835292905220549091508181101561116857600061112d82846124d5565b6001600160a01b038087166000908152610130602090815260408083209389168352929052208490559050611162848261152d565b50611062565b8181111561106257600061117c83836124d5565b6001600160a01b0380871660009081526101306020908152604080832093891683529290522084905590506107658482611537565b600061062e611541565b8154600090818160058111156112155760006111d6846115b5565b6111e090856124d5565b600088815260209020909150869082015463ffffffff16111561120557809150611213565b611210816001612464565b92505b505b80821015611262576000611229838361169d565b600088815260209020909150869082015463ffffffff16111561124e5780915061125c565b611259816001612464565b92505b50611215565b801561128e576000868152602090208101600019015464010000000090046001600160e01b0316611291565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546033845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46110628284836116b8565b600063ffffffff8211156113835760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161060d565b5090565b600054610100900460ff166113ae5760405162461bcd60e51b815260040161060d906124e8565b61062082826117f6565b600054610100900460ff166113df5760405162461bcd60e51b815260040161060d906124e8565b565b600054610100900460ff166114085760405162461bcd60e51b815260040161060d906124e8565b61080e81604051806040016040528060018152602001603160f81b815250611836565b60606099805461052a9061241a565b6060609a805461052a9061241a565b600065ffffffffffff8211156113835760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b606482015260840161060d565b60006105c16114bd6111b1565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006114ee87878787611885565b915091506114fb81611949565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6106208282611a93565b6106208282611b1e565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61156c611b37565b611574611b90565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036115c757506000919050565b600060016115d484611bc1565b901c6001901b905060018184816115ed576115ed612533565b048201901c9050600181848161160557611605612533565b048201901c9050600181848161161d5761161d612533565b048201901c9050600181848161163557611635612533565b048201901c9050600181848161164d5761164d612533565b048201901c9050600181848161166557611665612533565b048201901c9050600181848161167d5761167d612533565b048201901c90506106d38182858161169757611697612533565b04611c55565b60006116ac6002848418612549565b6106d390848416612464565b816001600160a01b0316836001600160a01b0316141580156116da5750600081115b156117f1576001600160a01b03831615611768576001600160a01b038316600090815260ff60205260408120819061171590611c6b85611c77565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161175d929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156117f1576001600160a01b038216600090815260ff60205260408120819061179e90611dec85611c77565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516117e6929190918252602082015260400190565b60405180910390a250505b505050565b600054610100900460ff1661181d5760405162461bcd60e51b815260040161060d906124e8565b603661182983826125b9565b5060376117f182826125b9565b600054610100900460ff1661185d5760405162461bcd60e51b815260040161060d906124e8565b609961186983826125b9565b50609a61187682826125b9565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156118bc5750600090506003611940565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611910573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661193957600060019250925050611940565b9150600090505b94509492505050565b600081600481111561195d5761195d612679565b036119655750565b600181600481111561197957611979612679565b036119c65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161060d565b60028160048111156119da576119da612679565b03611a275760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161060d565b6003816004811115611a3b57611a3b612679565b0361080e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161060d565b611a9d8282611df8565b6035546001600160e01b031015611b0f5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161060d565b611062610100611dec83611c77565b611b288282611ec1565b611062610100611c6b83611c77565b600080611b4261142b565b805190915015611b59578051602090910120919050565b6097548015611b685792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080611b9b61143a565b805190915015611bb2578051602090910120919050565b6098548015611b685792915050565b600080608083901c15611bd657608092831c92015b604083901c15611be857604092831c92015b602083901c15611bfa57602092831c92015b601083901c15611c0c57601092831c92015b600883901c15611c1e57600892831c92015b600483901c15611c3057600492831c92015b600283901c15611c4257600292831c92015b600183901c156105c15760010192915050565b6000818310611c6457816106d3565b5090919050565b60006106d382846124d5565b82546000908190818115611cc45760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611cd9565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350611cf984868863ffffffff16565b9250600082118015611d235750611d0e610b37565b65ffffffffffff16816000015163ffffffff16145b15611d6857611d3183611ffc565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611de2565b866040518060400160405280611d8c611d7f610b37565b65ffffffffffff1661131e565b63ffffffff168152602001611da086611ffc565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b60006106d38284612464565b6001600160a01b038216611e4e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161060d565b8060356000828254611e609190612464565b90915550506001600160a01b0382166000818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361062060008383612065565b6001600160a01b038216611f215760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161060d565b6001600160a01b03821660009081526033602052604090205481811015611f955760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161060d565b6001600160a01b03831660008181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36117f183600084612065565b60006001600160e01b038211156113835760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161060d565b6117f18383836001600160a01b03808416600090815260fe60205260409020546117f191166001600160a01b03808516600090815260fe602052604090205416836116b8565b80356001600160a01b03811681146120c257600080fd5b919050565b600080604083850312156120da57600080fd5b6120e3836120ab565b91506120f1602084016120ab565b90509250929050565b6000815180845260005b8181101561212057602081850181015186830182015201612104565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106d360208301846120fa565b6000806040838503121561216657600080fd5b61216f836120ab565b946020939093013593505050565b60008060006060848603121561219257600080fd5b61219b846120ab565b92506121a9602085016120ab565b9150604084013590509250925092565b6000602082840312156121cb57600080fd5b5035919050565b6000806000604084860312156121e757600080fd5b833567ffffffffffffffff808211156121ff57600080fd5b818601915086601f83011261221357600080fd5b81358181111561222257600080fd5b8760208260051b850101111561223757600080fd5b60209283019550935061224d91860190506120ab565b90509250925092565b60006020828403121561226857600080fd5b6106d3826120ab565b60ff60f81b881681526000602060e08184015261229160e084018a6120fa565b83810360408501526122a3818a6120fa565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156122f5578351835292840192918401916001016122d9565b50909c9b505050505050505050505050565b803560ff811681146120c257600080fd5b60008060008060008060c0878903121561233157600080fd5b61233a876120ab565b9550602087013594506040870135935061235660608801612307565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561238b57600080fd5b612394886120ab565b96506123a2602089016120ab565b955060408801359450606088013593506123be60808901612307565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156123ed57600080fd5b6123f6836120ab565b9150602083013563ffffffff8116811461240f57600080fd5b809150509250929050565b600181811c9082168061242e57607f821691505b60208210810361152757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156105c1576105c161244e565b634e487b7160e01b600052603260045260246000fd5b60006001820161249f5761249f61244e565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156124ce57600080fd5b5051919050565b818103818111156105c1576105c161244e565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261256657634e487b7160e01b600052601260045260246000fd5b500490565b601f8211156117f157600081815260208120601f850160051c810160208610156125925750805b601f850160051c820191505b818110156125b15782815560010161259e565b505050505050565b815167ffffffffffffffff8111156125d3576125d36124a6565b6125e7816125e1845461241a565b8461256b565b602080601f83116001811461261c57600084156126045750858301515b600019600386901b1c1916600185901b1785556125b1565b600085815260208120601f198616915b8281101561264b5788860151825594840194600190910190840161262c565b50858210156126695787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea164736f6c6343000811000a", }, { ContractAddr: common.HexToAddress(TimelockContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "6080604052600436106101e75760003560e01c80638129fc1c11610102578063bc197c8111610095578063e38335e511610064578063e38335e5146105e1578063f1fad104146105f4578063f23a6e6114610609578063f27a0c921461063557600080fd5b8063bc197c8114610548578063c4d252f514610574578063d45c443514610594578063d547741f146105c157600080fd5b8063a217fddf116100d1578063a217fddf146104d1578063ac431751146104e6578063b08e51c014610506578063b1c5f4271461052857600080fd5b80638129fc1c1461045a5780638f2a0bb01461046f5780638f61f4f51461048f57806391d14854146104b157600080fd5b80632ab0f5291161017a5780634bf6c882116101495780634bf6c882146103d3578063584b153e146103fa57806364d623531461041a5780638065657f1461043a57600080fd5b80632ab0f529146103435780632f2ff15d1461037357806331d507501461039357806336568abe146103b357600080fd5b8063134008d3116101b6578063134008d31461029c57806313bc9f20146102af578063150b7a02146102cf578063248a9ca31461031357600080fd5b806301d5062a146101f357806301ffc9a71461021557806307bd02651461024a5780630d3cf6fc1461027a57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004611aa4565b61064a565b005b34801561022157600080fd5b50610235610230366004611b18565b61070e565b60405190151581526020015b60405180910390f35b34801561025657600080fd5b5061026c60008051602061258883398151915281565b604051908152602001610241565b34801561028657600080fd5b5061026c60008051602061254883398151915281565b6102136102aa366004611b42565b610739565b3480156102bb57600080fd5b506102356102ca366004611bad565b6107dc565b3480156102db57600080fd5b506102fa6102ea366004611c7b565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610241565b34801561031f57600080fd5b5061026c61032e366004611bad565b60009081526065602052604090206001015490565b34801561034f57600080fd5b5061023561035e366004611bad565b60009081526097602052604090205460011490565b34801561037f57600080fd5b5061021361038e366004611ce2565b610802565b34801561039f57600080fd5b506102356103ae366004611bad565b61082c565b3480156103bf57600080fd5b506102136103ce366004611ce2565b610845565b3480156103df57600080fd5b506103e8600881565b60405160ff9091168152602001610241565b34801561040657600080fd5b50610235610415366004611bad565b6108c8565b34801561042657600080fd5b50610213610435366004611bad565b6108df565b34801561044657600080fd5b5061026c610455366004611b42565b610983565b34801561046657600080fd5b506102136109c2565b34801561047b57600080fd5b5061021361048a366004611d52565b610b72565b34801561049b57600080fd5b5061026c60008051602061256883398151915281565b3480156104bd57600080fd5b506102356104cc366004611ce2565b610cf3565b3480156104dd57600080fd5b5061026c600081565b3480156104f257600080fd5b50610213610501366004611e03565b610d1e565b34801561051257600080fd5b5061026c6000805160206125a883398151915281565b34801561053457600080fd5b5061026c610543366004611e6e565b610f08565b34801561055457600080fd5b506102fa610563366004611f95565b63bc197c8160e01b95945050505050565b34801561058057600080fd5b5061021361058f366004611bad565b610f4d565b3480156105a057600080fd5b5061026c6105af366004611bad565b60009081526097602052604090205490565b3480156105cd57600080fd5b506102136105dc366004611ce2565b611010565b6102136105ef366004611e6e565b611035565b34801561060057600080fd5b506103e8601181565b34801561061557600080fd5b506102fa61062436600461203e565b63f23a6e6160e01b95945050505050565b34801561064157600080fd5b5060985461026c565b600080516020612568833981519152610662816111ad565b6000610672898989898989610983565b905061067e81846111b7565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516106ba969594939291906120cb565b60405180910390a3831561070357807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516106fa91815260200190565b60405180910390a25b505050505050505050565b60006001600160e01b03198216630271189760e51b14806107335750610733826112a6565b92915050565b600080516020612588833981519152610753816000610cf3565b6107615761076181336112db565b6000610771888888888888610983565b905061077d8185611334565b610789888888886113cf565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516107c19493929190612108565b60405180910390a36107d2816114a2565b5050505050505050565b6000818152609760205260408120546001811180156107fb5750428111155b9392505050565b60008281526065602052604090206001015461081d816111ad565b61082783836114db565b505050565b60008181526097602052604081205481905b1192915050565b6001600160a01b03811633146108ba5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108c48282611561565b5050565b60008181526097602052604081205460019061083e565b3330146109425760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b60648201526084016108b1565b60985460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1609855565b60008686868686866040516020016109a0969594939291906120cb565b6040516020818303038152906040528051906020012090509695505050505050565b600054610100900460ff16158080156109e25750600054600160ff909116105b806109fc5750303b1580156109fc575060005460ff166001145b610a5f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108b1565b6000805460ff191660011790558015610a82576000805461ff0019166101001790555b334114610aa25760405163022d8c9560e31b815260040160405180910390fd5b3a15610ac1576040516383f1b1d360e01b815260040160405180910390fd5b6040805160018082528183019092526000916020808301908036833701905050905061200481600081518110610af957610af961213a565b60200260200101906001600160a01b031690816001600160a01b031681525050610b28603c82836120046115c8565b508015610b6f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b600080516020612568833981519152610b8a816111ad565b888714610ba95760405162461bcd60e51b81526004016108b190612150565b888514610bc85760405162461bcd60e51b81526004016108b190612150565b6000610bda8b8b8b8b8b8b8b8b610f08565b9050610be681846111b7565b60005b8a811015610ca45780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c2657610c2661213a565b9050602002016020810190610c3b9190612193565b8d8d86818110610c4d57610c4d61213a565b905060200201358c8c87818110610c6657610c6661213a565b9050602002810190610c7891906121ae565b8c8b604051610c8c969594939291906120cb565b60405180910390a3610c9d8161220a565b9050610be9565b508315610ce657807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610cdd91815260200190565b60405180910390a25b5050505050505050505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3361100714610d4457604051630f22c43960e41b815261100760048201526024016108b1565b610da7604051806040016040528060088152602001676d696e44656c617960c01b81525085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506116019050565b15610ea45760208114610dd55783838383604051630a5a604160e01b81526004016108b19493929190612223565b604080516020601f8401819004810282018101909252828152600091610e1691858580838501838280828437600092019190915250929392505061165a9050565b9050801580610e2757506212750081115b15610e4d5784848484604051630a5a604160e01b81526004016108b19493929190612223565b6040516364d6235360e01b81526004810182905230906364d6235390602401600060405180830381600087803b158015610e8657600080fd5b505af1158015610e9a573d6000803e3d6000fd5b5050505050610ec5565b838383836040516325ee20d560e21b81526004016108b19493929190612223565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610efa9493929190612223565b60405180910390a150505050565b60008888888888888888604051602001610f299897969594939291906122d8565b60405160208183030381529060405280519060200120905098975050505050505050565b6000805160206125a8833981519152610f65816111ad565b610f6e826108c8565b610fd45760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b60648201526084016108b1565b6000828152609760205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b60008281526065602052604090206001015461102b816111ad565b6108278383611561565b60008051602061258883398151915261104f816000610cf3565b61105d5761105d81336112db565b87861461107c5760405162461bcd60e51b81526004016108b190612150565b87841461109b5760405162461bcd60e51b81526004016108b190612150565b60006110ad8a8a8a8a8a8a8a8a610f08565b90506110b98185611334565b60005b898110156111975760008b8b838181106110d8576110d861213a565b90506020020160208101906110ed9190612193565b905060008a8a848181106111035761110361213a565b9050602002013590503660008a8a868181106111215761112161213a565b905060200281019061113391906121ae565b91509150611143848484846113cf565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161117a9493929190612108565b60405180910390a350505050806111909061220a565b90506110bc565b506111a1816114a2565b50505050505050505050565b610b6f81336112db565b6111c08261082c565b156112255760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b60648201526084016108b1565b6098548110156112865760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b60648201526084016108b1565b6112908142612379565b6000928352609760205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061073357506301ffc9a760e01b6001600160e01b0319831614610733565b6112e58282610cf3565b6108c4576112f28161165f565b6112fd836020611671565b60405160200161130e9291906123b0565b60408051601f198184030181529082905262461bcd60e51b82526108b191600401612425565b61133d826107dc565b6113595760405162461bcd60e51b81526004016108b190612458565b80158061137457506000818152609760205260409020546001145b6108c45760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b60648201526084016108b1565b6000846001600160a01b03168484846040516113ec9291906124a2565b60006040518083038185875af1925050503d8060008114611429576040519150601f19603f3d011682016040523d82523d6000602084013e61142e565b606091505b505090508061149b5760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b60648201526084016108b1565b5050505050565b6114ab816107dc565b6114c75760405162461bcd60e51b81526004016108b190612458565b600090815260976020526040902060019055565b6114e58282610cf3565b6108c45760008281526065602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561151d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61156b8282610cf3565b156108c45760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166115ef5760405162461bcd60e51b81526004016108b1906124b2565b6115fb8484848461180c565b50505050565b60008160405160200161161491906124fd565b604051602081830303815290604052805190602001208360405160200161163b91906124fd565b6040516020818303038152906040528051906020012014905092915050565b015190565b60606107336001600160a01b03831660145b60606000611680836002612519565b61168b906002612379565b6001600160401b038111156116a2576116a2611bc6565b6040519080825280601f01601f1916602001820160405280156116cc576020820181803683370190505b509050600360fc1b816000815181106116e7576116e761213a565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117165761171661213a565b60200101906001600160f81b031916908160001a905350600061173a846002612519565b611745906001612379565b90505b60018111156117bd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106117795761177961213a565b1a60f81b82828151811061178f5761178f61213a565b60200101906001600160f81b031916908160001a90535060049490941c936117b681612530565b9050611748565b5083156107fb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108b1565b600054610100900460ff166118335760405162461bcd60e51b81526004016108b1906124b2565b61184b600080516020612548833981519152806119eb565b6118716000805160206125688339815191526000805160206125488339815191526119eb565b6118976000805160206125888339815191526000805160206125488339815191526119eb565b6118bd6000805160206125a88339815191526000805160206125488339815191526119eb565b6118d560008051602061254883398151915230611a36565b6001600160a01b038116156118fc576118fc60008051602061254883398151915282611a36565b60005b835181101561196d5761193960008051602061256883398151915285838151811061192c5761192c61213a565b6020026020010151611a36565b61195d6000805160206125a883398151915285838151811061192c5761192c61213a565b6119668161220a565b90506118ff565b5060005b82518110156119ae5761199e60008051602061258883398151915284838151811061192c5761192c61213a565b6119a78161220a565b9050611971565b5060988490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d59101610efa565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6108c482826114db565b80356001600160a01b0381168114611a5757600080fd5b919050565b60008083601f840112611a6e57600080fd5b5081356001600160401b03811115611a8557600080fd5b602083019150836020828501011115611a9d57600080fd5b9250929050565b600080600080600080600060c0888a031215611abf57600080fd5b611ac888611a40565b96506020880135955060408801356001600160401b03811115611aea57600080fd5b611af68a828b01611a5c565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611b2a57600080fd5b81356001600160e01b0319811681146107fb57600080fd5b60008060008060008060a08789031215611b5b57600080fd5b611b6487611a40565b95506020870135945060408701356001600160401b03811115611b8657600080fd5b611b9289828a01611a5c565b979a9699509760608101359660809091013595509350505050565b600060208284031215611bbf57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c0457611c04611bc6565b604052919050565b600082601f830112611c1d57600080fd5b81356001600160401b03811115611c3657611c36611bc6565b611c49601f8201601f1916602001611bdc565b818152846020838601011115611c5e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611c9157600080fd5b611c9a85611a40565b9350611ca860208601611a40565b92506040850135915060608501356001600160401b03811115611cca57600080fd5b611cd687828801611c0c565b91505092959194509250565b60008060408385031215611cf557600080fd5b82359150611d0560208401611a40565b90509250929050565b60008083601f840112611d2057600080fd5b5081356001600160401b03811115611d3757600080fd5b6020830191508360208260051b8501011115611a9d57600080fd5b600080600080600080600080600060c08a8c031215611d7057600080fd5b89356001600160401b0380821115611d8757600080fd5b611d938d838e01611d0e565b909b50995060208c0135915080821115611dac57600080fd5b611db88d838e01611d0e565b909950975060408c0135915080821115611dd157600080fd5b50611dde8c828d01611d0e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060408587031215611e1957600080fd5b84356001600160401b0380821115611e3057600080fd5b611e3c88838901611a5c565b90965094506020870135915080821115611e5557600080fd5b50611e6287828801611a5c565b95989497509550505050565b60008060008060008060008060a0898b031215611e8a57600080fd5b88356001600160401b0380821115611ea157600080fd5b611ead8c838d01611d0e565b909a50985060208b0135915080821115611ec657600080fd5b611ed28c838d01611d0e565b909850965060408b0135915080821115611eeb57600080fd5b50611ef88b828c01611d0e565b999c989b509699959896976060870135966080013595509350505050565b600082601f830112611f2757600080fd5b813560206001600160401b03821115611f4257611f42611bc6565b8160051b611f51828201611bdc565b9283528481018201928281019087851115611f6b57600080fd5b83870192505b84831015611f8a57823582529183019190830190611f71565b979650505050505050565b600080600080600060a08688031215611fad57600080fd5b611fb686611a40565b9450611fc460208701611a40565b935060408601356001600160401b0380821115611fe057600080fd5b611fec89838a01611f16565b9450606088013591508082111561200257600080fd5b61200e89838a01611f16565b9350608088013591508082111561202457600080fd5b5061203188828901611c0c565b9150509295509295909350565b600080600080600060a0868803121561205657600080fd5b61205f86611a40565b945061206d60208701611a40565b9350604086013592506060860135915060808601356001600160401b0381111561209657600080fd5b61203188828901611c0c565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006120f360a0830186886120a2565b60608301949094525060800152949350505050565b60018060a01b03851681528360208201526060604082015260006121306060830184866120a2565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b6000602082840312156121a557600080fd5b6107fb82611a40565b6000808335601e198436030181126121c557600080fd5b8301803591506001600160401b038211156121df57600080fd5b602001915036819003821315611a9d57600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161221c5761221c6121f4565b5060010190565b6040815260006122376040830186886120a2565b8281036020840152611f8a8185876120a2565b818352600060208085019450848460051b86018460005b878110156122cb5783830389528135601e1988360301811261228257600080fd5b870185810190356001600160401b0381111561229d57600080fd5b8036038213156122ac57600080fd5b6122b78582846120a2565b9a87019a9450505090840190600101612261565b5090979650505050505050565b60a0808252810188905260008960c08301825b8b811015612319576001600160a01b0361230484611a40565b168252602092830192909101906001016122eb565b5083810360208501528881526001600160fb1b0389111561233957600080fd5b8860051b9150818a60208301370182810360209081016040850152612361908201878961224a565b60608401959095525050608001529695505050505050565b80820180821115610733576107336121f4565b60005b838110156123a757818101518382015260200161238f565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516123e881601785016020880161238c565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161241981602884016020880161238c565b01602801949350505050565b602081526000825180602084015261244481604085016020870161238c565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000825161250f81846020870161238c565b9190910192915050565b8082028115828204841417610733576107336121f4565b60008161253f5761253f6121f4565b50600019019056fe5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a164736f6c6343000811000a", }, { ContractAddr: common.HexToAddress(TokenRecoverPortalContract), - CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/9d09d0a3d6332460a810188261ec8195e05aa218", + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", Code: "608060405234801561001057600080fd5b506004361061010b5760003560e01c80638129fc1c116100a2578063b187bd2611610071578063b187bd261461022c578063bfb5a6a114610237578063e33f8d321461024a578063e842426a1461026d578063f1fad1041461029857600080fd5b80638129fc1c146101fc5780638456cb59146102045780639fcb50121461020c578063ac4317511461021957600080fd5b80634a49ac4c116100de5780634a49ac4c1461017c5780634bf6c8821461018f578063572c9980146101a957806374be2150146101bc57600080fd5b8063046f7da2146101105780632eb4a7ab1461011a578063417c73a7146101365780634838d16514610149575b600080fd5b6101186102a0565b005b61012360685481565b6040519081526020015b60405180910390f35b610118610144366004611696565b610328565b61016c610157366004611696565b60346020526000908152604090205460ff1681565b604051901515815260200161012d565b61011861018a366004611696565b6103a4565b610197600881565b60405160ff909116815260200161012d565b6101186101b73660046116b1565b61041d565b6101ef6040518060400160405280601481526020017342696e616e63652d436861696e2d47616e67657360601b81525081565b60405161012d919061172d565b6101186104b3565b610118610613565b60695461016c9060ff1681565b610118610227366004611789565b61069f565b60335460ff1661016c565b61011861024536600461183a565b610abe565b61016c610258366004611914565b6000908152606a602052604090205460ff1690565b606754610280906001600160a01b031681565b6040516001600160a01b03909116815260200161012d565b610197601181565b60335461010090046001600160a01b031633146102d0576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff166102f357604051636cd6020160e01b815260040160405180910390fd5b6033805460ff191690556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f990600090a1565b60335461010090046001600160a01b03163314610358576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19166001179055517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60335461010090046001600160a01b031633146103d4576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260346020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60335461010090046001600160a01b0316331461044d576040516306fbb1e360e01b815260040160405180910390fd5b604051638525db0360e01b8152600481018390526001600160a01b038216602482015261100490638525db0390604401600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505050565b600054610100900460ff16158080156104d35750600054600160ff909116105b806104ed5750303b1580156104ed575060005460ff166001145b6105555760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610578576000805461ff0019166101001790555b3341146105985760405163022d8c9560e31b815260040160405180910390fd5b3a156105b7576040516383f1b1d360e01b815260040160405180910390fd5b6105bf610e1e565b6105ca61dead610e4b565b8015610610576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60335461010090046001600160a01b03163314610643576040516306fbb1e360e01b815260040160405180910390fd5b60335460ff161561066757604051631785c68160e01b815260040160405180910390fd5b6033805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b33611007146106c557604051630f22c43960e41b8152611007600482015260240161054c565b61072f6040518060400160405280600f81526020016e617070726f76616c4164647265737360881b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e9a9050565b156107f9576014811461075d5783838383604051630a5a604160e01b815260040161054c9493929190611956565b60006107a3601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610ef49050565b90506001600160a01b0381166107d45784848484604051630a5a604160e01b815260040161054c9493929190611956565b606780546001600160a01b0319166001600160a01b0392909216919091179055610a7b565b61085e6040518060400160405280600a8152602001691b595c9adb19549bdbdd60b21b81525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e9a9050565b1561092e5760695460ff1615610887576040516379b3306f60e11b815260040160405180910390fd5b602081146108b05783838383604051630a5a604160e01b815260040161054c9493929190611956565b604080516020601f84018190048102820181019092528281526000916108f1918585808385018382808284376000920191909152509293925050610ef49050565b9050806109195784848484604051630a5a604160e01b815260040161054c9493929190611956565b6068556069805460ff19166001179055610a7b565b6109a66040518060400160405280601b81526020017f746f6b656e5265636f766572506f7274616c50726f746563746f72000000000081525085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610e9a9050565b15610a5a57601481146109d45783838383604051630a5a604160e01b815260040161054c9493929190611956565b6000610a1a601484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050610ef49050565b90506001600160a01b038116610a4b5784848484604051630a5a604160e01b815260040161054c9493929190611956565b610a5481610ef9565b50610a7b565b838383836040516325ee20d560e21b815260040161054c9493929190611956565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63384848484604051610ab09493929190611956565b60405180910390a150505050565b60695460ff16610ae15760405163678f619760e11b815260040160405180910390fd5b606854610b015760405163678f619760e11b815260040160405180910390fd5b6067546001600160a01b0316610b2a57604051631a1b977b60e31b815260040160405180910390fd5b60335460ff1615610b4e57604051631785c68160e01b815260040160405180910390fd5b610b56610f60565b6000610be489898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a9081908401838280828437600081840152601f19601f82011690508083019250505050505050610bdf8e8e33610fb9565b6110da565b90506000818c8c604051602001610bfd93929190611988565b604051602081830303815290604052805190602001209050610c2e816000908152606a602052604090205460ff1690565b15610c4b57604051623e493160e81b815260040160405180910390fd5b610cf33389898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a908190840183828082843760009201919091525050604080516020808c0282810182019093528b82528994509092508b918b918291908501908490808284376000920191909152506111b292505050565b610d348484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060685491508490506112bd565b610d51576040516309bde33960e01b815260040160405180910390fd5b6000818152606a602052604090819020805460ff191660011790555163799758b960e01b8152600481018d9052336024820152604481018c90526110049063799758b990606401600060405180830381600087803b158015610db257600080fd5b505af1158015610dc6573d6000803e3d6000fd5b505050507f39cc0b7297a0ef9102d75ebc4919ffec0347d50008c2b865eda4125d5812cb64828d338e604051610dff94939291906119af565b60405180910390a15050610e1260018055565b50505050505050505050565b600054610100900460ff16610e455760405162461bcd60e51b815260040161054c906119e7565b60018055565b600054610100900460ff16610e725760405162461bcd60e51b815260040161054c906119e7565b603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600081604051602001610ead9190611a32565b6040516020818303038152906040528051906020012083604051602001610ed49190611a32565b604051602081830303815290604052805190602001201490505b92915050565b015190565b6033546040516001600160a01b0380841692610100900416907f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b90600090a3603380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600260015403610fb25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054c565b6002600155565b600060026040518060400160405280601481526020017342696e616e63652d436861696e2d47616e67657360601b8152506110168560405160200161100091815260200190565b60405160208183030381529060405260006112d3565b6040516bffffffffffffffffffffffff19606087901b16602082015261104f9060340160405160208183030381529060405260016112d3565b6110658860405160200161100091815260200190565b6040516020016110789493929190611a4e565b60408051601f198184030181529082905261109291611a32565b602060405180830381855afa1580156110af573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110d29190611b7d565b949350505050565b606083516021146110fe57604051638152ea1b60e01b815260040160405180910390fd5b825160401461112057604051635e4bd79760e11b815260040160405180910390fd5b604080516020808252818301909252600091602082018180368337019050509050826020820152600085858360405160200161115e93929190611bac565b60408051808303601f190181526014808452838301909252925060009190602082018180368337019050509050815160146020830182602086016069600019fa6111a757600080fd5b509695505050505050565b606060005b825181101561121057818382815181106111d3576111d3611bef565b60200260200101516040516020016111ec929190611c05565b6040516020818303038152906040529150808061120890611c3d565b9150506111b7565b5060006040518060400160405280601481526020017342696e616e63652d436861696e2d47616e67657360601b8152508787866068548660405160200161125c96959493929190611c56565b60408051601f1981840301815291905280516020909101206067549091506001600160a01b031661128d86836114a5565b6001600160a01b0316146112b4576040516356b00a4f60e11b815260040160405180910390fd5b50505050505050565b6000826112ca858461153f565b14949350505050565b60606000835160026112e59190611cc7565b67ffffffffffffffff8111156112fd576112fd611b96565b6040519080825280601f01601f191660200182016040528015611327576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b855181101561146d5781825187838151811061137357611373611bef565b0160200151611385919060f81c611cf4565b8151811061139557611395611bef565b01602001516001600160f81b031916836113b0836002611cc7565b815181106113c0576113c0611bef565b60200101906001600160f81b031916908160001a9053508182518783815181106113ec576113ec611bef565b01602001516113fe919060f81c611d08565b8151811061140e5761140e611bef565b01602001516001600160f81b03191683611429836002611cc7565b611434906001611d1c565b8151811061144457611444611bef565b60200101906001600160f81b031916908160001a9053508061146581611c3d565b915050611355565b50831561149d57816040516020016114859190611d2f565b60405160208183030381529060405292505050610eee565b509392505050565b600082516041146114c9576040516356b00a4f60e11b815260040160405180910390fd5b60208301516040840151606085015160001a601b8110156114f2576114ef601b82611d59565b90505b601b8160ff1610806115075750601c8160ff16115b15611525576040516356b00a4f60e11b815260040160405180910390fd5b600061153386838686611584565b50979650505050505050565b600081815b845181101561149d576115708286838151811061156357611563611bef565b6020026020010151611648565b91508061157c81611c3d565b915050611544565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115bb575060009050600361163f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561160f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166116385760006001925092505061163f565b9150600090505b94509492505050565b6000818310611664576000828152602084905260409020611673565b60008381526020839052604090205b9392505050565b80356001600160a01b038116811461169157600080fd5b919050565b6000602082840312156116a857600080fd5b6116738261167a565b600080604083850312156116c457600080fd5b823591506116d46020840161167a565b90509250929050565b60005b838110156116f85781810151838201526020016116e0565b50506000910152565b600081518084526117198160208601602086016116dd565b601f01601f19169290920160200192915050565b6020815260006116736020830184611701565b60008083601f84011261175257600080fd5b50813567ffffffffffffffff81111561176a57600080fd5b60208301915083602082850101111561178257600080fd5b9250929050565b6000806000806040858703121561179f57600080fd5b843567ffffffffffffffff808211156117b757600080fd5b6117c388838901611740565b909650945060208701359150808211156117dc57600080fd5b506117e987828801611740565b95989497509550505050565b60008083601f84011261180757600080fd5b50813567ffffffffffffffff81111561181f57600080fd5b6020830191508360208260051b850101111561178257600080fd5b60008060008060008060008060008060c08b8d03121561185957600080fd5b8a35995060208b0135985060408b013567ffffffffffffffff8082111561187f57600080fd5b61188b8e838f01611740565b909a50985060608d01359150808211156118a457600080fd5b6118b08e838f01611740565b909850965060808d01359150808211156118c957600080fd5b6118d58e838f01611740565b909650945060a08d01359150808211156118ee57600080fd5b506118fb8d828e016117f5565b915080935050809150509295989b9194979a5092959850565b60006020828403121561192657600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60408152600061196a60408301868861192d565b828103602084015261197d81858761192d565b979650505050505050565b6000845161199a8184602089016116dd565b91909101928352506020820152604001919050565b6080815260006119c26080830187611701565b6020830195909552506001600160a01b03929092166040830152606090910152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251611a448184602087016116dd565b9190910192915050565b7f7b226163636f756e745f6e756d626572223a2230222c22636861696e5f6964228152611d1160f11b602082015260008551611a91816022850160208a016116dd565b7f222c2264617461223a6e756c6c2c226d656d6f223a22222c226d736773223a5b6022918401918201526a3d9130b6b7bab73a111d1160a91b60428201528551611ae281604d840160208a016116dd565b6e1116113932b1b4b834b2b73a111d1160891b604d92909101918201528451611b1281605c8401602089016116dd565b711116113a37b5b2b72fb9bcb6b137b6111d1160711b605c92909101918201528351611b4581606e8401602088016116dd565b7f227d5d2c2273657175656e6365223a2230222c22736f75726365223a2230227d606e9290910191820152608e019695505050505050565b600060208284031215611b8f57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b60008451611bbe8184602089016116dd565b845190830190611bd28183602089016116dd565b8451910190611be58183602088016116dd565b0195945050505050565b634e487b7160e01b600052603260045260246000fd5b60008351611c178184602088016116dd565b9190910191825250602001919050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c4f57611c4f611c27565b5060010190565b60008751611c68818460208c016116dd565b606088901b6bffffffffffffffffffffffff19169083019081528651611c95816014840160208b016116dd565b0160148101869052603481018590528351611cb78160548401602088016116dd565b0160540198975050505050505050565b8082028115828204841417610eee57610eee611c27565b634e487b7160e01b600052601260045260246000fd5b600082611d0357611d03611cde565b500490565b600082611d1757611d17611cde565b500690565b80820180821115610eee57610eee611c27565b61060f60f31b815260008251611d4c8160028501602087016116dd565b9190910160020192915050565b60ff8181168382160190811115610eee57610eee611c2756fea164736f6c6343000811000a", }, }, } + + // This upgrade is to fix an error on testnet only. So the upgrade config of mainnet is empty. + feynmanFixUpgrade[mainNet] = &Upgrade{ + UpgradeName: "feynmanFix", + Configs: []*UpgradeConfig{}, + } + + feynmanFixUpgrade[chapelNet] = &Upgrade{ + UpgradeName: "feynmanFix", + Configs: []*UpgradeConfig{ + { + ContractAddr: common.HexToAddress(ValidatorContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", + Code: "6080604052600436106104fb5760003560e01c806388b32f111161028c578063c6d339451161015a578063e40716a1116100cc578063f92eb86b11610085578063f92eb86b14610d2d578063f9a2bbc714610d42578063fc3e590814610d57578063fccc281314610d6c578063fd4ad81f14610d81578063fd6a687914610db057610502565b8063e40716a114610c9b578063ea321e4914610cb0578063eb57e20214610cd0578063eda5868c14610cf0578063f1fad10414610d05578063f340fa0114610d1a57610502565b8063d86222d51161011e578063d86222d514610c1d578063daacdb6614610c32578063dc927faf14610c47578063df8079e914610c5c578063e086c7b114610c71578063e1c7392a14610c8657610502565b8063c6d3394514610bbe578063c81b166214610bd3578063c8509d811461098d578063ce910b0c14610be8578063d68fb56a14610c0857610502565b8063a78abc16116101fe578063ad3c9da6116101b7578063ad3c9da614610b3d578063aef198a914610b5d578063b7ab4db514610b72578063b8cf4ef114610b94578063bf9f4995146106fe578063c466689d14610ba957610502565b8063a78abc1614610ab4578063aa82dce114610ac9578063aad5606314610ade578063aaf5eb6814610af3578063ab51bb9614610b08578063ac43175114610b1d57610502565b806396713da91161025057806396713da914610a365780639dc0926214610a4b5780639fe0f81614610a60578063a0dc275814610a75578063a1a11bf514610a8a578063a5422d5c14610a9f57610502565b806388b32f11146109c25780638a7beb01146109d75780638b5ad0c9146109ec5780638d19a41014610a015780639369d7de14610a2157610502565b806351b4dce3116103c957806370fd5bad1161033b5780637e434d54116102f45780637e434d541461094e57806381650b6214610963578063820dcaa814610978578063831d65d11461098d578063853230aa1461090f57806386249882146109ad57610502565b806370fd5bad146108d0578063718a8aa8146108e557806375d47a0a146108fa57806378dfed4a1461090f5780637942fd05146109245780637a84ca2a1461093957610502565b80635d77156c1161038d5780635d77156c1461082a5780635de1e22c1461083f57806360eba4fe1461085457806362b72cf5146108745780636969a25c146108895780636e47b482146108bb57610502565b806351b4dce3146107ab57806351e80672146107c057806355614fcc146107d5578063565c56b3146107f55780635667515a1461081557610502565b8063300c35671161046d57806343756e5c1161042657806343756e5c1461072057806345cf9daf14610735578063493279b11461074a5780634bf6c8821461076c5780634df6e0c3146107815780635192c82c1461079657610502565b8063300c35671461065b578063321d398a1461067b5780633365af3a1461069b57806335409f7f146106bb5780633b071dcc146106db5780633dffc387146106fe57610502565b8063152ad3b8116104bf578063152ad3b8146105ba5780631e4c1524146105dc5780631ff18069146105fc578063219f22d51461061157806328087028146106265780632a0ffb6e1461063b57610502565b806304c4fec61461050757806307a568471461051e5780630bee7a67146105495780630e2374a51461056b5780631182b8751461058d57610502565b3661050257005b600080fd5b34801561051357600080fd5b5061051c610dc5565b005b34801561052a57600080fd5b50610533610e37565b6040516105409190618ed8565b60405180910390f35b34801561055557600080fd5b5061055e610e3d565b6040516105409190618f02565b34801561057757600080fd5b50610580610e42565b60405161054091906181eb565b34801561059957600080fd5b506105ad6105a83660046180d1565b610e48565b604051610540919061837e565b3480156105c657600080fd5b506105cf611165565b6040516105409190618373565b3480156105e857600080fd5b5061051c6105f7366004617edf565b61116e565b34801561060857600080fd5b50610533611844565b34801561061d57600080fd5b5061055e61184a565b34801561063257600080fd5b5061058061184f565b34801561064757600080fd5b5061051c610656366004617e3f565b611855565b34801561066757600080fd5b5061051c610676366004617e77565b611902565b34801561068757600080fd5b506105cf61069636600461807e565b611c4b565b3480156106a757600080fd5b506105cf6106b636600461807e565b611d1a565b3480156106c757600080fd5b5061051c6106d6366004617e3f565b611dcb565b3480156106e757600080fd5b506106f0611f30565b604051610540929190618289565b34801561070a57600080fd5b5061071361220c565b6040516105409190618f13565b34801561072c57600080fd5b50610580612211565b34801561074157600080fd5b50610533612217565b34801561075657600080fd5b5061075f61221d565b6040516105409190618ec9565b34801561077857600080fd5b50610713612222565b34801561078d57600080fd5b506106f0612227565b3480156107a257600080fd5b506105336123b3565b3480156107b757600080fd5b506105806123b9565b3480156107cc57600080fd5b506105806123bf565b3480156107e157600080fd5b506105cf6107f0366004617e3f565b6123c5565b34801561080157600080fd5b50610533610810366004617e3f565b6123fa565b34801561082157600080fd5b5061071361244b565b34801561083657600080fd5b5061055e612450565b34801561084b57600080fd5b50610533612455565b34801561086057600080fd5b506105ad61086f36600461807e565b61245b565b34801561088057600080fd5b50610533612501565b34801561089557600080fd5b506108a96108a436600461807e565b612507565b60405161054096959493929190618218565b3480156108c757600080fd5b5061058061256b565b3480156108dc57600080fd5b50610713612571565b3480156108f157600080fd5b50610713612576565b34801561090657600080fd5b5061058061257b565b34801561091b57600080fd5b50610533612581565b34801561093057600080fd5b50610713612587565b34801561094557600080fd5b5061053361258c565b34801561095a57600080fd5b50610580612592565b34801561096f57600080fd5b5061055e612598565b34801561098457600080fd5b5061053361259d565b34801561099957600080fd5b5061051c6109a83660046180d1565b6125a3565b3480156109b957600080fd5b50610533612604565b3480156109ce57600080fd5b5061053361260a565b3480156109e357600080fd5b506105cf612610565b3480156109f857600080fd5b50610533612619565b348015610a0d57600080fd5b50610533610a1c366004617e3f565b61261f565b348015610a2d57600080fd5b5061051c61265f565b348015610a4257600080fd5b50610713612773565b348015610a5757600080fd5b50610580612778565b348015610a6c57600080fd5b5061053361277e565b348015610a8157600080fd5b50610533612783565b348015610a9657600080fd5b50610580612788565b348015610aab57600080fd5b506105ad61278e565b348015610ac057600080fd5b506105cf6127ad565b348015610ad557600080fd5b506105806127b6565b348015610aea57600080fd5b506105806127bc565b348015610aff57600080fd5b506105336127c2565b348015610b1457600080fd5b5061055e61244b565b348015610b2957600080fd5b5061051c610b38366004618022565b6127cb565b348015610b4957600080fd5b50610533610b58366004617e3f565b613084565b348015610b6957600080fd5b50610533613096565b348015610b7e57600080fd5b50610b876130a3565b6040516105409190618276565b348015610ba057600080fd5b5061053361318f565b348015610bb557600080fd5b50610533613194565b348015610bca57600080fd5b50610533612571565b348015610bdf57600080fd5b5061058061319a565b348015610bf457600080fd5b506105ad610c0336600461807e565b6131a0565b348015610c1457600080fd5b506105336131ad565b348015610c2957600080fd5b506105336131ec565b348015610c3e57600080fd5b506105336131f8565b348015610c5357600080fd5b506105806131fe565b348015610c6857600080fd5b50610580613204565b348015610c7d57600080fd5b50610533610e3d565b348015610c9257600080fd5b5061051c61320a565b348015610ca757600080fd5b506105336133b9565b348015610cbc57600080fd5b506105cf610ccb366004617fe3565b6133bf565b348015610cdc57600080fd5b5061051c610ceb366004617e3f565b613545565b348015610cfc57600080fd5b5061055e613649565b348015610d1157600080fd5b5061071361364e565b61051c610d28366004617e3f565b613653565b348015610d3957600080fd5b506105336139d2565b348015610d4e57600080fd5b506105806139d8565b348015610d6357600080fd5b5061071361277e565b348015610d7857600080fd5b506105806139de565b348015610d8d57600080fd5b50610da1610d9c36600461807e565b6139e4565b60405161054093929190618ee1565b348015610dbc57600080fd5b50610580613aa6565b6000610dd03361261f565b9050600b8181548110610ddf57fe5b600091825260209091206001601690920201015460ff16610e1b5760405162461bcd60e51b8152600401610e1290618ae4565b60405180910390fd5b6000610e256131ad565b9050610e32338383613aac565b505050565b60095481565b606481565b61200181565b60005460609060ff16610e6d5760405162461bcd60e51b8152600401610e12906185a5565b3361200014610e8e5760405162461bcd60e51b8152600401610e1290618ce5565b600b54610f4c57610e9d6179eb565b60015460005b81811015610f4857600b8054600181018255600091909152835160008051602061919083398151915260169092029182019081556020808601516000805160206191d08339815191528401805460ff1916911515919091179055604086015180518794610f24936000805160206191b0833981519152909101920190617a1a565b506060820151610f3a9060038301906013617a94565b505050806001019050610ea3565b5050505b610f54617ac1565b6000610f9585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d7192505050565b9150915080610fb157610fa86064613f2d565b9250505061115e565b815160009060ff16610fd657610fcf83602001518460400151613f8e565b905061112a565b825160ff16600114156111265782602001515160011461101b5760008051602061917083398151915260405161100b9061899d565b60405180910390a1506067611121565b6000836020015160008151811061102e57fe5b602090810291909101810151516001600160a01b0381166000908152600490925260409091205490915080158061108f575060018082038154811061106f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b156110cd576040516001600160a01b038316907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a261111a565b60006110dc8360018403615150565b905080611118576040516001600160a01b038416907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a25b505b6000925050505b61112a565b5060655b63ffffffff811661114f575050604080516000815260208101909152915061115e9050565b61115881613f2d565b93505050505b9392505050565b60075460ff1681565b33411461118d5760405162461bcd60e51b8152600401610e1290618d34565b3a156111ab5760405162461bcd60e51b8152600401610e1290618a23565b82516040805182815260208084028201019091526060908280156111e957816020015b6111d6617ae5565b8152602001906001900390816111ce5790505b50905060005b82811015611293576040518060c0016040528087838151811061120e57fe5b60200260200101516001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200186838151811061125057fe5b60200260200101516001600160401b03168152602001600015158152602001600081525082828151811061128057fe5b60209081029190910101526001016111ef565b5060405163d31f968d60e01b81526120009063d31f968d906112be906110009060089060040161825a565b60206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190617fc3565b15611631578051601554818111156113b057815b818110156113ae57601580548061133557fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055601680548061138857fe5b6001900381819060005260206000200160006113a49190617b1a565b9055600101611322565b505b60005b828110156115f0578181106114d85760158482815181106113d057fe5b602090810291909101810151825460018181018555600094855293839020825160049092020180546001600160a01b039283166001600160a01b0319918216178255938301519481018054958316958516959095179094556040820151600285018054606085015160808601511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590961692909716919091179290921692909217169290921790915560a0015160039091015585516016908790839081106114a057fe5b602090810291909101810151825460018101845560009384529282902081516114d29491909101929190910190617a1a565b506115e8565b8381815181106114e457fe5b6020026020010151601582815481106114f957fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015585518690829081106115b457fe5b6020026020010151601682815481106115c957fe5b9060005260206000200190805190602001906115e6929190617a1a565b505b6001016113b3565b507fb8e726330a0dad1cf3d04e925663b17e391f1ed547d79b7f4e5f344119b44246826040516116209190618ed8565b60405180910390a150505050610e32565b60608061163e8386615513565b9150915060005b6001548110156117345760006001828154811061165e57fe5b90600052602060002090600402016003015490508060001461172b5760006001838154811061168957fe5b9060005260206000209060040201600301819055506120026001600160a01b031663092193ab82600185815481106116bd57fe5b60009182526020909120600491820201546040516001600160e01b031960e086901b1681526116f8926001600160a01b0390921691016181eb565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505b50600101611645565b5047156117a2577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d4760405161176a9190618ed8565b60405180910390a1604051611002904780156108fc02916000818181858888f193505050501580156117a0573d6000803e3d6000fd5b505b600060038190556005558151156117bd576117bd82826159fa565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117fa57600080fd5b505af115801561180e573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a150505050505050565b60035481565b606881565b61200581565b33612002146118765760405162461bcd60e51b8152600401610e1290618e92565b60005b6015548110156118fe57816001600160a01b03166015828154811061189a57fe5b60009182526020909120600490910201546001600160a01b031614156118f6576001601582815481106118c957fe5b9060005260206000209060040201600201601c6101000a81548160ff0219169083151502179055506118fe565b600101611879565b5050565b3341146119215760405162461bcd60e51b8152600401610e1290618d34565b60105443116119425760405162461bcd60e51b8152600401610e1290618738565b3a156119605760405162461bcd60e51b8152600401610e1290618a23565b60005460ff166119825760405162461bcd60e51b8152600401610e12906185a5565b60006110023168056bc75e2d631000008111156119b9576119b28168056bc75e2d6310000063ffffffff6161e916565b91506119c0565b5050611c41565b6040516309a99b4f60e41b815261100290639a99b4f0906119e790309086906004016181ff565b602060405180830381600087803b158015611a0157600080fd5b505af1158015611a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a399190618096565b915081611a47575050611c41565b6000805b84811015611a7557858582818110611a5f57fe5b9050602002013582019150806001019050611a4b565b5080611a8357505050611c41565b6000806000805b89811015611c395784898983818110611a9f57fe5b90506020020135880281611aaf57fe5b0493508a8a82818110611abe57fe5b9050602002016020810190611ad39190617e3f565b6001600160a01b03811660009081526004602052604090205490935091508115611bef576000600180840381548110611b0857fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611b7557836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8586604051611b689190618ed8565b60405180910390a2611be9565b600354611b88908663ffffffff61622b16565b6003908155810154611ba0908663ffffffff61622b16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611be0908890618ed8565b60405180910390a25b50611c31565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d8585604051611c289190618ed8565b60405180910390a25b600101611a8a565b505050505050505b5050436010555050565b6001546000908210611c5f57506000611d15565b60006001600160a01b031660018381548110611c7757fe5b60009182526020909120600490910201546001600160a01b03161480611ca757506008541580611ca75750600a54155b80611cb6575060085460095410155b80611cc75750611cc582611d1a565b155b80611cf057506000600b8381548110611cdc57fe5b906000526020600020906016020160000154115b80611d0457506001611d006130a3565b5111155b15611d1157506000611d15565b5060015b919050565b6001546000908210611d2e57506000611d15565b600b548210611d6b5760018281548110611d4457fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611d15565b60018281548110611d7857fe5b9060005260206000209060040201600201601c9054906101000a900460ff16158015611dc55750600b8281548110611dac57fe5b600091825260209091206001601690920201015460ff16155b92915050565b600b54611e8957611dda6179eb565b60015460005b81811015611e8557600b8054600181018255600091909152835160008051602061919083398151915260169092029182019081556020808601516000805160206191d08339815191528401805460ff1916911515919091179055604086015180518794611e61936000805160206191b0833981519152909101920190617a1a565b506060820151611e779060038301906013617a94565b505050806001019050611de0565b5050505b336110011480611e9a575033612002145b611eb65760405162461bcd60e51b8152600401610e12906185dc565b6001600160a01b03811660009081526004602052604090205480611eda5750611f2d565b6001810390506000600b8281548110611eef57fe5b600091825260209091206001601690920201015460ff169050611f128383615150565b8015611f1b5750805b15610e32576009805460001901905550505b50565b60015460609081906000805b82811015611f835760018181548110611f5157fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611f7b576001909101905b600101611f3c565b50606081604051908082528060200260200182016040528015611fb0578160200160208202803683370190505b509050606082604051908082528060200260200182016040528015611fe957816020015b6060815260200190600190039081611fd45790505b50600b54600094509091508414156121645760005b8481101561215e576001818154811061201357fe5b9060005260206000209060040201600201601c9054906101000a900460ff16612156576001818154811061204357fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061206e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061209b57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156121335780601f1061210857610100808354040283529160200191612133565b820191906000526020600020905b81548152906001019060200180831161211657829003601f168201915b505050505082858151811061214457fe5b60209081029190910101526001909301925b600101611ffe565b50612200565b60005b848110156121fe576001818154811061217c57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166121f657600181815481106121ac57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106121d757fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101612167565b505b909450925050505b9091565b600181565b61100181565b60085481565b606181565b600881565b6060806000600e549050600080600c5411612243576015612247565b600c545b905060606122536130a3565b9050606061226082616250565b905082825111612277579094509250612208915050565b83838351031015612289578282510393505b83156122bf5760c843046122a583838388880360008a8a6163be565b6122bd8383838888038989038a8b8b8b5103016163be565b505b6060836040519080825280602002602001820160405280156122eb578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561232457816020015b606081526020019060019003908161230f5790505b50905060005b858110156123a55784818151811061233e57fe5b602002602001015183828151811061235257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061237e57fe5b602002602001015182828151811061239257fe5b602090810291909101015260010161232a565b509096509450505050509091565b60065481565b61200681565b61200081565b6001600160a01b038116600090815260046020526040812054806123ed576000915050611d15565b6000190161115e81611d1a565b6001600160a01b03811660009081526004602052604081205480612422576000915050611d15565b60018082038154811061243157fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b600f5481565b6012818154811061246857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156124f95780601f106124ce576101008083540402835291602001916124f9565b820191906000526020600020905b8154815290600101906020018083116124dc57829003601f168201915b505050505081565b60105481565b6001818154811061251457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b61200381565b606681565b61271081565b33612000146125c45760405162461bcd60e51b8152600401610e1290618ce5565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f389021016058383836040516125f793929190618f21565b60405180910390a1505050565b60025481565b60115481565b60145460ff1681565b600a5481565b6001600160a01b038116600090815260046020526040812054806126555760405162461bcd60e51b8152600401610e1290618c6d565b6000190192915050565b600b5461271d5761266e6179eb565b60015460005b8181101561271957600b8054600181018255600091909152835160008051602061919083398151915260169092029182019081556020808601516000805160206191d08339815191528401805460ff19169115159190911790556040860151805187946126f5936000805160206191b0833981519152909101920190617a1a565b50606082015161270b9060038301906013617a94565b505050806001019050612674565b5050505b60085461272a5760036008555b600a54612737576002600a555b60006127423361261f565b905061274d81611c4b565b6127695760405162461bcd60e51b8152600401610e129061895a565b611f2d3382616515565b600981565b61100781565b600381565b60c881565b61100681565b604051806101e001604052806101ab8152602001618fc56101ab913981565b60005460ff1681565b61200281565b61300081565b6402540be40081565b60005460ff166127ed5760405162461bcd60e51b8152600401610e12906185a5565b336110071461280e5760405162461bcd60e51b8152600401610e1290618a51565b61287884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506165ad9050565b15612915576020811461289d5760405162461bcd60e51b8152600401610e1290618c27565b604080516020601f84018190048102820181019092528281526000916128db9185858083850183828082843760009201919091525061660692505050565b9050606481101580156128f15750620186a08111155b61290d5760405162461bcd60e51b8152600401610e129061884a565b600255613041565b61297584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506165ad9050565b15612a18576020811461299a5760405162461bcd60e51b8152600401610e12906183c3565b604080516020601f84018190048102820181019092528281526000916129d89185858083850183828082843760009201919091525061660692505050565b90506127106129f2600f548361622b90919063ffffffff16565b1115612a105760405162461bcd60e51b8152600401610e12906183fa565b600655613041565b612a8284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506165ad9050565b15612b1c5760208114612aa75760405162461bcd60e51b8152600401610e1290618462565b604080516020601f8401819004810282018101909252828152600091612ae59185858083850183828082843760009201919091525061660692505050565b600c5490915080612af4575060155b808210612b135760405162461bcd60e51b8152600401610e12906187a2565b50600855613041565b612b8584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506165ad9050565b15612c1e5760208114612baa5760405162461bcd60e51b8152600401610e129061852b565b604080516020601f8401819004810282018101909252828152600091612be89185858083850183828082843760009201919091525061660692505050565b9050600081118015612bfa5750600a81105b612c165760405162461bcd60e51b8152600401610e1290618dc5565b600a55613041565b612c9284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506165ad9050565b15612d215760208114612cb75760405162461bcd60e51b8152600401610e12906184df565b604080516020601f8401819004810282018101909252828152600091612cf59185858083850183828082843760009201919091525061660692505050565b9050600d54811115612d195760405162461bcd60e51b8152600401610e12906188c0565b600e55613041565b612d8a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506165ad9050565b15612e0c5760208114612daf5760405162461bcd60e51b8152600401610e1290618a9f565b604080516020601f8401819004810282018101909252828152600091612ded9185858083850183828082843760009201919091525061660692505050565b600d819055600e54909150811015612e0657600d54600e555b50613041565b612e7084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506165ad9050565b15612f1e5760208114612e955760405162461bcd60e51b8152600401610e1290618570565b604080516020601f8401819004810282018101909252828152600091612ed39185858083850183828082843760009201919091525061660692505050565b905060008111612ef55760405162461bcd60e51b8152600401610e129061864a565b6064811115612f165760405162461bcd60e51b8152600401610e1290618692565b600c55613041565b612f8684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601181527073797374656d526577617264526174696f60781b602082015291506165ad9050565b156130295760208114612fab5760405162461bcd60e51b8152600401610e1290618d81565b604080516020601f8401819004810282018101909252828152600091612fe99185858083850183828082843760009201919091525061660692505050565b90506127106130036006548361622b90919063ffffffff16565b11156130215760405162461bcd60e51b8152600401610e1290618b88565b600f55613041565b60405162461bcd60e51b8152600401610e1290618e22565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516130769493929190618391565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156130d2576130be81611d1a565b156130ca578160010191505b6001016130ad565b506060816040519080825280602002602001820160405280156130ff578160200160208202803683370190505b5090506000915060005b838110156131865761311a81611d1a565b1561317e576001818154811061312c57fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061315757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101613109565b50925050505b90565b601581565b61027181565b61100281565b6013818154811061246857fe5b60006131b76130a3565b519050600080600c54116131cc5760156131d0565b600c545b9050808211156131de578091505b816131e857600191505b5090565b67016345785d8a000081565b60055481565b61100381565b61200481565b60005460ff161561322d5760405162461bcd60e51b8152600401610e1290618b51565b613235617ac1565b600061325b604051806101e001604052806101ab8152602001618fc56101ab9139613d71565b915091508061327c5760405162461bcd60e51b8152600401610e1290618ca4565b60005b8260200151518110156133a15760018360200151828151811061329e57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591860151805191850193918590811061337457fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161327f565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b818110156134c8576134b085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060138054909250859150811061341857fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156134a65780601f1061347b576101008083540402835291602001916134a6565b820191906000526020600020905b81548152906001019060200180831161348957829003601f168201915b505050505061660b565b156134c057600192505050611dc5565b6001016133c7565b5060125460005b818110156135395761352086868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060128054909250859150811061341857fe5b156135315760019350505050611dc5565b6001016134cf565b50600095945050505050565b33611001146135665760405162461bcd60e51b8152600401610e1290618e49565b600b54613624576135756179eb565b60015460005b8181101561362057600b8054600181018255600091909152835160008051602061919083398151915260169092029182019081556020808601516000805160206191d08339815191528401805460ff19169115159190911790556040860151805187946135fc936000805160206191b0833981519152909101920190617a1a565b5060608201516136129060038301906013617a94565b50505080600101905061357b565b5050505b600061362f8261666f565b905061363a81611c4b565b156118fe576118fe8282616515565b606581565b601181565b3341146136725760405162461bcd60e51b8152600401610e1290618d34565b60005460ff166136945760405162461bcd60e51b8152600401610e12906185a5565b600034116136b45760405162461bcd60e51b8152600401610e1290618891565b3a156136d25760405162461bcd60e51b8152600401610e1290618a23565b6001600160a01b03811660009081526004602052604090205460145434919060ff1661371257610271600f556103e86006556014805460ff191660011790555b60008211801561372457506000600f54115b156137d6576000613752612710613746600f54346167f290919063ffffffff16565b9063ffffffff61682c16565b905080156137d4576040516110029082156108fc029083906000818181858888f19350505050158015613789573d6000803e3d6000fd5b507f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d816040516137b99190618ed8565b60405180910390a16137d1838263ffffffff6161e916565b92505b505b6000821180156137e857506000600654115b1561388e57600061380a612710613746600654346167f290919063ffffffff16565b9050801561388c5760405161dead9082156108fc029083906000818181858888f19350505050158015613841573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee5816040516138719190618ed8565b60405180910390a1613889838263ffffffff6161e916565b92505b505b801561398c5760006001808303815481106138a557fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561391257836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4846040516139059190618ed8565b60405180910390a2613986565b600354613925908463ffffffff61622b16565b600390815581015461393d908463ffffffff61622b16565b60038201556040516001600160a01b038516907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc0559061397d908690618ed8565b60405180910390a25b50610e32565b826001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4836040516139c59190618ed8565b60405180910390a2505050565b600e5481565b61100081565b61dead81565b600b81815481106139f157fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015613a9c5780601f10613a7157610100808354040283529160200191613a9c565b820191906000526020600020905b815481529060010190602001808311613a7f57829003601f168201915b5050505050905083565b61100481565b6000600a5460001480613abd575081155b80613ac85750600954155b15613ad55750600061115e565b6000613b0f600a5461374685613746600b8981548110613af157fe5b6000918252602090912060169091020154439063ffffffff6161e916565b90506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015613b4e57600080fd5b505afa158015613b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b8691906180ae565b9150915060009350808310613ce557613b9f8787615150565b5060405163436aa28360e11b8152600090612002906386d5450690613bc8908b906004016181eb565b60206040518083038186803b158015613be057600080fd5b505afa158015613bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c189190617e5b565b6001600160a01b031614613c84576040516313d13bdb60e31b815261100190639e89ded890613c4d908a9087906004016181ff565b600060405180830381600087803b158015613c6757600080fd5b505af1158015613c7b573d6000803e3d6000fd5b50505050613cdc565b6040516305bfb49960e41b815261100190635bfb499090613ca9908a906004016181eb565b600060405180830381600087803b158015613cc357600080fd5b505af1158015613cd7573d6000803e3d6000fd5b505050505b60019350613cf7565b818310613cf757613cf58761666f565b505b60098054600019019055600b80546000919088908110613d1357fe5b60009182526020822060169190910201600101805460ff1916921515929092179091556040516001600160a01b038916917fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b91a25050509392505050565b613d79617ac1565b6000613d83617ac1565b613d8b617b5e565b613d9c613d978661686e565b616893565b90506000805b613dab836168dd565b15613f1f5780613dd057613dc6613dc1846168fe565b61694c565b60ff168452613f17565b8060011415613f12576060613dec613de7856168fe565b6169cc565b90508051604051908082528060200260200182016040528015613e2957816020015b613e16617ae5565b815260200190600190039081613e0e5790505b5085602001819052508051604051908082528060200260200182016040528015613e6757816020015b6060815260200190600190039081613e525790505b50604086015260005b8151811015613f0757613e81617ae5565b60606000613ea1858581518110613e9457fe5b6020026020010151616a9d565b92509250925080613ec1578860009a509a50505050505050505050613f28565b8289602001518581518110613ed257fe5b60200260200101819052508189604001518581518110613eee57fe5b6020026020010181905250505050806001019050613e70565b506001925050613f17565b613f1f565b600101613da2565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081613f47579050509050613f6d8363ffffffff16616bb7565b81600081518110613f7a57fe5b602002602001018190525061115e81616bca565b6000606483511115613fc557600080516020619170833981519152604051613fb5906186ef565b60405180910390a1506066611dc5565b60005b83518110156140635760005b8181101561405a57848181518110613fe857fe5b6020026020010151600001516001600160a01b031685838151811061400957fe5b6020026020010151600001516001600160a01b031614156140525760008051602061917083398151915260405161403f906187ff565b60405180910390a1606692505050611dc5565b600101613fd4565b50600101613fc8565b5060608060606015805480602002602001604051908101604052809291908181526020016000905b828210156141155760008481526020908190206040805160c0810182526004860290920180546001600160a01b039081168452600180830154821685870152600283015491821693850193909352600160a01b81046001600160401b03166060850152600160e01b900460ff16151560808401526003015460a0830152908352909201910161408b565b50505050905060606016805480602002602001604051908101604052809291908181526020016000905b828210156141ea5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156141d65780601f106141ab576101008083540402835291602001916141d6565b820191906000526020600020905b8154815290600101906020018083116141b957829003601f168201915b50505050508152602001906001019061413f565b50505050905060005b82518110156142475782818151811061420857fe5b60200260200101516060015160030283828151811061422357fe5b60209081029190910101516001600160401b039091166060909101526001016141f3565b5060608061425789898686616c54565b915091506142658282615513565b600154604080518281526020808402820101909152929850909650600095508594509250606091508280156142a4578160200160208202803683370190505b50905060005b828110156144355760006001600160a01b03166120026001600160a01b03166386d54506600184815481106142db57fe5b60009182526020909120600491820201546040516001600160e01b031960e085901b168152614316926001600160a01b0390921691016181eb565b60206040518083038186803b15801561432e57600080fd5b505afa158015614342573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143669190617e5b565b6001600160a01b0316146143c857600182828151811061438257fe5b602002602001019060ff16908160ff1681525050600181815481106143a357fe5b9060005260206000209060040201600301546000146143c3578360010193505b61442d565b67016345785d8a0000600182815481106143de57fe5b906000526020600020906004020160030154106144005784600101945061442d565b6001818154811061440d57fe5b90600052602060002090600402016003015460001461442d578360010193505b6001016142aa565b50606084604051908082528060200260200182016040528015614462578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015614491578160200160208202803683370190505b5090506060866040519080825280602002602001820160405280156144c0578160200160208202803683370190505b5090506060876040519080825280602002602001820160405280156144ef578160200160208202803683370190505b5090506000606088604051908082528060200260200182016040528015614520578160200160208202803683370190505b50905060608960405190808252806020026020018201604052801561454f578160200160208202803683370190505b50905060009a506000995060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561459757600080fd5b505afa1580156145ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145cf9190618096565b905067016345785d8a000081111561461b576000805160206191708339815191526040516145fc90618b10565b60405180910390a160689e505050505050505050505050505050611dc5565b60005b8a8110156149af5789818151811061463257fe5b602002602001015160ff1660011415614728576001818154811061465257fe5b906000526020600020906004020160030154600014614723576001818154811061467857fe5b600091825260209091206004909102015484516001600160a01b039091169085908e9081106146a357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600181815481106146d057fe5b906000526020600020906004020160030154838d815181106146ee57fe5b60200260200101818152505060018a8d8151811061470857fe5b602002602001019060ff16908160ff16815250508b6001019b505b6149a7565b67016345785d8a00006001828154811061473e57fe5b906000526020600020906004020160030154106148c3576001818154811061476257fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898e8151811061479357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106147c857fe5b906000526020600020906004020160030154816147e157fe5b06600183815481106147ef57fe5b90600052602060002090600402016003015403905061481783826161e990919063ffffffff16565b898f8151811061482357fe5b6020026020010181815250506001828154811061483c57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878f8151811061486d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888f8151811061489a57fe5b60209081029190910101526148b5868263ffffffff61622b16565b95508d6001019d50506149a7565b600181815481106148d057fe5b9060005260206000209060040201600301546000146149a757600181815481106148f657fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848d8151811061492757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061495457fe5b906000526020600020906004020160030154838d8151811061497257fe5b60200260200101818152505060008a8d8151811061498c57fe5b602002602001019060ff16908160ff16815250508b6001019b505b60010161461e565b5060008415614c25576002546040516303702b2960e51b815261100491636e0565209188916149e9918e918e918d914201906004016182f9565b6020604051808303818588803b158015614a0257600080fd5b505af193505050508015614a33575060408051601f3d908101601f19168201909252614a3091810190617fc3565b60015b614baa576040516000815260443d1015614a4f57506000614aea565b60046000803e60005160e01c6308c379a08114614a70576000915050614aea565b60043d036004833e81513d60248201116001600160401b0382111715614a9b57600092505050614aea565b80830180516001600160401b03811115614abc576000945050505050614aea565b8060208301013d8601811115614ada57600095505050505050614aea565b601f01601f191660405250925050505b80614af55750614b37565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051614b29919061837e565b60405180910390a250614ba5565b3d808015614b61576040519150601f19603f3d011682016040523d82523d6000602084013e614b66565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051614b9b919061837e565b60405180910390a2505b614c25565b8015614bec577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051614bdf9190618ed8565b60405180910390a1614c23565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051614c1a906184a8565b60405180910390a25b505b8015614ddb5760005b8751811015614dd9576000888281518110614c4557fe5b60200260200101519050600060018281548110614c5e57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110614c8f57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015614d4b5760018281548110614cd057fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110614d1f57fe5b906000526020600020906004020160030154604051614d3e9190618ed8565b60405180910390a2614dcf565b60018281548110614d5857fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110614da757fe5b906000526020600020906004020160030154604051614dc69190618ed8565b60405180910390a25b5050600101614c2e565b505b835115614fd15760005b8451811015614fcf578a8181518110614dfa57fe5b602002602001015160ff1660011415614e99576120026001600160a01b031663092193ab858381518110614e2a57fe5b6020026020010151878481518110614e3e57fe5b60200260200101516040518363ffffffff1660e01b8152600401614e6291906181eb565b6000604051808303818588803b158015614e7b57600080fd5b505af1158015614e8f573d6000803e3d6000fd5b5050505050614fc7565b6000858281518110614ea757fe5b60200260200101516001600160a01b03166108fc868481518110614ec757fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015614f5d57858281518110614efd57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110614f3b57fe5b6020026020010151604051614f509190618ed8565b60405180910390a2614fc5565b858281518110614f6957fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110614fa757fe5b6020026020010151604051614fbc9190618ed8565b60405180910390a25b505b600101614de5565b505b5050505050505050505050505060005b60015481101561503e5760018181548110614ff857fe5b9060005260206000209060040201600301546000146150365760006001828154811061502057fe5b9060005260206000209060040201600301819055505b600101614fe1565b5047156150ac577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d476040516150749190618ed8565b60405180910390a1604051611002904780156108fc02916000818181858888f193505050501580156150aa573d6000803e3d6000fd5b505b600060038190556005558151156150c7576150c782826159fa565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561510457600080fd5b505af1158015615118573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b6000806001838154811061516057fe5b9060005260206000209060040201600301549050600060018080549050039050600161518a6130a3565b51116151bf5760006001858154811061519f57fe5b906000526020600020906004020160030181905550600092505050611dc5565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516151f89190618ed8565b60405180910390a26001600160a01b038516600090815260046020526040812055835b600154600019018110156153e5576001816001018154811061523957fe5b90600052602060002090600402016001828154811061525457fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061531557fe5b9060005260206000209060160201600b828154811061533057fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff1990921691909117905560028084018054615387938386019390821615610100026000190190911604617b7e565b5061539a60038281019084016013617bf3565b509050508060010160046000600184815481106153b357fe5b600091825260208083206004909202909101546001600160a01b0316835282019290925260400190205560010161521b565b5060018054806153f157fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061544457fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906154766002830182617b1a565b615484600383016000617c1d565b50509055600081838161549357fe5b04905080156155075760015460005b81811015615504576154db83600183815481106154bb57fe5b90600052602060002090600402016003015461622b90919063ffffffff16565b600182815481106154e857fe5b60009182526020909120600360049092020101556001016154a2565b50505b50600195945050505050565b6060806000808080806155246131ad565b6001549091505b801561575357600181039250600b838154811061554457fe5b600091825260209091206001601690920201015460ff166155645761574a565b6001838154811061557157fe5b60009182526020909120600490910201546001600160a01b03169450615598858484613aac565b9350836155a45761574a565b60405163436aa28360e11b81526000908190612002906386d54506906155ce908a906004016181eb565b60206040518083038186803b1580156155e657600080fd5b505afa1580156155fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061561e9190617e5b565b90506001600160a01b038116156156a7576040516302ceee9160e11b81526120029063059ddd22906156549084906004016181eb565b60206040518083038186803b15801561566c57600080fd5b505afa158015615680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156a49190617e5b565b91505b60005b8c5181101561574657876001600160a01b03168d82815181106156c957fe5b6020026020010151600001516001600160a01b031614806157125750826001600160a01b03168d82815181106156fb57fe5b6020026020010151600001516001600160a01b0316145b1561573e5760018d828151811061572557fe5b6020908102919091010151901515608090910152615746565b6001016156aa565b5050505b6000190161552b565b5060005b89518110156157c05789818151811061576c57fe5b602002602001015160800151806157ac575060006001600160a01b03168a828151811061579557fe5b6020026020010151600001516001600160a01b0316145b156157b8578560010195505b600101615757565b50885185106158a85760408051600180825281830190925290816020015b6157e6617ae5565b8152602001906001900390816157de575050604080516001808252818301909252919850602082015b606081526020019060019003908161580f5790505095508860008151811061583357fe5b60200260200101518760008151811061584857fe5b60200260200101819052508760008151811061586057fe5b60200260200101518660008151811061587557fe5b602002602001018190525060008760008151811061588f57fe5b60209081029190910101519015156080909101526159ed565b848951036040519080825280602002602001820160405280156158e557816020015b6158d2617ae5565b8152602001906001900390816158ca5790505b5096508489510360405190808252806020026020018201604052801561591f57816020015b606081526020019060019003908161590a5790505b5095506000915060005b89518110156159eb5789818151811061593e57fe5b602002602001015160800151158015615981575060006001600160a01b03168a828151811061596957fe5b6020026020010151600001516001600160a01b031614155b156159e35789818151811061599257fe5b60200260200101518884815181106159a657fe5b60200260200101819052508881815181106159bd57fe5b60200260200101518784815181106159d157fe5b60200260200101819052508260010192505b600101615929565b505b50505050505b9250929050565b600154825160005b82811015615b17576001615a14617ae5565b60018381548110615a2157fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015615aeb57878181518110615ab157fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615ae35760009250615aeb565b600101615a9d565b508115615b0d5780516001600160a01b03166000908152600460205260408120555b5050600101615a02565b5080821115615bd657805b82811015615bd4576001805480615b3557fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b805480615b8857fe5b60008281526020812060166000199093019283020181815560018101805460ff1916905590615bba6002830182617b1a565b615bc8600383016000617c1d565b50509055600101615b22565b505b6000818310615be55781615be7565b825b905060005b81811015615f8b57615c99868281518110615c0357fe5b602002602001015160018381548110615c1857fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152617020565b615e4d578060010160046000888481518110615cb157fe5b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550858181518110615ced57fe5b602002602001015160018281548110615d0257fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101558451859082908110615dbd57fe5b6020026020010151600b8281548110615dd257fe5b90600052602060002090601602016002019080519060200190615df6929190617a1a565b506000600b8281548110615e0657fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b805483908110615e3757fe5b6000918252602090912060169091020155615f83565b858181518110615e5957fe5b60200260200101516060015160018281548110615e7257fe5b906000526020600020906004020160020160146101000a8154816001600160401b0302191690836001600160401b03160217905550615f38858281518110615eb657fe5b6020026020010151600b8381548110615ecb57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156134a65780601f1061347b576101008083540402835291602001916134a6565b615f8357848181518110615f4857fe5b6020026020010151600b8281548110615f5d57fe5b90600052602060002090601602016002019080519060200190615f81929190617a1a565b505b600101615bec565b508282111561616357615f9c6179eb565b835b8381101561616057858181518110615fb257fe5b602002602001015182604001819052506001878281518110615fd057fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b80549283018155909352845160169091026000805160206191908339815191528101918255858301516000805160206191d08339815191528201805491151560ff1990921691909117905592850151805186949293616106936000805160206191b083398151915201920190617a1a565b50606082015161611c9060038301906013617a94565b505050806001016004600089848151811061613357fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101615f9e565b50505b61616b61707c565b616173617264565b6000600981905560015493505b838110156161e1576000600b828154811061619757fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106161c857fe5b6000918252602090912060169091020155600101616180565b505050505050565b600061115e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250617452565b60008282018381101561115e5760405162461bcd60e51b8152600401610e1290618613565b60015481516040805182815260208084028201019091526060929190839082801561628f57816020015b606081526020019060019003908161627a5790505b50600b5490915083146162a6579250611d15915050565b60005b828110156163b557600b6001600460008985815181106162c557fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106162f957fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156163915780601f1061636657610100808354040283529160200191616391565b820191906000526020600020905b81548152906001019060200180831161637457829003601f168201915b50505050508282815181106163a257fe5b60209081029190910101526001016162a9565b50949350505050565b60005b8281101561650b57600082878388016040516020016163e19291906181dd565b6040516020818303038152906040528051906020012060001c8161640157fe5b06905080850182870114616502576000898388018151811061641f57fe5b602002602001015190506060898489018151811061643957fe5b602002602001015190508a8388018151811061645157fe5b60200260200101518b858a018151811061646757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061649657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505089838801815181106164c457fe5b60200260200101518a858a01815181106164da57fe5b6020026020010181905250808a848901815181106164f457fe5b602002602001018190525050505b506001016163c1565b5050505050505050565b600980546001908101909155600b80548390811061652f57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061656557fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016165c091906181c1565b60405160208183030381529060405280519060200120836040516020016165e791906181c1565b6040516020818303038152906040528051906020012014905092915050565b015190565b8151815160009160019181148083146166275760009250616665565b600160208701838101602088015b6002848385100114156166605780518351146166545760009650600093505b60209283019201616635565b505050505b5090949350505050565b6001600160a01b0381166000908152600460205260408120548061669857506000199050611d15565b6001810390506000600182815481106166ad57fe5b90600052602060002090600402016003015490506000600183815481106166d057fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90616729908590618ed8565b60405180910390a28061674157829350505050611d15565b600081838161674c57fe5b04905080156167e85760005b8481101561679a5761677182600183815481106154bb57fe5b6001828154811061677e57fe5b6000918252602090912060036004909202010155600101616758565b50600180549085015b818110156167e5576167bc83600183815481106154bb57fe5b600182815481106167c957fe5b60009182526020909120600360049092020101556001016167a3565b50505b5091949350505050565b60008261680157506000611dc5565b8282028284828161680e57fe5b041461115e5760405162461bcd60e51b8152600401610e12906189e2565b600061115e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061747e565b616876617c2c565b506040805180820190915281518152602082810190820152919050565b61689b617b5e565b6168a4826174b5565b6168ad57600080fd5b60006168bc83602001516174ef565b60208085015160408051808201909152868152920190820152915050919050565b60006168e7617c2c565b505080518051602091820151919092015191011190565b616906617c2c565b61690f826168dd565b61691857600080fd5b6020820151600061692882617552565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061696157508151602110155b61696a57600080fd5b600061697983602001516174ef565b9050808360000151101561699f5760405162461bcd60e51b8152600401610e1290618bf0565b8251602080850151830180519284900392918310156163b557506020919091036101000a90049392505050565b60606169d7826174b5565b6169e057600080fd5b60006169eb83617633565b9050606081604051908082528060200260200182016040528015616a2957816020015b616a16617c2c565b815260200190600190039081616a0e5790505b5090506000616a3b85602001516174ef565b60208601510190506000805b84811015616a9257616a5883617552565b9150604051806040016040528083815260200184815250848281518110616a7b57fe5b602090810291909101015291810191600101616a47565b509195945050505050565b616aa5617ae5565b60606000616ab1617ae5565b6060616abb617b5e565b616ac487616893565b90506000805b616ad3836168dd565b15616ba85780616afe57616aee616ae9846168fe565b61768f565b6001600160a01b03168552616ba0565b8060011415616b2657616b13616ae9846168fe565b6001600160a01b03166020860152616ba0565b8060021415616b4e57616b3b616ae9846168fe565b6001600160a01b03166040860152616ba0565b8060031415616b7a57616b63613dc1846168fe565b6001600160401b0316606086015260019150616ba0565b8060041415616b9b57616b94616b8f846168fe565b6176a9565b9350616ba0565b616ba8565b600101616aca565b50929791965091945092505050565b6060611dc5616bc583617719565b6177ff565b6060815160001415616beb5750604080516000815260208101909152611d15565b606082600081518110616bfa57fe5b602002602001015190506000600190505b8351811015616c3b57616c3182858381518110616c2457fe5b6020026020010151617851565b9150600101616c0b565b5061115e616c4e825160c060ff166178ce565b82617851565b60608060006120026001600160a01b031663c473318f6040518163ffffffff1660e01b815260040160206040518083038186803b158015616c9457600080fd5b505afa158015616ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616ccc9190618096565b90508085518851011015616ce1575083518651015b606081604051908082528060200260200182016040528015616d1d57816020015b616d0a617ae5565b815260200190600190039081616d025790505b509050606082604051908082528060200260200182016040528015616d5657816020015b6060815260200190600190039081616d415790505b50905060008060005b8b51831080616d6e5750895182105b8015616d7957508581105b1561700e578b51831415616de957898281518110616d9357fe5b6020026020010151858281518110616da757fe5b6020026020010181905250888281518110616dbe57fe5b6020026020010151848281518110616dd257fe5b602090810291909101015260019182019101616d5f565b8951821415616e54578b8381518110616dfe57fe5b6020026020010151858281518110616e1257fe5b60200260200101819052508a8381518110616e2957fe5b6020026020010151848281518110616e3d57fe5b602090810291909101015260019283019201616d5f565b898281518110616e6057fe5b6020026020010151606001516001600160401b03168c8481518110616e8157fe5b6020026020010151606001516001600160401b03161115616efd578b8381518110616ea857fe5b6020026020010151858281518110616ebc57fe5b60200260200101819052508a8381518110616ed357fe5b6020026020010151848281518110616ee757fe5b6020026020010181905250826001019250617006565b898281518110616f0957fe5b6020026020010151606001516001600160401b03168c8481518110616f2a57fe5b6020026020010151606001516001600160401b03161015616fa657898281518110616f5157fe5b6020026020010151858281518110616f6557fe5b6020026020010181905250888281518110616f7c57fe5b6020026020010151848281518110616f9057fe5b6020026020010181905250816001019150617006565b898281518110616fb257fe5b6020026020010151600001516001600160a01b03168c8481518110616fd357fe5b6020026020010151600001516001600160a01b03161015616ffa578b8381518110616ea857fe5b898281518110616d9357fe5b600101616d5f565b50929a91995090975050505050505050565b805182516000916001600160a01b03918216911614801561705a575081602001516001600160a01b031683602001516001600160a01b0316145b801561115e5750506040908101519101516001600160a01b0390811691161490565b601254601354808211156170c757805b828110156170c557601280548061709f57fe5b6001900381819060005260206000200160006170bb9190617b1a565b905560010161708c565b505b60008183106170d657816170d8565b825b905060005b818110156171f057617195601282815481106170f557fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156171835780601f1061715857610100808354040283529160200191617183565b820191906000526020600020905b81548152906001019060200180831161716657829003601f168201915b50505050506013838154811061341857fe5b6171e857601381815481106171a657fe5b90600052602060002001601282815481106171bd57fe5b9060005260206000200190805460018160011615610100020316600290046171e6929190617b7e565b505b6001016170dd565b5082821115610e3257825b8281101561725e5760126013828154811061721257fe5b6000918252602080832084546001818101875595855291909320929091018054617255949390920192909160026101009282161592909202600019011604617b7e565b506001016171fb565b50505050565b601354600b54808211156172af57805b828110156172ad57601380548061728757fe5b6001900381819060005260206000200160006172a39190617b1a565b9055600101617274565b505b60008183106172be57816172c0565b825b905060005b818110156173df5761737d601382815481106172dd57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561736b5780601f106173405761010080835404028352916020019161736b565b820191906000526020600020905b81548152906001019060200180831161734e57829003601f168201915b5050505050600b8381548110615ecb57fe5b6173d757600b818154811061738e57fe5b9060005260206000209060160201600201601382815481106173ac57fe5b9060005260206000200190805460018160011615610100020316600290046173d5929190617b7e565b505b6001016172c5565b5082821115610e3257825b8281101561725e576013600b828154811061740157fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461744995939094019390926000199082161561010002011604617b7e565b506001016173ea565b600081848411156174765760405162461bcd60e51b8152600401610e12919061837e565b505050900390565b6000818361749f5760405162461bcd60e51b8152600401610e12919061837e565b5060008385816174ab57fe5b0495945050505050565b80516000906174c657506000611d15565b6020820151805160001a9060c08210156174e557600092505050611d15565b5060019392505050565b8051600090811a6080811015617509576000915050611d15565b60b8811080617524575060c08110801590617524575060f881105b15617533576001915050611d15565b60c08110156175475760b519019050611d15565b60f519019050611d15565b80516000908190811a608081101561756d576001915061762c565b60b881101561758257607e198101915061762c565b60c08110156175d357600060b78203600186019550806020036101000a8651049150600181018201935050808310156175cd5760405162461bcd60e51b8152600401610e129061892f565b5061762c565b60f88110156175e85760be198101915061762c565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561762a5760405162461bcd60e51b8152600401610e129061892f565b505b5092915050565b805160009061764457506000611d15565b6000809050600061765884602001516174ef565b602085015185519181019250015b808210156176865761767782617552565b82019150826001019250617666565b50909392505050565b80516000906015146176a057600080fd5b611dc58261694c565b80516060906176b757600080fd5b60006176c683602001516174ef565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156176fd576020820181803683370190505b50905060008160200190506163b58487602001510182856179a0565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661775d57506018617781565b6fffffffffffffffffffffffffffffffff19841661777d57506010617781565b5060005b60208110156177b75781818151811061779657fe5b01602001516001600160f81b031916156177af576177b7565b600101617781565b60008160200390506060816040519080825280601f01601f1916602001820160405280156177ec576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156178315750607f60f81b8260008151811061781f57fe5b01602001516001600160f81b03191611155b1561783d575080611d15565b611dc561784f8351608060ff166178ce565b835b6060806040519050835180825260208201818101602087015b8183101561788257805183526020928301920161786a565b50855184518101855292509050808201602086015b818310156178af578051835260209283019201617897565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106178f85760405162461bcd60e51b8152600401610e129061877a565b604080516001808252818301909252606091602082018180368337019050509050603784116179525782840160f81b8160008151811061793457fe5b60200101906001600160f81b031916908160001a9053509050611dc5565b606061795d85617719565b90508381510160370160f81b8260008151811061797657fe5b60200101906001600160f81b031916908160001a9053506179978282617851565b95945050505050565b806179aa57610e32565b5b602081106179ca578251825260209283019290910190601f19016179ab565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001617a15617c46565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617a5b57805160ff1916838001178555617a88565b82800160010185558215617a88579182015b82811115617a88578251825591602001919060010190617a6d565b506131e8929150617c65565b8260138101928215617a885791602002820182811115617a88578251825591602001919060010190617a6d565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b50805460018160011615610100020316600290046000825580601f10617b405750611f2d565b601f016020900490600052602060002090810190611f2d9190617c65565b6040518060400160405280617b71617c2c565b8152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10617bb75780548555617a88565b82800160010185558215617a8857600052602060002091601f016020900482015b82811115617a88578254825591600101919060010190617bd8565b8260138101928215617a885791820182811115617a88578254825591600101919060010190617bd8565b50611f2d906013810190617c65565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b61318c91905b808211156131e85760008155600101617c6b565b8035611dc581618faf565b60008083601f840112617c9b578182fd5b5081356001600160401b03811115617cb1578182fd5b60208301915083602080830285010111156159f357600080fd5b6000601f8381840112617cdc578182fd5b8235617cef617cea82618f64565b618f3e565b818152925060208084019085810160005b84811015617d81578135880189603f820112617d1b57600080fd5b838101356001600160401b03811115617d3357600080fd5b617d44818901601f19168601618f3e565b81815260408c81848601011115617d5a57600080fd5b82818501888401375060009181018601919091528552509282019290820190600101617d00565b50505050505092915050565b600082601f830112617d9d578081fd5b8135617dab617cea82618f64565b818152915060208083019084810181840286018201871015617dcc57600080fd5b6000805b85811015617d815782356001600160401b0381168114617dee578283fd5b85529383019391830191600101617dd0565b60008083601f840112617e11578182fd5b5081356001600160401b03811115617e27578182fd5b6020830191508360208285010111156159f357600080fd5b600060208284031215617e50578081fd5b813561115e81618faf565b600060208284031215617e6c578081fd5b815161115e81618faf565b60008060008060408587031215617e8c578283fd5b84356001600160401b0380821115617ea2578485fd5b617eae88838901617c8a565b90965094506020870135915080821115617ec6578384fd5b50617ed387828801617c8a565b95989497509550505050565b600080600060608486031215617ef3578283fd5b83356001600160401b0380821115617f09578485fd5b81860187601f820112617f1a578586fd5b80359250617f2a617cea84618f64565b80848252602080830192508084018b828389028701011115617f4a57898afd5b8994505b86851015617f7457617f608c82617c7f565b845260019490940193928101928101617f4e565b509097508801359350505080821115617f8b578384fd5b617f9787838801617d8d565b93506040860135915080821115617fac578283fd5b50617fb986828701617ccb565b9150509250925092565b600060208284031215617fd4578081fd5b8151801515811461115e578182fd5b60008060208385031215617ff5578182fd5b82356001600160401b0381111561800a578283fd5b61801685828601617e00565b90969095509350505050565b60008060008060408587031215618037578384fd5b84356001600160401b038082111561804d578586fd5b61805988838901617e00565b90965094506020870135915080821115618071578384fd5b50617ed387828801617e00565b60006020828403121561808f578081fd5b5035919050565b6000602082840312156180a7578081fd5b5051919050565b600080604083850312156180c0578182fd5b505080516020909101519092909150565b6000806000604084860312156180e5578081fd5b833560ff811681146180f5578182fd5b925060208401356001600160401b0381111561810f578182fd5b61811b86828701617e00565b9497909650939450505050565b6000815180845260208085019450808401835b838110156181605781516001600160a01b03168752958201959082019060010161813b565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526181ad816020860160208601618f83565b601f01601f19169290920160200192915050565b600082516181d3818460208701618f83565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b6001600160a01b0392909216825260ff16602082015260400190565b60006020825261115e6020830184618128565b60006040825261829c6040830185618128565b602083820381850152818551808452828401915082838202850101838801865b838110156182ea57601f198784030185526182d8838351618195565b948601949250908501906001016182bc565b50909998505050505050505050565b60006080825261830c6080830187618128565b828103602084810191909152865180835287820192820190845b8181101561834257845183529383019391830191600101618326565b505084810360408601526183568188618128565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b60006020825261115e6020830184618195565b6000604082526183a560408301868861816b565b82810360208401526183b881858761816b565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526042908201527f746865206275726e526174696f20706c75732073797374656d5265776172645260408201527f6174696f206d757374206265206e6f2067726561746572207468616e20313030606082015261030360f41b608082015260a00190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601f908201527f6f6e6c7920736c617368206f72207374616b6548756220636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526042908201527f7468652073797374656d526577617264526174696f20706c7573206275726e5260408201527f6174696f206d757374206265206e6f2067726561746572207468616e20313030606082015261030360f41b608082015260a00190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b60208082526024908201527f6c656e677468206f662073797374656d526577617264526174696f206d69736d6040820152630c2e8c6d60e31b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b61ffff91909116815260200190565b90815260200190565b60008482528315156020830152606060408301526179976060830184618195565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff851682526040602083015261799760408301848661816b565b6040518181016001600160401b0381118282101715618f5c57600080fd5b604052919050565b60006001600160401b03821115618f79578081fd5b5060209081020190565b60005b83811015618f9e578181015183820152602001618f86565b8381111561725e5750506000910152565b6001600160a01b0381168114611f2d57600080fdfef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a7841000000070e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa164736f6c6343000604000a", + }, + { + ContractAddr: common.HexToAddress(StakeHubContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/2d6372ddba77902ef01e45887a425938376d5a5c", + Code: "608060405260043610620003db5760003560e01c806386d545061162000203578063d115a2061162000117578063e992aaf511620000ad578063f80a34021162000078578063f80a34021462000bef578063fb50b31f1462000c14578063fc0c5ff11462000c39578063ff69ab611462000c5157600080fd5b8063e992aaf51462000b6c578063efdbf0e11462000b84578063f1f74d841462000bc0578063f1fad1041462000bd857600080fd5b8063d8ca511f11620000ee578063d8ca511f1462000aff578063daacdb661462000b17578063dbda7fb31462000b2f578063e8f67c3b1462000b5457600080fd5b8063d115a2061462000a9d578063d6ca429d1462000ab5578063d7c2dfc81462000ada57600080fd5b8063b187bd261162000199578063c38fbec81162000164578063c38fbec81462000a1f578063c473318f1462000a44578063c8509d81146200083d578063cbb04d9d1462000a5c57600080fd5b8063b187bd26146200098c578063baa7199e14620009ac578063bdceadf314620009d1578063bff02e2014620009e957600080fd5b8063982ef0a711620001da578063982ef0a714620008f7578063a43569b3146200090e578063aad3ec961462000942578063ac431751146200096757600080fd5b806386d54506146200087a5780638a4d3fa814620008b45780638cd22b2214620008d257600080fd5b80634bf6c88211620002fb578063663706d3116200029157806376e7d6d6116200025c57806376e7d6d6146200080d5780638129fc1c1462000825578063831d65d1146200083d5780638456cb59146200086257600080fd5b8063663706d3146200073a5780636ec01b27146200076b5780636f8e2fa414620007c357806375cc7d8914620007e857600080fd5b80635949187111620002d25780635949187114620006a25780635e7cc1c914620006c757806363a036b514620006ec57806364028fbd146200072357600080fd5b80634bf6c882146200063b5780634d99dd1614620006655780634e6fd6c4146200068a57600080fd5b80631fa8882b1162000371578063449ecfe61162000348578063449ecfe6146200058757806345211bfd14620005ac5780634838d16514620005d15780634a49ac4c146200061657600080fd5b80631fa8882b146200053157806338409988146200054a578063417c73a7146200056257600080fd5b8063092193ab11620003b2578063092193ab146200047c5780630e9fbf5114620004935780631182b87514620004b857806317b4f35314620004ec57600080fd5b8063046f7da214620003fb578063059ddd2214620004135780630661806e146200045557600080fd5b36620003f65760345460ff16600114620003f457600080fd5b005b600080fd5b3480156200040857600080fd5b50620003f462000c69565b3480156200042057600080fd5b50620004386200043236600462009440565b62000cfb565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200046257600080fd5b506200046d60365481565b6040519081526020016200044c565b620003f46200048d36600462009440565b62001110565b348015620004a057600080fd5b50620003f4620004b2366004620094a4565b6200174e565b348015620004c557600080fd5b50620004dd620004d7366004620094e9565b62001a7a565b6040516200044c91906200959c565b348015620004f957600080fd5b50620004386200050b36600462009692565b80516020818301810180516045825292820191909301209152546001600160a01b031681565b3480156200053e57600080fd5b506200046d6201518081565b3480156200055757600080fd5b506200046d60375481565b3480156200056f57600080fd5b50620003f46200058136600462009440565b62001ded565b3480156200059457600080fd5b50620003f4620005a636600462009440565b62001e6f565b348015620005b957600080fd5b50620003f4620005cb36600462009440565b62002054565b348015620005de57600080fd5b5062000605620005f036600462009440565b60016020526000908152604090205460ff1681565b60405190151581526020016200044c565b3480156200062357600080fd5b50620003f46200063536600462009440565b62002231565b3480156200064857600080fd5b5062000652600881565b60405160ff90911681526020016200044c565b3480156200067257600080fd5b50620003f462000684366004620096e7565b620022ad565b3480156200069757600080fd5b506200043861dead81565b348015620006af57600080fd5b50620003f4620006c136600462009725565b620028ca565b348015620006d457600080fd5b50620003f4620006e636600462009795565b6200369c565b348015620006f957600080fd5b50620007116200070b366004620097b5565b620038a4565b6040516200044c94939291906200981e565b620003f462000734366004620098da565b62003f36565b3480156200074757600080fd5b506200046d6200075936600462009440565b60446020526000908152604090205481565b3480156200077857600080fd5b50620007906200078a36600462009440565b62004580565b6040805182516001600160401b03908116825260208085015182169083015292820151909216908201526060016200044c565b348015620007d057600080fd5b50620004dd620007e236600462009440565b6200462a565b348015620007f557600080fd5b50620003f46200080736600462009440565b62004a43565b3480156200081a57600080fd5b506200046d603d5481565b3480156200083257600080fd5b50620003f462004c15565b3480156200084a57600080fd5b50620003f46200085c366004620094e9565b62004f2c565b3480156200086f57600080fd5b50620003f462004f96565b3480156200088757600080fd5b50620004386200089936600462009440565b6043602052600090815260409020546001600160a01b031681565b348015620008c157600080fd5b506200046d670de0b6b3a764000081565b348015620008df57600080fd5b506200046d620008f1366004620096e7565b6200502e565b620003f462000908366004620099b2565b620050e7565b3480156200091b57600080fd5b50620009336200092d36600462009440565b62005771565b6040516200044c9190620099f0565b3480156200094f57600080fd5b50620003f462000961366004620096e7565b62005a5e565b3480156200097457600080fd5b50620003f46200098636600462009a6d565b62005acb565b3480156200099957600080fd5b5060005462010000900460ff1662000605565b348015620009b957600080fd5b50620003f4620009cb36600462009b26565b6200696a565b348015620009de57600080fd5b506200046d603c5481565b348015620009f657600080fd5b5062000a0e62000a08366004620097b5565b62006b37565b6040516200044c9392919062009b82565b34801562000a2c57600080fd5b50620003f462000a3e36600462009440565b62006d13565b34801562000a5157600080fd5b506200046d60385481565b34801562000a6957600080fd5b5062000a8162000a7b36600462009440565b62006fd5565b604080519384529115156020840152908201526060016200044c565b34801562000aaa57600080fd5b506200046d61271081565b34801562000ac257600080fd5b50620003f462000ad436600462009bdf565b62007405565b34801562000ae757600080fd5b50620003f462000af936600462009cc8565b62007609565b34801562000b0c57600080fd5b506200046d603b5481565b34801562000b2457600080fd5b506200046d60495481565b34801562000b3c57600080fd5b506200043862000b4e36600462009440565b620076ff565b34801562000b6157600080fd5b506200046d60355481565b34801562000b7957600080fd5b506200046d603a5481565b34801562000b9157600080fd5b506200046d62000ba336600462009692565b805160208183018101805160468252928201919093012091525481565b34801562000bcd57600080fd5b506200046d603e5481565b34801562000be557600080fd5b5062000652601181565b34801562000bfc57600080fd5b506200046d62000c0e366004620096e7565b62007b16565b34801562000c2157600080fd5b50620003f462000c3336600462009a6d565b62007b87565b34801562000c4657600080fd5b506200046d60395481565b34801562000c5e57600080fd5b506200046d604a5481565b600054630100000090046001600160a01b0316331462000c9c576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff1662000cc657604051636cd6020160e01b815260040160405180910390fd5b6000805462ff0000191681556040517f62451d457bc659158be6e6247f56ec1df424a5c7597f71c20c2bc44e0965c8f99190a1565b6001600160a01b038082166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054929384939091608084019162000d669062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462000d949062009d2e565b801562000de55780601f1062000db95761010080835404028352916020019162000de5565b820191906000526020600020905b81548152906001019060200180831162000dc757829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462000e109062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462000e3e9062009d2e565b801562000e8f5780601f1062000e635761010080835404028352916020019162000e8f565b820191906000526020600020905b81548152906001019060200180831162000e7157829003601f168201915b5050505050815260200160018201805462000eaa9062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462000ed89062009d2e565b801562000f295780601f1062000efd5761010080835404028352916020019162000f29565b820191906000526020600020905b81548152906001019060200180831162000f0b57829003601f168201915b5050505050815260200160028201805462000f449062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462000f729062009d2e565b801562000fc35780601f1062000f975761010080835404028352916020019162000fc3565b820191906000526020600020905b81548152906001019060200180831162000fa557829003601f168201915b5050505050815260200160038201805462000fde9062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200100c9062009d2e565b80156200105d5780601f1062001031576101008083540402835291602001916200105d565b820191906000526020600020905b8154815290600101906020018083116200103f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620010e9575050509190925250509051949350505050565b33611000146200113c57604051630f22c43960e41b815261100060048201526024015b60405180910390fd5b6001600160a01b03808216600090815260436020908152604080832054841680845260418352818420825161016081018452815487168152600182015487169481019490945260028101549095169183019190915260038401546060830152600484018054919491608084019190620011b59062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620011e39062009d2e565b8015620012345780601f10620012085761010080835404028352916020019162001234565b820191906000526020600020905b8154815290600101906020018083116200121657829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200125f9062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200128d9062009d2e565b8015620012de5780601f10620012b257610100808354040283529160200191620012de565b820191906000526020600020905b815481529060010190602001808311620012c057829003601f168201915b50505050508152602001600182018054620012f99062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620013279062009d2e565b8015620013785780601f106200134c5761010080835404028352916020019162001378565b820191906000526020600020905b8154815290600101906020018083116200135a57829003601f168201915b50505050508152602001600282018054620013939062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620013c19062009d2e565b8015620014125780601f10620013e65761010080835404028352916020019162001412565b820191906000526020600020905b815481529060010190602001808311620013f457829003601f168201915b505050505081526020016003820180546200142d9062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200145b9062009d2e565b8015620014ac5780601f106200148057610100808354040283529160200191620014ac565b820191906000526020600020905b8154815290600101906020018083116200148e57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162001538575050509190925250505060408101519091506001600160a01b031615806200157557508060e001515b156200163257604051611002903490600081818185875af1925050503d8060008114620015bf576040519150601f19603f3d011682016040523d82523d6000602084013e620015c4565b606091505b505050816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620016259060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160c0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200168957600080fd5b505af11580156200169e573d6000803e3d6000fd5b5050505050816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620016df91815260200190565b60405180910390a26040808201519051633041949b60e01b815261200591633041949b91620017149190869060040162009d64565b600060405180830381600087803b1580156200172f57600080fd5b505af115801562001744573d6000803e3d6000fd5b5050505050505b50565b33611001146200177657604051630f22c43960e41b8152611001600482015260240162001133565b60005462010000900460ff1615620017a157604051631785c68160e01b815260040160405180910390fd5b600060458383604051620017b792919062009d7e565b908152604051908190036020019020546001600160a01b03169050620017df603f8262007ddb565b620017fd5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062001825620151804262009da4565b604a546000828152604b602052604090205491925011620018595760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b602052604081208054600192906200187a90849062009dc7565b909155505060405160469062001894908790879062009d7e565b908152602001604051809103902054600014158015620018e55750426201518060468787604051620018c892919062009d7e565b908152602001604051809103902054620018e3919062009dc7565b105b156200190457604051631898eb6b60e01b815260040160405180910390fd5b6000806200191485600262007dfe565b91509150816200193757604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af11580156200198a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b0919062009ddd565b9050620019be858362007e88565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb283836002604051620019fe9392919062009e0d565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162001a3c916001600160a01b0316908a9060040162009d64565b600060405180830381600087803b15801562001a5757600080fd5b505af115801562001a6c573d6000803e3d6000fd5b505050505050505050505050565b6060336120001462001aa457604051630f22c43960e41b8152612000600482015260240162001133565b60005462010000900460ff161562001acf57604051631785c68160e01b815260040160405180910390fd5b6034805460ff19166001179055604080516020601f8501819004810282018101909252838152600091829162001b209187908790819084018382808284376000920191909152506200804f92505050565b915091508062001b435760405163035ede3560e21b815260040160405180910390fd5b816060015160000362001b69575050604080516000815260208101909152905062001ddc565b606082015160405163e04c83a760e01b81526000916110049163e04c83a79162001b999160040190815260200190565b6020604051808303816000875af115801562001bb9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bdf919062009e3c565b90508062001c865782602001516001600160a01b031683600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a8560600151600160405162001c3b92919062009e5c565b60405180910390a385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092965062001ddc95505050505050565b600062001c9384620081b2565b9050600081600481111562001cac5762001cac62009df7565b0362001cce575050604080516000815260208101909152925062001ddc915050565b6040516000906110049047908381818185875af1925050503d806000811462001d14576040519150601f19603f3d011682016040523d82523d6000602084013e62001d19565b606091505b505090508062001d3c576040516312171d8360e31b815260040160405180910390fd5b84602001516001600160a01b031685600001516001600160a01b03167fa9084c89a291b43bc984e045671d394974730a159b9a826b577bb148ab504c3a87606001518560405162001d8f92919062009e5c565b60405180910390a387878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092985062001ddc975050505050505050565b6034805460ff191690559392505050565b600054630100000090046001600160a01b0316331462001e20576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f7fd26be6fc92aff63f1f4409b2b2ddeb272a888031d7f55ec830485ec61941869190a250565b60005462010000900460ff161562001e9a57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562001ecc5760405163b1d02c3d60e01b815260040160405180910390fd5b8062001eda603f8262007ddb565b62001ef85760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166000908152604160205260409020600a81015460ff1662001f3657604051634b6b857d60e01b815260040160405180910390fd5b6036546002820154604051630913db4760e01b81526001600160a01b03868116600483015290911690630913db4790602401602060405180830381865afa15801562001f86573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001fac919062009ddd565b101562001fcc576040516317b204bf60e11b815260040160405180910390fd5b4281600b0154111562001ff25760405163170cb76760e21b815260040160405180910390fd5b600a8101805460ff1916905560498054600191906000906200201690849062009e83565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b60005462010000900460ff16156200207f57604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620020b15760405163b1d02c3d60e01b815260040160405180910390fd5b33620020bf603f8262007ddb565b620020dd5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0382166200210557604051636520611b60e11b815260040160405180910390fd5b6001600160a01b03828116600090815260436020526040902054161515806200214657506001600160a01b03821660009081526047602052604090205460ff165b156200216557604051631e6f587560e11b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200218b90620151809062009dc7565b1115620021ab57604051631f92cdbd60e11b815260040160405180910390fd5b80546001600160a01b039081166000908152604460209081526040808320429081905585548986166001600160a01b031991821681178855600c88019290925581855260439093528184208054958816959093168517909255519092917f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b600054630100000090046001600160a01b0316331462002264576040516306fbb1e360e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe0db3499b7fdc3da4cddff5f45d694549c19835e7f719fb5606d3ad1a5de40119190a250565b60005462010000900460ff1615620022d857604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff16156200230a5760405163b1d02c3d60e01b815260040160405180910390fd5b8162002318603f8262007ddb565b620023365760405163056e881160e01b815260040160405180910390fd5b816000036200235857604051639811e0c760e01b815260040160405180910390fd5b6001600160a01b0380841660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620023c09062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620023ee9062009d2e565b80156200243f5780601f1062002413576101008083540402835291602001916200243f565b820191906000526020600020905b8154815290600101906020018083116200242157829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200246a9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620024989062009d2e565b8015620024e95780601f10620024bd57610100808354040283529160200191620024e9565b820191906000526020600020905b815481529060010190602001808311620024cb57829003601f168201915b50505050508152602001600182018054620025049062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620025329062009d2e565b8015620025835780601f10620025575761010080835404028352916020019162002583565b820191906000526020600020905b8154815290600101906020018083116200256557829003601f168201915b505050505081526020016002820180546200259e9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620025cc9062009d2e565b80156200261d5780601f10620025f1576101008083540402835291602001916200261d565b820191906000526020600020905b815481529060010190602001808311620025ff57829003601f168201915b50505050508152602001600382018054620026389062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620026669062009d2e565b8015620026b75780601f106200268b57610100808354040283529160200191620026b7565b820191906000526020600020905b8154815290600101906020018083116200269957829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002743575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af1158015620027bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027e3919062009ddd565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b40829802878460405162002834929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b0316036200286157620028618662008808565b6040808301519051633041949b60e01b815261200591633041949b916200288e9190879060040162009d64565b600060405180830381600087803b158015620028a957600080fd5b505af1158015620028be573d6000803e3d6000fd5b50505050505050505050565b60005462010000900460ff1615620028f557604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620029275760405163b1d02c3d60e01b815260040160405180910390fd5b8362002935603f8262007ddb565b620029535760405163056e881160e01b815260040160405180910390fd5b8362002961603f8262007ddb565b6200297f5760405163056e881160e01b815260040160405180910390fd5b6034805460ff191660011790556000849003620029af57604051639811e0c760e01b815260040160405180910390fd5b846001600160a01b0316866001600160a01b031603620029e25760405163f0e3e62960e01b815260040160405180910390fd5b6001600160a01b038087166000908152604160209081526040808320815161016081018352815486168152600182015486169381019390935260028101549094169082015260038301546060820152600483018054339491608084019162002a4a9062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002a789062009d2e565b801562002ac95780601f1062002a9d5761010080835404028352916020019162002ac9565b820191906000526020600020905b81548152906001019060200180831162002aab57829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002af49062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002b229062009d2e565b801562002b735780601f1062002b475761010080835404028352916020019162002b73565b820191906000526020600020905b81548152906001019060200180831162002b5557829003601f168201915b5050505050815260200160018201805462002b8e9062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002bbc9062009d2e565b801562002c0d5780601f1062002be15761010080835404028352916020019162002c0d565b820191906000526020600020905b81548152906001019060200180831162002bef57829003601f168201915b5050505050815260200160028201805462002c289062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002c569062009d2e565b801562002ca75780601f1062002c7b5761010080835404028352916020019162002ca7565b820191906000526020600020905b81548152906001019060200180831162002c8957829003601f168201915b5050505050815260200160038201805462002cc29062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002cf09062009d2e565b801562002d415780601f1062002d155761010080835404028352916020019162002d41565b820191906000526020600020905b81548152906001019060200180831162002d2357829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162002dcd57505050919092525050506001600160a01b0380891660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162002e589062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002e869062009d2e565b801562002ed75780601f1062002eab5761010080835404028352916020019162002ed7565b820191906000526020600020905b81548152906001019060200180831162002eb957829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462002f029062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002f309062009d2e565b801562002f815780601f1062002f555761010080835404028352916020019162002f81565b820191906000526020600020905b81548152906001019060200180831162002f6357829003601f168201915b5050505050815260200160018201805462002f9c9062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462002fca9062009d2e565b80156200301b5780601f1062002fef576101008083540402835291602001916200301b565b820191906000526020600020905b81548152906001019060200180831162002ffd57829003601f168201915b50505050508152602001600282018054620030369062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620030649062009d2e565b8015620030b55780601f106200308957610100808354040283529160200191620030b5565b820191906000526020600020905b8154815290600101906020018083116200309757829003601f168201915b50505050508152602001600382018054620030d09062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620030fe9062009d2e565b80156200314f5780601f1062003123576101008083540402835291602001916200314f565b820191906000526020600020905b8154815290600101906020018083116200313157829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620031db5750505050508152505090508060e0015180156200321e5750876001600160a01b0316836001600160a01b031614155b156200323d57604051636468920360e01b815260040160405180910390fd5b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af115801562003294573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032ba919062009ddd565b9050603754811015620032e05760405163dc6f0bdd60e01b815260040160405180910390fd5b896001600160a01b0316846001600160a01b03161480156200337557506036546040808501519051630913db4760e01b81526001600160a01b038d8116600483015290911690630913db4790602401602060405180830381865afa1580156200334d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003373919062009ddd565b105b1562003394576040516317b204bf60e11b815260040160405180910390fd5b6000612710603a5483620033a9919062009e99565b620033b5919062009da4565b9050600083604001516001600160a01b03168260405160006040518083038185875af1925050503d80600081146200340a576040519150601f19603f3d011682016040523d82523d6000602084013e6200340f565b606091505b505090508062003432576040516312171d8360e31b815260040160405180910390fd5b6200343e828462009e83565b60408086015190516317066a5760e21b81526001600160a01b03898116600483015292955060009290911690635c19a95c90869060240160206040518083038185885af115801562003494573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620034bb919062009ddd565b9050866001600160a01b03168c6001600160a01b03168e6001600160a01b03167ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b48e858960405162003520939291909283526020830191909152604082015260600190565b60405180910390a460408051600280825260608201835260009260208301908036833701905050905086604001518160008151811062003564576200356462009eb3565b60200260200101906001600160a01b031690816001600160a01b0316815250508560400151816001815181106200359f576200359f62009eb3565b6001600160a01b0390921660209283029190910190910152604051634484077560e01b815261200590634484077590620035e09084908c9060040162009ec9565b600060405180830381600087803b158015620035fb57600080fd5b505af115801562003610573d6000803e3d6000fd5b505050508a1562003682576120056001600160a01b031663e5ed5b1e898f6040518363ffffffff1660e01b81526004016200364d92919062009d64565b600060405180830381600087803b1580156200366857600080fd5b505af11580156200367d573d6000803e3d6000fd5b505050505b50506034805460ff19169055505050505050505050505050565b60005462010000900460ff1615620036c757604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620036f95760405163b1d02c3d60e01b815260040160405180910390fd5b3362003707603f8262007ddb565b620037255760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c81015442906200374b90620151809062009dc7565b11156200376b57604051631f92cdbd60e11b815260040160405180910390fd5b60098101546001600160401b03600160401b90910481169085161115620037a55760405163dc81db8560e01b815260040160405180910390fd5b60098101546000906001600160401b039081169086161015620037e3576009820154620037dd9086906001600160401b031662009ef5565b620037fd565b6009820154620037fd906001600160401b03168662009ef5565b60098301546001600160401b039182169250600160801b900416811115620038385760405163dc81db8560e01b815260040160405180910390fd5b60098201805467ffffffffffffffff19166001600160401b03871690811790915542600c8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b60608060606000620038b7603f6200892e565b90508086101562003f2d578415620038d05784620038d2565b805b9450600085620038e3888462009e83565b11620038fb57620038f5878362009e83565b620038fd565b855b9050806001600160401b038111156200391a576200391a620095b1565b60405190808252806020026020018201604052801562003944578160200160208202803683370190505b509450806001600160401b03811115620039625762003962620095b1565b6040519080825280602002602001820160405280156200398c578160200160208202803683370190505b509350806001600160401b03811115620039aa57620039aa620095b1565b604051908082528060200260200182016040528015620039df57816020015b6060815260200190600190039081620039c95790505b50925060005b8181101562003f2a57600062003a0962003a00838b62009dc7565b603f9062008939565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549495509193909291608084019162003a769062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462003aa49062009d2e565b801562003af55780601f1062003ac95761010080835404028352916020019162003af5565b820191906000526020600020905b81548152906001019060200180831162003ad757829003601f168201915b505050505081526020016005820160405180608001604052908160008201805462003b209062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462003b4e9062009d2e565b801562003b9f5780601f1062003b735761010080835404028352916020019162003b9f565b820191906000526020600020905b81548152906001019060200180831162003b8157829003601f168201915b5050505050815260200160018201805462003bba9062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462003be89062009d2e565b801562003c395780601f1062003c0d5761010080835404028352916020019162003c39565b820191906000526020600020905b81548152906001019060200180831162003c1b57829003601f168201915b5050505050815260200160028201805462003c549062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462003c829062009d2e565b801562003cd35780601f1062003ca75761010080835404028352916020019162003cd3565b820191906000526020600020905b81548152906001019060200180831162003cb557829003601f168201915b5050505050815260200160038201805462003cee9062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462003d1c9062009d2e565b801562003d6d5780601f1062003d415761010080835404028352916020019162003d6d565b820191906000526020600020905b81548152906001019060200180831162003d4f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162003df9575050505050815250509050806000015188848151811062003e325762003e3262009eb3565b60200260200101906001600160a01b031690816001600160a01b0316815250508060e0015162003ecb5780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003e9f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003ec5919062009ddd565b62003ece565b60005b87848151811062003ee35762003ee362009eb3565b602002602001018181525050806080015186848151811062003f095762003f0962009eb3565b602002602001018190525050508062003f229062009f18565b9050620039e5565b50505b92959194509250565b60005462010000900460ff161562003f6157604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562003f935760405163b1d02c3d60e01b815260040160405180910390fd5b3362003fa1603f8262007ddb565b1562003fc057604051635f28f62b60e01b815260040160405180910390fd5b6001600160a01b03888116600090815260436020526040902054161515806200400157506001600160a01b03881660009081526047602052604090205460ff165b156200402057604051631e6f587560e11b815260040160405180910390fd5b60006001600160a01b0316604588886040516200403f92919062009d7e565b908152604051908190036020019020546001600160a01b0316141580620040895750604887876040516200407592919062009d7e565b9081526040519081900360200190205460ff165b15620040a8576040516311fdb94760e01b815260040160405180910390fd5b6000620040b6838062009f34565b604051602001620040c992919062009d7e565b60408051601f1981840301815291815281516020928301206000818152604290935291205490915060ff1615620041135760405163c0bf414360e01b815260040160405180910390fd5b600062004129670de0b6b3a76400003462009e83565b90506036548110156200414f576040516317b204bf60e11b815260040160405180910390fd5b6001600160a01b038a166200417757604051636520611b60e11b815260040160405180910390fd5b6113886200418c604087016020880162009795565b6001600160401b03161180620041d25750620041af604086016020870162009795565b6001600160401b0316620041c7602087018762009795565b6001600160401b0316115b80620042115750620041eb604086016020870162009795565b6001600160401b031662004206606087016040880162009795565b6001600160401b0316115b15620042305760405163dc81db8560e01b815260040160405180910390fd5b6200427b62004240858062009f34565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200894792505050565b6200429957604051635dba5ad760e01b815260040160405180910390fd5b620042a8838a8a8a8a62008ae9565b620042c657604051631647e3cb60e11b815260040160405180910390fd5b60006200431484620042d9878062009f34565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062008c1992505050565b905062004323603f8562008d1a565b506000838152604260209081526040808320805460ff191660019081179091556001600160a01b0380891680865260419094529190932080548f83166001600160a01b031991821617825593810180548516909317909255600282018054918516919093161790915542600382015560048101620043a38b8d8362009fdc565b508560058201620043b582826200a0a4565b5087905060098201620043c982826200a1dd565b505042600c8201556001600160a01b038c81166000908152604360205260409081902080546001600160a01b0319169288169290921790915551859060459062004417908e908e9062009d7e565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03168d6001600160a01b03167faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d8e8e6040516200449a9291906200a2ad565b60405180910390a460408051848152602081018590526001600160a01b0387169182916000805160206200b7b4833981519152910160405180910390a360408051670de0b6b3a7640000808252602082015261dead916001600160a01b038816916000805160206200b7b4833981519152910160405180910390a3604051633041949b60e01b815261200590633041949b906200453e908590899060040162009d64565b600060405180830381600087803b1580156200455957600080fd5b505af11580156200456e573d6000803e3d6000fd5b50505050505050505050505050505050565b604080516060810182526000808252602082018190529181019190915281620045ab603f8262007ddb565b620045c95760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602090815260409182902082516060810184526009909101546001600160401b038082168352600160401b8204811693830193909352600160801b90049091169181019190915291505b50919050565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082810191909152600484018054919491608084019190620046979062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620046c59062009d2e565b8015620047165780601f10620046ea5761010080835404028352916020019162004716565b820191906000526020600020905b815481529060010190602001808311620046f857829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620047419062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200476f9062009d2e565b8015620047c05780601f106200479457610100808354040283529160200191620047c0565b820191906000526020600020905b815481529060010190602001808311620047a257829003601f168201915b50505050508152602001600182018054620047db9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620048099062009d2e565b80156200485a5780601f106200482e576101008083540402835291602001916200485a565b820191906000526020600020905b8154815290600101906020018083116200483c57829003601f168201915b50505050508152602001600282018054620048759062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620048a39062009d2e565b8015620048f45780601f10620048c857610100808354040283529160200191620048f4565b820191906000526020600020905b815481529060010190602001808311620048d657829003601f168201915b505050505081526020016003820180546200490f9062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200493d9062009d2e565b80156200498e5780601f1062004962576101008083540402835291602001916200498e565b820191906000526020600020905b8154815290600101906020018083116200497057829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162004a1a5750505091909252505050608001519392505050565b336110011462004a6b57604051630f22c43960e41b8152611001600482015260240162001133565b6001600160a01b038082166000908152604360205260409020541662004a93603f8262007ddb565b62004ab15760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038181166000908152604160205260408082206002810154603b54925163045bc4d160e41b81526004810193909352909316906345bc4d10906024016020604051808303816000875af115801562004b14573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062004b3a919062009ddd565b90506000603d544262004b4e919062009dc7565b905062004b5c838262007e88565b836001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28284600160405162004b9c9392919062009e0d565b60405180910390a26002830154604051633041949b60e01b815261200591633041949b9162004bda916001600160a01b031690889060040162009d64565b600060405180830381600087803b15801562004bf557600080fd5b505af115801562004c0a573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff161580801562004c365750600054600160ff909116105b8062004c525750303b15801562004c52575060005460ff166001145b62004cb75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162001133565b6000805460ff19166001179055801562004cdb576000805461ff0019166101001790555b33411462004cfc5760405163022d8c9560e31b815260040160405180910390fd5b3a1562004d1c576040516383f1b1d360e01b815260040160405180910390fd5b611388603555686c6b935b8bbd400000603655670de0b6b3a7640000603755600960385562093a806039556002603a819055678ac7230489e80000603b55680ad78ebc5ac6200000603c556202a300603d5562069780603e55604a5560408051610220810190915261020080825260609182916200b5b4602083013980602001905181019062004dad91906200a2e9565b915060405180610360016040528061034081526020016200b7d4610340913980602001905181019062004de191906200a38d565b905060005b825181101562004e505760016047600085848151811062004e0b5762004e0b62009eb3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905562004e488162009f18565b905062004de6565b5060005b815181101562004ec1576001604883838151811062004e775762004e7762009eb3565b602002602001015160405162004e8e91906200a48a565b908152604051908190036020019020805491151560ff1990921691909117905562004eb98162009f18565b905062004e54565b5062004ee17330151da466ec8ab345bef3d6983023e050fb067362008d31565b505080156200174b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b336120001462004f5457604051630f22c43960e41b8152612000600482015260240162001133565b7faa5ba621c8b3d7d05bb9e51a7506108251d4d5dbe542ca66fc7bb52aacb02b6583838360405162004f89939291906200a4a8565b60405180910390a1505050565b600054630100000090046001600160a01b0316331462004fc9576040516306fbb1e360e01b815260040160405180910390fd5b60005462010000900460ff161562004ff457604051631785c68160e01b815260040160405180910390fd5b6000805462ff00001916620100001781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b60006200503d603f8462007ddb565b6200505b5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b0383811660009081526041602052604090819020600201549051636bbf224960e01b815260048101859052911690636bbf2249906024015b602060405180830381865afa158015620050b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620050de919062009ddd565b90505b92915050565b60005462010000900460ff16156200511257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620051445760405163b1d02c3d60e01b815260040160405180910390fd5b8162005152603f8262007ddb565b620051705760405163056e881160e01b815260040160405180910390fd5b6037543490811015620051965760405163dc6f0bdd60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180543394916080840191620051fe9062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200522c9062009d2e565b80156200527d5780601f1062005251576101008083540402835291602001916200527d565b820191906000526020600020905b8154815290600101906020018083116200525f57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620052a89062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620052d69062009d2e565b8015620053275780601f10620052fb5761010080835404028352916020019162005327565b820191906000526020600020905b8154815290600101906020018083116200530957829003601f168201915b50505050508152602001600182018054620053429062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620053709062009d2e565b8015620053c15780601f106200539557610100808354040283529160200191620053c1565b820191906000526020600020905b815481529060010190602001808311620053a357829003601f168201915b50505050508152602001600282018054620053dc9062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200540a9062009d2e565b80156200545b5780601f106200542f576101008083540402835291602001916200545b565b820191906000526020600020905b8154815290600101906020018083116200543d57829003601f168201915b50505050508152602001600382018054620054769062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620054a49062009d2e565b8015620054f55780601f10620054c957610100808354040283529160200191620054f5565b820191906000526020600020905b815481529060010190602001808311620054d757829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620055815750505050508152505090508060e001518015620055c45750856001600160a01b0316826001600160a01b031614155b15620055e357604051636468920360e01b815260040160405180910390fd5b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562005634573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200565b919062009ddd565b9050826001600160a01b0316876001600160a01b03166000805160206200b7b483398151915283876040516200569b929190918252602082015260400190565b60405180910390a36040808301519051633041949b60e01b815261200591633041949b91620056d09190879060040162009d64565b600060405180830381600087803b158015620056eb57600080fd5b505af115801562005700573d6000803e3d6000fd5b50505050851562001744576040516372f6ad8f60e11b81526120059063e5ed5b1e90620057349086908b9060040162009d64565b600060405180830381600087803b1580156200574f57600080fd5b505af115801562005764573d6000803e3d6000fd5b5050505050505050505050565b6200579d6040518060800160405280606081526020016060815260200160608152602001606081525090565b81620057ab603f8262007ddb565b620057c95760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03831660009081526041602052604090819020815160808101909252600501805482908290620058009062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200582e9062009d2e565b80156200587f5780601f1062005853576101008083540402835291602001916200587f565b820191906000526020600020905b8154815290600101906020018083116200586157829003601f168201915b505050505081526020016001820180546200589a9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620058c89062009d2e565b8015620059195780601f10620058ed5761010080835404028352916020019162005919565b820191906000526020600020905b815481529060010190602001808311620058fb57829003601f168201915b50505050508152602001600282018054620059349062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620059629062009d2e565b8015620059b35780601f106200598757610100808354040283529160200191620059b3565b820191906000526020600020905b8154815290600101906020018083116200599557829003601f168201915b50505050508152602001600382018054620059ce9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620059fc9062009d2e565b801562005a4d5780601f1062005a215761010080835404028352916020019162005a4d565b820191906000526020600020905b81548152906001019060200180831162005a2f57829003601f168201915b505050505081525050915050919050565b60005462010000900460ff161562005a8957604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562005abb5760405163b1d02c3d60e01b815260040160405180910390fd5b62005ac7828262008dca565b5050565b336110071462005af357604051630f22c43960e41b8152611007600482015260240162001133565b62005b606040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b1562005c1b576020811462005b925783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f840181900481028201810190925282815260009162005bd591858580838501838280828437600092019190915250929392505062008f339050565b90506108fc81108062005be9575061271081115b1562005c125784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b60355562006925565b62005c8c6040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b1562005d56576020811462005cbe5783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f840181900481028201810190925282815260009162005d0191858580838501838280828437600092019190915250929392505062008f339050565b9050683635c9adc5dea0000081108062005d24575069152d02c7e14af680000081115b1562005d4d5784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b60365562006925565b62005dc9604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b1562005e90576020811462005dfb5783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f840181900481028201810190925282815260009162005e3e91858580838501838280828437600092019190915250929392505062008f339050565b905067016345785d8a000081108062005e5e5750678ac7230489e8000081115b1562005e875784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b60375562006925565b62005f01604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b1562005fb9576020811462005f335783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f840181900481028201810190925282815260009162005f7691858580838501838280828437600092019190915250929392505062008f339050565b905080158062005f8757506101f481115b1562005fb05784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b60385562006925565b620060226040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b15620060df5760208114620060545783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f84018190048102820181019092528281526000916200609791858580838501838280828437600092019190915250929392505062008f339050565b90506203f480811080620060ad575062278d0081115b15620060d65784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b60395562006925565b6200614d60405180604001604052806011815260200170726564656c65676174654665655261746560781b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b15620061fa57602081146200617f5783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f8401819004810282018101909252828152600091620061c291858580838501838280828437600092019190915250929392505062008f339050565b90506064811115620061f15784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b603a5562006925565b6200626a60405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b156200632b57602081146200629c5783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f8401819004810282018101909252828152600091620062df91858580838501838280828437600092019190915250929392505062008f339050565b9050674563918244f40000811080620062f95750603c5481115b15620063225784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b603b5562006925565b620063996040518060400160405280601181526020017019995b1bdb9e54db185cda105b5bdd5b9d607a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b156200645c5760208114620063cb5783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f84018190048102820181019092528281526000916200640e91858580838501838280828437600092019190915250929392505062008f339050565b905068056bc75e2d631000008110806200642a5750603b548111155b15620064535784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b603c5562006925565b620064c96040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b15620065865760208114620064fb5783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f84018190048102820181019092528281526000916200653e91858580838501838280828437600092019190915250929392505062008f339050565b90506202a300811080620065545750603e548110155b156200657d5784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b603d5562006925565b620065f16040518060400160405280600e81526020016d66656c6f6e794a61696c54696d6560901b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b15620066ae5760208114620066235783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f84018190048102820181019092528281526000916200666691858580838501838280828437600092019190915250929392505062008f339050565b9050620d2f008110806200667c5750603d548111155b15620066a55784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b603e5562006925565b620067286040518060400160405280601c81526020017f6d617846656c6f6e794265747765656e42726561746865426c6f636b0000000081525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b15620067d457602081146200675a5783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b604080516020601f84018190048102820181019092528281526000916200679d91858580838501838280828437600092019190915250929392505062008f339050565b905080600003620067cb5784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b604a5562006925565b620068426040518060400160405280601181526020017039ba30b5b2a43ab1283937ba32b1ba37b960791b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008ed69050565b15620069025760148114620068745783838383604051630a5a604160e01b81526004016200113394939291906200a4c7565b6000620068bc601484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062008f339050565b90506001600160a01b038116620068f05784848484604051630a5a604160e01b81526004016200113394939291906200a4c7565b620068fb8162008f38565b5062006925565b838383836040516325ee20d560e21b81526004016200113394939291906200a4c7565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516200695c94939291906200a4c7565b60405180910390a150505050565b60005462010000900460ff16156200699557604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620069c75760405163b1d02c3d60e01b815260040160405180910390fd5b816000816001600160401b03811115620069e557620069e5620095b1565b60405190808252806020026020018201604052801562006a0f578160200160208202803683370190505b5090506000805b8381101562006b0d5762006a5887878381811062006a385762006a3862009eb3565b905060200201602081019062006a4f919062009440565b603f9062007ddb565b62006a765760405163056e881160e01b815260040160405180910390fd5b6041600088888481811062006a8f5762006a8f62009eb3565b905060200201602081019062006aa6919062009440565b6001600160a01b039081168252602082019290925260400160002060020154845191169250829084908390811062006ae25762006ae262009eb3565b6001600160a01b039092166020928302919091019091015262006b058162009f18565b905062006a16565b50604051634484077560e01b8152612005906344840775906200288e908590889060040162009ec9565b606080600062006b48603f6200892e565b90508085101562006d0c57831562006b61578362006b63565b805b935060008462006b74878462009e83565b1162006b8c5762006b86868362009e83565b62006b8e565b845b9050806001600160401b0381111562006bab5762006bab620095b1565b60405190808252806020026020018201604052801562006bd5578160200160208202803683370190505b509350806001600160401b0381111562006bf35762006bf3620095b1565b60405190808252806020026020018201604052801562006c1d578160200160208202803683370190505b50925060005b8181101562006d095762006c3c62003a00828962009dc7565b85828151811062006c515762006c5162009eb3565b60200260200101906001600160a01b031690816001600160a01b0316815250506041600086838151811062006c8a5762006c8a62009eb3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060020160009054906101000a90046001600160a01b031684828151811062006cde5762006cde62009eb3565b6001600160a01b039092166020928302919091019091015262006d018162009f18565b905062006c23565b50505b9250925092565b336110011462006d3b57604051630f22c43960e41b8152611001600482015260240162001133565b60005462010000900460ff161562006d6657604051631785c68160e01b815260040160405180910390fd5b6001600160a01b038082166000908152604360205260409020541662006d8e603f8262007ddb565b62006dac5760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03811660009081526041602052604081209062006dd4620151804262009da4565b604a546000828152604b60205260409020549192501162006e085760405163bd52fcdb60e01b815260040160405180910390fd5b6000818152604b6020526040812080546001929062006e2990849062009dc7565b90915550506001600160a01b0384166000908152604460205260409020541580159062006e7e57506001600160a01b038416600090815260446020526040902054429062006e7c90620151809062009dc7565b105b1562006e9d576040516330abb81d60e21b815260040160405180910390fd5b60008062006ead85600062007dfe565b915091508162006ed057604051631b919bb160e11b815260040160405180910390fd5b6002840154603c5460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562006f23573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062006f49919062009ddd565b905062006f57858362007e88565b856001600160a01b03167f6e9a2ee7aee95665e3a774a212eb11441b217e3e4656ab9563793094689aabb28383600060405162006f979392919062009e0d565b60405180910390a26002850154604051633041949b60e01b815261200591633041949b9162005734916001600160a01b0316908a9060040162009d64565b6001600160a01b0380821660009081526041602090815260408083208151610160810183528154861681526001820154861693810193909352600281015490941690820152600383015460608201526004830180549293849384938493909291608084019190620070469062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620070749062009d2e565b8015620070c55780601f106200709957610100808354040283529160200191620070c5565b820191906000526020600020905b815481529060010190602001808311620070a757829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620070f09062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200711e9062009d2e565b80156200716f5780601f1062007143576101008083540402835291602001916200716f565b820191906000526020600020905b8154815290600101906020018083116200715157829003601f168201915b505050505081526020016001820180546200718a9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620071b89062009d2e565b8015620072095780601f10620071dd5761010080835404028352916020019162007209565b820191906000526020600020905b815481529060010190602001808311620071eb57829003601f168201915b50505050508152602001600282018054620072249062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620072529062009d2e565b8015620072a35780601f106200727757610100808354040283529160200191620072a3565b820191906000526020600020905b8154815290600101906020018083116200728557829003601f168201915b50505050508152602001600382018054620072be9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620072ec9062009d2e565b80156200733d5780601f1062007311576101008083540402835291602001916200733d565b820191906000526020600020905b8154815290600101906020018083116200731f57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620073c95750505091909252505050606081015160e0820151610100909201519097919650945092505050565b60005462010000900460ff16156200743057604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620074625760405163b1d02c3d60e01b815260040160405180910390fd5b3362007470603f8262007ddb565b6200748e5760405163056e881160e01b815260040160405180910390fd5b336000818152604160205260409020600c8101544290620074b490620151809062009dc7565b1115620074d457604051631f92cdbd60e11b815260040160405180910390fd5b600581018054620074e59062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620075139062009d2e565b8015620075645780601f10620075385761010080835404028352916020019162007564565b820191906000526020600020905b8154815290600101906020018083116200754657829003601f168201915b50505082875250859160058401915081906200758190826200a4f2565b50602082015160018201906200759890826200a4f2565b5060408201516002820190620075af90826200a4f2565b5060608201516003820190620075c690826200a4f2565b505042600c830155506040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b60005462010000900460ff16156200763457604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff1615620076665760405163b1d02c3d60e01b815260040160405180910390fd5b82811462007687576040516341abc80160e01b815260040160405180910390fd5b60005b83811015620076f857620076e5858583818110620076ac57620076ac62009eb3565b9050602002016020810190620076c3919062009440565b848484818110620076d857620076d862009eb3565b9050602002013562008dca565b620076f08162009f18565b90506200768a565b5050505050565b6001600160a01b03808216600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492938493909160808401916200776a9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620077989062009d2e565b8015620077e95780601f10620077bd57610100808354040283529160200191620077e9565b820191906000526020600020905b815481529060010190602001808311620077cb57829003601f168201915b5050505050815260200160058201604051806080016040529081600082018054620078149062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620078429062009d2e565b8015620078935780601f10620078675761010080835404028352916020019162007893565b820191906000526020600020905b8154815290600101906020018083116200787557829003601f168201915b50505050508152602001600182018054620078ae9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620078dc9062009d2e565b80156200792d5780601f1062007901576101008083540402835291602001916200792d565b820191906000526020600020905b8154815290600101906020018083116200790f57829003601f168201915b50505050508152602001600282018054620079489062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620079769062009d2e565b8015620079c75780601f106200799b57610100808354040283529160200191620079c7565b820191906000526020600020905b815481529060010190602001808311620079a957829003601f168201915b50505050508152602001600382018054620079e29062009d2e565b80601f016020809104026020016040519081016040528092919081815260200182805462007a109062009d2e565b801562007a615780601f1062007a355761010080835404028352916020019162007a61565b820191906000526020600020905b81548152906001019060200180831162007a4357829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b81548152602001906001019080831162007aed5750505091909252505050604001519392505050565b600062007b25603f8462007ddb565b62007b435760405163056e881160e01b815260040160405180910390fd5b6001600160a01b038381166000908152604160205260409081902060020154905163aa1966cd60e01b81526004810185905291169063aa1966cd906024016200509a565b60005462010000900460ff161562007bb257604051631785c68160e01b815260040160405180910390fd5b3360009081526001602052604090205460ff161562007be45760405163b1d02c3d60e01b815260040160405180910390fd5b3362007bf2603f8262007ddb565b62007c105760405163056e881160e01b815260040160405180910390fd5b3362007c20818787878762008ae9565b62007c3e57604051631647e3cb60e11b815260040160405180910390fd5b60006001600160a01b03166045878760405162007c5d92919062009d7e565b908152604051908190036020019020546001600160a01b031614158062007ca757506048868660405162007c9392919062009d7e565b9081526040519081900360200190205460ff165b1562007cc6576040516311fdb94760e01b815260040160405180910390fd5b6001600160a01b0381166000908152604160205260409020600c810154429062007cf590620151809062009dc7565b111562007d1557604051631f92cdbd60e11b815260040160405180910390fd5b4260468260040160405162007d2b91906200a5ba565b908152604051908190036020019020556004810162007d4c87898362009fdc565b5042600c820155604051829060459062007d6a908a908a9062009d7e565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d9062007dca908a908a906200a2ad565b60405180910390a250505050505050565b6001600160a01b03811660009081526001830160205260408120541515620050de565b6000806000848460405160200162007e189291906200a638565b60408051601f1981840301815291815281516020928301206000818152604c9093529120549091504281111562007e585760008093509350505062007e81565b603e5462007e67904262009dc7565b6000928352604c6020526040909220829055506001925090505b9250929050565b8154604051631507fdb760e11b81526001600160a01b03909116600482015261100090632a0ffb6e90602401600060405180830381600087803b15801562007ecf57600080fd5b505af115801562007ee4573d6000803e3d6000fd5b505050506000600162007ef8603f6200892e565b62007f04919062009e83565b604954108015915062007fc25760405163d31f968d60e01b81526110006004820152600860248201526120009063d31f968d90604401602060405180830381865afa15801562007f58573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062007f7e919062009e3c565b62007fc25760018301546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a2505050565b82600b015482111562007fd757600b83018290555b600a83015460ff166200804a57600a8301805460ff19166001908117909155604980546000906200800a90849062009dc7565b909155505060018301546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25b505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845283820183905283860183905283018290528451808601865282815281018290528451808601909552855185528581019085015291928290620080c19062008fa4565b90506000805b620080d28362009017565b15620081a557806000036200810757620080f6620080f0846200903d565b620090a1565b6001600160a01b0316845262008192565b8060010362008133576200811f620080f0846200903d565b6001600160a01b0316602085015262008192565b806002036200815f576200814b620080f0846200903d565b6001600160a01b0316604085015262008192565b806003036200818c576200817d62008177846200903d565b620090b9565b60608501526001915062008192565b620081a5565b6200819d8162009f18565b9050620080c7565b5091959194509092505050565b6020808201516001600160a01b031660009081526001909152604081205460ff1680620081ea575060208201516001600160a01b0316155b15620081f857506004919050565b81516200820890603f9062007ddb565b6200821557506002919050565b81516001600160a01b03908116600090815260416020908152604080832081516101608101835281548616815260018201548616938101939093526002810154909416908201526003830154606082015260048301805492939192608084019190620082819062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620082af9062009d2e565b8015620083005780601f10620082d45761010080835404028352916020019162008300565b820191906000526020600020905b815481529060010190602001808311620082e257829003601f168201915b50505050508152602001600582016040518060800160405290816000820180546200832b9062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620083599062009d2e565b8015620083aa5780601f106200837e57610100808354040283529160200191620083aa565b820191906000526020600020905b8154815290600101906020018083116200838c57829003601f168201915b50505050508152602001600182018054620083c59062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620083f39062009d2e565b8015620084445780601f10620084185761010080835404028352916020019162008444565b820191906000526020600020905b8154815290600101906020018083116200842657829003601f168201915b505050505081526020016002820180546200845f9062009d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546200848d9062009d2e565b8015620084de5780601f10620084b257610100808354040283529160200191620084de565b820191906000526020600020905b815481529060010190602001808311620084c057829003601f168201915b50505050508152602001600382018054620084f99062009d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054620085279062009d2e565b8015620085785780601f106200854c5761010080835404028352916020019162008578565b820191906000526020600020905b8154815290600101906020018083116200855a57829003601f168201915b505050919092525050508152604080516060808201835260098501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600a84015460ff16151582840152600b84015490830152600c8301546080830152805161028081019182905260a09092019190600d84019060149082845b815481526020019060010190808311620086045750505050508152505090508060e0015180156200864f575082600001516001600160a01b031683602001516001600160a01b031614155b156200865e5750600392915050565b6040808201516060850151602086015192516317066a5760e21b81526001600160a01b03938416600482015260009390921691635c19a95c919060240160206040518083038185885af1158015620086ba573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620086e1919062009ddd565b905083602001516001600160a01b031684600001516001600160a01b03166000805160206200b7b48339815191528387606001516040516200872d929190918252602082015260400190565b60405180910390a383602001516001600160a01b031684600001516001600160a01b03167f607b17598da6bdca05650a2fc08bd2bc8e38c3236806a0fa8e0daabc1d6cb1d883876060015160405162008790929190918252602082015260400190565b60405180910390a360408083015160208601519151633041949b60e01b815261200592633041949b92620087ca9290919060040162009d64565b600060405180830381600087803b158015620087e557600080fd5b505af1158015620087fa573d6000803e3d6000fd5b506000979650505050505050565b6001600160a01b0381166000908152604160205260409020600a81015460ff161562008832575050565b6036546002820154604051630913db4760e01b81526001600160a01b03858116600483015290911690630913db4790602401602060405180830381865afa15801562008882573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620088a8919062009ddd565b101562005ac757620088ca81603d5442620088c4919062009dc7565b62007e88565b80546040516335409f7f60e01b81526001600160a01b039091166004820152611000906335409f7f90602401600060405180830381600087803b1580156200891157600080fd5b505af115801562008926573d6000803e3d6000fd5b505050505050565b6000620050e1825490565b6000620050de838362009191565b6000808290506003815110806200895f575060098151115b156200896e5750600092915050565b60418160008151811062008986576200898662009eb3565b016020015160f81c1080620089b85750605a81600081518110620089ae57620089ae62009eb3565b016020015160f81c115b15620089c75750600092915050565b60015b815181101562008adf576030828281518110620089eb57620089eb62009eb3565b016020015160f81c108062008a1c5750603982828151811062008a125762008a1262009eb3565b016020015160f81c115b801562008a6c5750604182828151811062008a3b5762008a3b62009eb3565b016020015160f81c108062008a6c5750605a82828151811062008a625762008a6262009eb3565b016020015160f81c115b801562008abc5750606182828151811062008a8b5762008a8b62009eb3565b016020015160f81c108062008abc5750607a82828151811062008ab25762008ab262009eb3565b016020015160f81c115b1562008acc575060009392505050565b62008ad78162009f18565b9050620089ca565b5060019392505050565b600060308414158062008afd575060608214155b1562008b0c5750600062008c10565b60008686864660405160200162008b2794939291906200a676565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a60405160200162008b819594939291906200a6a3565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa62008bcb57600080fd5b5060008160008151811062008be45762008be462009eb3565b016020015160f81c90506001811462008c065760009550505050505062008c10565b6001955050505050505b95945050505050565b60008061200361dead60405162008c30906200941c565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f08015801562008c73573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b815260040162008ca79291906200a6db565b6000604051808303818588803b15801562008cc157600080fd5b505af115801562008cd6573d6000803e3d6000fd5b50506040516001600160a01b038086169450881692507fd481492e4e93bb36b4c12a5af93f03be3bf04b454dfbc35dd2663fa26f44d5b09150600090a39392505050565b6000620050de836001600160a01b038416620091be565b600054610100900460ff1662008d9e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001133565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b8162008dd8603f8262007ddb565b62008df65760405163056e881160e01b815260040160405180910390fd5b6001600160a01b03838116600090815260416020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af115801562008e5a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062008e80919062009ddd565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd39926838360405162008ec891815260200190565b60405180910390a350505050565b60008160405160200162008eeb91906200a48a565b604051602081830303815290604052805190602001208360405160200162008f1491906200a48a565b6040516020818303038152906040528051906020012014905092915050565b015190565b600080546040516001600160a01b0380851693630100000090930416917f44fc1b38a4abaa91ebd1b628a5b259a698f86238c8217d68f516e87769c60c0b91a3600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b604080516080810182526000918101828152606082018390528152602081019190915262008fd28262009210565b62008fdc57600080fd5b600062008fed836020015162009243565b836020015162008ffe919062009dc7565b6040805180820190915293845260208401525090919050565b805180516020820151600092916200902f9162009dc7565b836020015110915050919050565b60408051808201909152600080825260208201526200905c8262009017565b6200906657600080fd5b602082015160006200907882620092d2565b905062009086818362009dc7565b60209485015260408051808201909152908152928301525090565b8051600090601514620090b357600080fd5b620050e1825b805160009015801590620090cf57508151602110155b620090d957600080fd5b6000620090ea836020015162009243565b90508083600001511015620091425760405162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015260640162001133565b82516000906200915490839062009e83565b90506000808386602001516200916b919062009dc7565b90508051915060208310156200918857826020036101000a820491505b50949350505050565b6000826000018281548110620091ab57620091ab62009eb3565b9060005260206000200154905092915050565b60008181526001830160205260408120546200920757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620050e1565b506000620050e1565b805160009081036200922457506000919050565b6020820151805160001a9060c082101562008adf575060009392505050565b8051600090811a60808110156200925d5750600092915050565b60b88110806200927a575060c081108015906200927a575060f881105b15620092895750600192915050565b60c0811015620092c457620092a1600160b86200a701565b620092b09060ff168262009e83565b620092bd90600162009dc7565b9392505050565b620092a1600160f86200a701565b80516000908190811a6080811015620092ef576001915062009415565b60b88110156200931b576200930660808262009e83565b6200931390600162009dc7565b915062009415565b60c08110156200939457600060b78203600186019550806020036101000a8651049150600181018201935050808310156200938d5760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001133565b5062009415565b60f8811015620093ab576200930660c08262009e83565b600060f78203600186019550806020036101000a865104915060018101820193505080831015620094135760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015260640162001133565b505b5092915050565b610e96806200a71e83390190565b6001600160a01b03811681146200174b57600080fd5b6000602082840312156200945357600080fd5b8135620092bd816200942a565b60008083601f8401126200947357600080fd5b5081356001600160401b038111156200948b57600080fd5b60208301915083602082850101111562007e8157600080fd5b60008060208385031215620094b857600080fd5b82356001600160401b03811115620094cf57600080fd5b620094dd8582860162009460565b90969095509350505050565b600080600060408486031215620094ff57600080fd5b833560ff811681146200951157600080fd5b925060208401356001600160401b038111156200952d57600080fd5b6200953b8682870162009460565b9497909650939450505050565b60005b83811015620095655781810151838201526020016200954b565b50506000910152565b600081518084526200958881602086016020860162009548565b601f01601f19169290920160200192915050565b602081526000620050de60208301846200956e565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620095ec57620095ec620095b1565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200961d576200961d620095b1565b604052919050565b60006001600160401b03821115620096415762009641620095b1565b50601f01601f191660200190565b600062009666620096608462009625565b620095f2565b90508281528383830111156200967b57600080fd5b828260208301376000602084830101529392505050565b600060208284031215620096a557600080fd5b81356001600160401b03811115620096bc57600080fd5b8201601f81018413620096ce57600080fd5b620096df848235602084016200964f565b949350505050565b60008060408385031215620096fb57600080fd5b823562009708816200942a565b946020939093013593505050565b80151581146200174b57600080fd5b600080600080608085870312156200973c57600080fd5b843562009749816200942a565b935060208501356200975b816200942a565b9250604085013591506060850135620097748162009716565b939692955090935050565b6001600160401b03811681146200174b57600080fd5b600060208284031215620097a857600080fd5b8135620092bd816200977f565b60008060408385031215620097c957600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015620098135781516001600160a01b031687529582019590820190600101620097ec565b509495945050505050565b608081526000620098336080830187620097d8565b82810360208481019190915286518083528782019282019060005b818110156200986c578451835293830193918301916001016200984e565b5050848103604086015286518082528282019350600581901b8201830183890160005b83811015620098c157601f19858403018752620098ae8383516200956e565b968601969250908501906001016200988f565b5050809550505050505082606083015295945050505050565b600080600080600080600087890360e0811215620098f757600080fd5b883562009904816200942a565b975060208901356001600160401b03808211156200992157600080fd5b6200992f8c838d0162009460565b909950975060408b01359150808211156200994957600080fd5b620099578c838d0162009460565b90975095508591506060605f19840112156200997257600080fd5b60608b01945060c08b01359250808311156200998d57600080fd5b505088016080818b031215620099a257600080fd5b8091505092959891949750929550565b60008060408385031215620099c657600080fd5b8235620099d3816200942a565b91506020830135620099e58162009716565b809150509250929050565b60208152600082516080602084015262009a0e60a08401826200956e565b90506020840151601f198085840301604086015262009a2e83836200956e565b9250604086015191508085840301606086015262009a4d83836200956e565b925060608601519150808584030160808601525062008c1082826200956e565b6000806000806040858703121562009a8457600080fd5b84356001600160401b038082111562009a9c57600080fd5b62009aaa8883890162009460565b9096509450602087013591508082111562009ac457600080fd5b5062009ad38782880162009460565b95989497509550505050565b60008083601f84011262009af257600080fd5b5081356001600160401b0381111562009b0a57600080fd5b6020830191508360208260051b850101111562007e8157600080fd5b60008060006040848603121562009b3c57600080fd5b83356001600160401b0381111562009b5357600080fd5b62009b618682870162009adf565b909450925050602084013562009b77816200942a565b809150509250925092565b60608152600062009b976060830186620097d8565b828103602084015262009bab8186620097d8565b915050826040830152949350505050565b600082601f83011262009bce57600080fd5b620050de838335602085016200964f565b60006020828403121562009bf257600080fd5b81356001600160401b038082111562009c0a57600080fd5b908301906080828603121562009c1f57600080fd5b62009c29620095c7565b82358281111562009c3957600080fd5b62009c478782860162009bbc565b82525060208301358281111562009c5d57600080fd5b62009c6b8782860162009bbc565b60208301525060408301358281111562009c8457600080fd5b62009c928782860162009bbc565b60408301525060608301358281111562009cab57600080fd5b62009cb98782860162009bbc565b60608301525095945050505050565b6000806000806040858703121562009cdf57600080fd5b84356001600160401b038082111562009cf757600080fd5b62009d058883890162009adf565b9096509450602087013591508082111562009d1f57600080fd5b5062009ad38782880162009adf565b600181811c9082168062009d4357607f821691505b6020821081036200462457634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b60008262009dc257634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620050e157620050e162009d8e565b60006020828403121562009df057600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260208101839052606081016003831062009e2e5762009e2e62009df7565b826040830152949350505050565b60006020828403121562009e4f57600080fd5b8151620092bd8162009716565b828152604081016005831062009e765762009e7662009df7565b8260208301529392505050565b81810381811115620050e157620050e162009d8e565b8082028115828204841417620050e157620050e162009d8e565b634e487b7160e01b600052603260045260246000fd5b60408152600062009ede6040830185620097d8565b905060018060a01b03831660208301529392505050565b6001600160401b0382811682821603908082111562009415576200941562009d8e565b60006001820162009f2d5762009f2d62009d8e565b5060010190565b6000808335601e1984360301811262009f4c57600080fd5b8301803591506001600160401b0382111562009f6757600080fd5b60200191503681900382131562007e8157600080fd5b601f8211156200804a57600081815260208120601f850160051c8101602086101562009fa65750805b601f850160051c820191505b81811015620089265782815560010162009fb2565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562009ff65762009ff6620095b1565b6200a00e836200a007835462009d2e565b8362009f7d565b6000601f8411600181146200a04157600085156200a02c5750838201355b6200a038868262009fc7565b845550620076f8565b600083815260209020601f19861690835b828110156200a07457868501358255602094850194600190920191016200a052565b50868210156200a0925760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6200a0b0828362009f34565b6001600160401b038111156200a0ca576200a0ca620095b1565b6200a0e2816200a0db855462009d2e565b8562009f7d565b6000601f8211600181146200a11557600083156200a1005750838201355b6200a10c848262009fc7565b8655506200a172565b600085815260209020601f19841690835b828110156200a14857868501358255602094850194600190920191016200a126565b50848210156200a1665760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506200a185602083018362009f34565b6200a19581836001860162009fdc565b50506200a1a6604083018362009f34565b6200a1b681836002860162009fdc565b50506200a1c7606083018362009f34565b6200a1d781836003860162009fdc565b50505050565b81356200a1ea816200977f565b6001600160401b03811690508154816001600160401b0319821617835560208401356200a217816200977f565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff198316841781178555908501356200a257816200977f565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000620096df6020830184866200a284565b60006001600160401b038211156200a2df576200a2df620095b1565b5060051b60200190565b600060208083850312156200a2fd57600080fd5b82516001600160401b038111156200a31457600080fd5b8301601f810185136200a32657600080fd5b80516200a33762009660826200a2c3565b81815260059190911b820183019083810190878311156200a35757600080fd5b928401925b828410156200a3825783516200a372816200942a565b825292840192908401906200a35c565b979650505050505050565b600060208083850312156200a3a157600080fd5b82516001600160401b03808211156200a3b957600080fd5b818501915085601f8301126200a3ce57600080fd5b81516200a3df62009660826200a2c3565b81815260059190911b830184019084810190888311156200a3ff57600080fd5b8585015b838110156200a47d578051858111156200a41d5760008081fd5b8601603f81018b136200a4305760008081fd5b8781015160406200a445620096608362009625565b8281528d828486010111156200a45b5760008081fd5b6200a46c838c830184870162009548565b86525050509186019186016200a403565b5098975050505050505050565b600082516200a49e81846020870162009548565b9190910192915050565b60ff8416815260406020820152600062008c106040830184866200a284565b6040815260006200a4dd6040830186886200a284565b82810360208401526200a3828185876200a284565b81516001600160401b038111156200a50e576200a50e620095b1565b6200a526816200a51f845462009d2e565b8462009f7d565b602080601f8311600181146200a55a57600084156200a5455750858301515b6200a551858262009fc7565b86555062008926565b600085815260208120601f198616915b828110156200a58b578886015182559484019460019091019084016200a56a565b50858210156200a5aa5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200a5ca8162009d2e565b600182811680156200a5e557600181146200a5fb576200a62c565b60ff19841687528215158302870194506200a62c565b8760005260208060002060005b858110156200a6235781548a8201529084019082016200a608565b50505082870194505b50929695505050505050565b6bffffffffffffffffffffffff198360601b1681526000600383106200a662576200a66262009df7565b5060f89190911b6014820152601501919050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b600086516200a6b7818460208b0162009548565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b0383168152604060208201819052600090620096df908301846200956e565b60ff8281168282160390811115620050e157620050e162009d8e56fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000001284214b9b9c85549ab3d2b972df0deef66ac2c9000000000000000000000000a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0000000000000000000000000980a75ecd1309ea12fa2ed87a8744fbfc9b863d5000000000000000000000000b71b214cb885500844365e95cd9942c7276e7fd800000000000000000000000035552c16704d214347f29fa77f77da6d75d7c752000000000000000000000000f474cf03cceff28abc65c9cbae594f725c80e12d00000000000000000000000096c5d20b2a975c050e4220be276ace4892f4b41a00000000000000000000000047788386d0ed6c748e03a53160b4b30ed3748cc5000000000000000000000000bdfbc016c1bd481f5d8ca6f754f4b200a7ed66ce000000000000000000000000372e4887005ec21a5aff9ff62eda9e7713e3643700000000000000000000000055c968cf3430f3ba0534ef49ff4b3fbc9086c7ce000000000000000000000000136bd6343049c9690569db79dcd9208a57d342ad000000000000000000000000977ecef7de795cd248d77fd0d080ce3a35dec013000000000000000000000000b334ced91dff560bc9b5b3c30ae613bf335f181324d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000308e82934ca974fdcd97f3309de967d3c9c43fa711a8d673af5d75465844bf8969c8d1948d903748ac7b8b1720fa64e50c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b973c2d38487e58fd6e145491b110080fb14ac915a0411fc78f19e09a399ddee0d20c63a75d8f930f1694544ad2dc01b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003089037a9ace3b590165ea1c0c5ac72bf600b7c88c1e435f41932c1132aae1bfa0bb68e46b96ccb12c3415e4d82af717d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a2750ec6dded3dcdc2f351782310b0eadc077db59abca0f0cd26776e2e7acb9f3bce40b1fa5221fd1561226c6263cc5f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b742ad4855bae330426b823e742da31f816cc83bc16d69a9134be0cfb4a1d17ec34f1b5b32d5c20440b8536b1e88f0f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003096c9b86c3400e529bfe184056e257c07940bb664636f689e8d2027c834681f8f878b73445261034e946bb2d901b4b87800000000000000000000000000000000a164736f6c6343000811000a", + }, + }, + } + + feynmanFixUpgrade[rialtoNet] = &Upgrade{ + UpgradeName: "feynmanFix", + Configs: []*UpgradeConfig{}, + } } func UpgradeBuildInSystemContract(config *params.ChainConfig, blockNumber *big.Int, lastBlockTime uint64, blockTime uint64, statedb *state.StateDB) { @@ -736,6 +765,10 @@ func UpgradeBuildInSystemContract(config *params.ChainConfig, blockNumber *big.I applySystemContractUpgrade(feynmanUpgrade[network], blockNumber, statedb, logger) } + if config.IsOnFeynmanFix(blockNumber, lastBlockTime, blockTime) { + applySystemContractUpgrade(feynmanFixUpgrade[network], blockNumber, statedb, logger) + } + /* apply other upgrades */ diff --git a/core/txpool/blobpool/blobpool.go b/core/txpool/blobpool/blobpool.go index a0504123f5..792f851ee2 100644 --- a/core/txpool/blobpool/blobpool.go +++ b/core/txpool/blobpool/blobpool.go @@ -1081,6 +1081,16 @@ func (p *BlobPool) SetGasTip(tip *big.Int) { // validateTx checks whether a transaction is valid according to the consensus // rules and adheres to some heuristic limits of the local node (price and size). func (p *BlobPool) validateTx(tx *types.Transaction) error { + sender, err := types.Sender(p.signer, tx) + if err != nil { + return err + } + for _, blackAddr := range types.NanoBlackList { + if sender == blackAddr || (tx.To() != nil && *tx.To() == blackAddr) { + log.Error("blacklist account detected", "account", blackAddr, "tx", tx.Hash()) + return txpool.ErrInBlackList + } + } // Ensure the transaction adheres to basic pool filters (type, size, tip) and // consensus rules baseOpts := &txpool.ValidationOptions{ @@ -1133,8 +1143,12 @@ func (p *BlobPool) validateTx(tx *types.Transaction) error { next = p.state.GetNonce(from) ) if uint64(len(p.index[from])) > tx.Nonce()-next { - // Account can support the replacement, but the price bump must also be met prev := p.index[from][int(tx.Nonce()-next)] + // Ensure the transaction is different than the one tracked locally + if prev.hash == tx.Hash() { + return txpool.ErrAlreadyKnown + } + // Account can support the replacement, but the price bump must also be met switch { case tx.GasFeeCapIntCmp(prev.execFeeCap.ToBig()) <= 0: return fmt.Errorf("%w: new tx gas fee cap %v <= %v queued", txpool.ErrReplaceUnderpriced, tx.GasFeeCap(), prev.execFeeCap) diff --git a/core/txpool/blobpool/blobpool_test.go b/core/txpool/blobpool/blobpool_test.go index 3e465a9214..aff8609171 100644 --- a/core/txpool/blobpool/blobpool_test.go +++ b/core/txpool/blobpool/blobpool_test.go @@ -992,9 +992,14 @@ func TestAdd(t *testing.T) { }, }, adds: []addtx{ - { // New account, 1 tx pending: reject replacement nonce 0 (ignore price for now) + { // New account, 1 tx pending: reject duplicate nonce 0 from: "alice", tx: makeUnsignedTx(0, 1, 1, 1), + err: txpool.ErrAlreadyKnown, + }, + { // New account, 1 tx pending: reject replacement nonce 0 (ignore price for now) + from: "alice", + tx: makeUnsignedTx(0, 1, 1, 2), err: txpool.ErrReplaceUnderpriced, }, { // New account, 1 tx pending: accept nonce 1 @@ -1017,10 +1022,10 @@ func TestAdd(t *testing.T) { tx: makeUnsignedTx(3, 1, 1, 1), err: nil, }, - { // Old account, 1 tx in chain, 1 tx pending: reject replacement nonce 1 (ignore price for now) + { // Old account, 1 tx in chain, 1 tx pending: reject duplicate nonce 1 from: "bob", tx: makeUnsignedTx(1, 1, 1, 1), - err: txpool.ErrReplaceUnderpriced, + err: txpool.ErrAlreadyKnown, }, { // Old account, 1 tx in chain, 1 tx pending: accept nonce 2 (ignore price for now) from: "bob", diff --git a/core/txpool/errors.go b/core/txpool/errors.go index 3a6a913976..8298a15993 100644 --- a/core/txpool/errors.go +++ b/core/txpool/errors.go @@ -60,4 +60,7 @@ var ( // input transaction of non-blob type when a blob transaction from this sender // remains pending (and vice-versa). ErrAlreadyReserved = errors.New("address already reserved") + + // ErrInBlackList is returned if the transaction send by banned address + ErrInBlackList = errors.New("sender or to in black list") ) diff --git a/core/txpool/legacypool/legacypool.go b/core/txpool/legacypool/legacypool.go index 8134848f1e..0f3ce8d049 100644 --- a/core/txpool/legacypool/legacypool.go +++ b/core/txpool/legacypool/legacypool.go @@ -61,8 +61,6 @@ var ( // ErrTxPoolOverflow is returned if the transaction pool is full and can't accept // another remote transaction. ErrTxPoolOverflow = errors.New("txpool is full") - - ErrInBlackList = errors.New("sender or to in black list") ) var ( @@ -660,7 +658,7 @@ func (pool *LegacyPool) validateTxBasics(tx *types.Transaction, local bool) erro for _, blackAddr := range types.NanoBlackList { if sender == blackAddr || (tx.To() != nil && *tx.To() == blackAddr) { log.Error("blacklist account detected", "account", blackAddr, "tx", tx.Hash()) - return ErrInBlackList + return txpool.ErrInBlackList } } @@ -692,7 +690,7 @@ func (pool *LegacyPool) validateTx(tx *types.Transaction, local bool) error { for _, blackAddr := range types.NanoBlackList { if sender == blackAddr || (tx.To() != nil && *tx.To() == blackAddr) { log.Error("blacklist account detected", "account", blackAddr, "tx", tx.Hash()) - return ErrInBlackList + return txpool.ErrInBlackList } } diff --git a/core/types/bid.go b/core/types/bid.go index 6d7796acfc..2826bb7f69 100644 --- a/core/types/bid.go +++ b/core/types/bid.go @@ -181,4 +181,5 @@ type BidIssue struct { type MevParams struct { ValidatorCommission uint64 // 100 means 1% BidSimulationLeftOver time.Duration + GasCeil uint64 } diff --git a/core/types/blob_sidecar.go b/core/types/blob_sidecar.go new file mode 100644 index 0000000000..d4f63602d0 --- /dev/null +++ b/core/types/blob_sidecar.go @@ -0,0 +1,55 @@ +package types + +import ( + "bytes" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rlp" +) + +type BlobSidecars []*BlobSidecar + +// Len returns the length of s. +func (s BlobSidecars) Len() int { return len(s) } + +// EncodeIndex encodes the i'th BlobTxSidecar to w. Note that this does not check for errors +// because we assume that BlobSidecars will only ever contain valid sidecars +func (s BlobSidecars) EncodeIndex(i int, w *bytes.Buffer) { + rlp.Encode(w, s[i]) +} + +type BlobSidecar struct { + BlobTxSidecar + BlockNumber *big.Int `json:"blockNumber"` + BlockHash common.Hash `json:"blockHash"` + TxIndex uint64 `json:"transactionIndex"` + TxHash common.Hash `json:"transactionHash"` +} + +func NewBlobSidecarFromTx(tx *Transaction) *BlobSidecar { + if tx.BlobTxSidecar() == nil { + return nil + } + return &BlobSidecar{ + BlobTxSidecar: *tx.BlobTxSidecar(), + TxHash: tx.Hash(), + } +} + +func (s *BlobSidecar) SanityCheck(blockNumber *big.Int, blockHash common.Hash) error { + if s.BlockNumber.Cmp(blockNumber) != 0 { + return errors.New("BlobSidecar with wrong block number") + } + if s.BlockHash != blockHash { + return errors.New("BlobSidecar with wrong block hash") + } + if len(s.Blobs) != len(s.Commitments) { + return errors.New("BlobSidecar has wrong commitment length") + } + if len(s.Blobs) != len(s.Proofs) { + return errors.New("BlobSidecar has wrong proof length") + } + return nil +} diff --git a/core/types/block.go b/core/types/block.go index ac6066dd9b..a01e09e0cf 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -193,6 +193,12 @@ func (h *Header) EmptyReceipts() bool { return h.ReceiptHash == EmptyReceiptsHash } +// EmptyWithdrawalsHash returns true if there are no WithdrawalsHash for this header/block. +func (h *Header) EmptyWithdrawalsHash() bool { + // TODO(GalaIO): if check EmptyWithdrawalsHash in here? + return h.WithdrawalsHash == nil || *h.WithdrawalsHash == common.Hash{} +} + // Body is a simple (mutable, non-safe) data container for storing and moving // a block's data contents (transactions and uncles) together. type Body struct { @@ -232,6 +238,9 @@ type Block struct { // inter-peer block relay. ReceivedAt time.Time ReceivedFrom interface{} + + // sidecars provides DA check + sidecars BlobSidecars } // "external" block encoding. used for eth protocol, etc. @@ -451,6 +460,14 @@ func (b *Block) SanityCheck() error { return b.header.SanityCheck() } +func (b *Block) Sidecars() BlobSidecars { + return b.sidecars +} + +func (b *Block) CleanSidecars() { + b.sidecars = make(BlobSidecars, 0) +} + type writeCounter uint64 func (c *writeCounter) Write(b []byte) (int, error) { @@ -475,11 +492,17 @@ func NewBlockWithHeader(header *Header) *Block { // WithSeal returns a new block with the data from b but the header replaced with // the sealed one. func (b *Block) WithSeal(header *Header) *Block { + // fill sidecars metadata + for _, sidecar := range b.sidecars { + sidecar.BlockNumber = header.Number + sidecar.BlockHash = header.Hash() + } return &Block{ header: CopyHeader(header), transactions: b.transactions, uncles: b.uncles, withdrawals: b.withdrawals, + sidecars: b.sidecars, } } @@ -490,6 +513,7 @@ func (b *Block) WithBody(transactions []*Transaction, uncles []*Header) *Block { transactions: make([]*Transaction, len(transactions)), uncles: make([]*Header, len(uncles)), withdrawals: b.withdrawals, + sidecars: b.sidecars, } copy(block.transactions, transactions) for i := range uncles { @@ -504,6 +528,7 @@ func (b *Block) WithWithdrawals(withdrawals []*Withdrawal) *Block { header: b.header, transactions: b.transactions, uncles: b.uncles, + sidecars: b.sidecars, } if withdrawals != nil { block.withdrawals = make([]*Withdrawal, len(withdrawals)) @@ -512,6 +537,21 @@ func (b *Block) WithWithdrawals(withdrawals []*Withdrawal) *Block { return block } +// WithSidecars returns a block containing the given blobs. +func (b *Block) WithSidecars(sidecars BlobSidecars) *Block { + block := &Block{ + header: b.header, + transactions: b.transactions, + uncles: b.uncles, + withdrawals: b.withdrawals, + } + if sidecars != nil { + block.sidecars = make(BlobSidecars, len(sidecars)) + copy(block.sidecars, sidecars) + } + return block +} + // Hash returns the keccak256 hash of b's header. // The hash is computed on the first call and cached thereafter. func (b *Block) Hash() common.Hash { diff --git a/core/types/tx_blob.go b/core/types/tx_blob.go index 25a85695ef..158d76e6f1 100644 --- a/core/types/tx_blob.go +++ b/core/types/tx_blob.go @@ -54,9 +54,9 @@ type BlobTx struct { // BlobTxSidecar contains the blobs of a blob transaction. type BlobTxSidecar struct { - Blobs []kzg4844.Blob // Blobs needed by the blob pool - Commitments []kzg4844.Commitment // Commitments needed by the blob pool - Proofs []kzg4844.Proof // Proofs needed by the blob pool + Blobs []kzg4844.Blob `json:"blobs"` // Blobs needed by the blob pool + Commitments []kzg4844.Commitment `json:"commitments"` // Commitments needed by the blob pool + Proofs []kzg4844.Proof `json:"proofs"` // Proofs needed by the blob pool } // BlobHashes computes the blob hashes of the given blobs. diff --git a/core/types/tx_blob_test.go b/core/types/tx_blob_test.go index 25d09e31ce..c7fe3dc321 100644 --- a/core/types/tx_blob_test.go +++ b/core/types/tx_blob_test.go @@ -2,11 +2,15 @@ package types import ( "crypto/ecdsa" + "fmt" "testing" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/ethereum/go-ethereum/rlp" "github.com/holiman/uint256" ) @@ -93,3 +97,56 @@ func createEmptyBlobTxInner(withSidecar bool) *BlobTx { } return blobtx } + +func TestBlobTxSidecars_Encode(t *testing.T) { + tests := []struct { + raw []*BlobTxSidecar + err bool + }{ + { + raw: []*BlobTxSidecar{ + &BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }, + &BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }, + }, + err: false, + }, + { + raw: []*BlobTxSidecar{ + &BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof}, + }, + nil, + }, + err: true, + }, + { + raw: []*BlobTxSidecar{}, + err: false, + }, + } + + for i, item := range tests { + t.Run(fmt.Sprintf("case%d", i), func(t *testing.T) { + enc, err := rlp.EncodeToBytes(item.raw) + require.NoError(t, err) + var nbs []*BlobTxSidecar + err = rlp.DecodeBytes(enc, &nbs) + if item.err { + require.Error(t, err) + return + } + require.NoError(t, err) + require.Equal(t, item.raw, nbs) + }) + } +} diff --git a/core/vm/contracts.go b/core/vm/contracts.go index f9eea9f5cc..5988bb15f7 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -133,20 +133,6 @@ var PrecompiledContractsPlanck = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{101}): &iavlMerkleProofValidatePlanck{}, } -// PrecompiledContractsBerlin contains the default set of pre-compiled Ethereum -// contracts used in the Berlin release. -var PrecompiledContractsBerlin = map[common.Address]PrecompiledContract{ - common.BytesToAddress([]byte{1}): &ecrecover{}, - common.BytesToAddress([]byte{2}): &sha256hash{}, - common.BytesToAddress([]byte{3}): &ripemd160hash{}, - common.BytesToAddress([]byte{4}): &dataCopy{}, - common.BytesToAddress([]byte{5}): &bigModExp{eip2565: true}, - common.BytesToAddress([]byte{6}): &bn256AddIstanbul{}, - common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, - common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, - common.BytesToAddress([]byte{9}): &blake2F{}, -} - // PrecompiledContractsLuban contains the default set of pre-compiled Ethereum // contracts used in the Luban release. var PrecompiledContractsLuban = map[common.Address]PrecompiledContract{ @@ -185,6 +171,20 @@ var PrecompiledContractsPlato = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{103}): &cometBFTLightBlockValidate{}, } +// PrecompiledContractsBerlin contains the default set of pre-compiled Ethereum +// contracts used in the Berlin release. +var PrecompiledContractsBerlin = map[common.Address]PrecompiledContract{ + common.BytesToAddress([]byte{1}): &ecrecover{}, + common.BytesToAddress([]byte{2}): &sha256hash{}, + common.BytesToAddress([]byte{3}): &ripemd160hash{}, + common.BytesToAddress([]byte{4}): &dataCopy{}, + common.BytesToAddress([]byte{5}): &bigModExp{eip2565: true}, + common.BytesToAddress([]byte{6}): &bn256AddIstanbul{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, + common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, + common.BytesToAddress([]byte{9}): &blake2F{}, +} + // PrecompiledContractsHertz contains the default set of pre-compiled Ethereum // contracts used in the Hertz release. var PrecompiledContractsHertz = map[common.Address]PrecompiledContract{ @@ -204,6 +204,27 @@ var PrecompiledContractsHertz = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{103}): &cometBFTLightBlockValidateHertz{}, } +// PrecompiledContractsFeynman contains the default set of pre-compiled Ethereum +// contracts used in the Feynman release. +var PrecompiledContractsFeynman = map[common.Address]PrecompiledContract{ + common.BytesToAddress([]byte{1}): &ecrecover{}, + common.BytesToAddress([]byte{2}): &sha256hash{}, + common.BytesToAddress([]byte{3}): &ripemd160hash{}, + common.BytesToAddress([]byte{4}): &dataCopy{}, + common.BytesToAddress([]byte{5}): &bigModExp{eip2565: true}, + common.BytesToAddress([]byte{6}): &bn256AddIstanbul{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, + common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, + common.BytesToAddress([]byte{9}): &blake2F{}, + + common.BytesToAddress([]byte{100}): &tmHeaderValidate{}, + common.BytesToAddress([]byte{101}): &iavlMerkleProofValidatePlato{}, + common.BytesToAddress([]byte{102}): &blsSignatureVerify{}, + common.BytesToAddress([]byte{103}): &cometBFTLightBlockValidateHertz{}, + common.BytesToAddress([]byte{104}): &verifyDoubleSignEvidence{}, + common.BytesToAddress([]byte{105}): &secp256k1SignatureRecover{}, +} + // PrecompiledContractsCancun contains the default set of pre-compiled Ethereum // contracts used in the Cancun release. var PrecompiledContractsCancun = map[common.Address]PrecompiledContract{ @@ -218,27 +239,6 @@ var PrecompiledContractsCancun = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{9}): &blake2F{}, common.BytesToAddress([]byte{0x0a}): &kzgPointEvaluation{}, - common.BytesToAddress([]byte{100}): &tmHeaderValidate{}, - common.BytesToAddress([]byte{101}): &iavlMerkleProofValidatePlato{}, - common.BytesToAddress([]byte{102}): &blsSignatureVerify{}, - common.BytesToAddress([]byte{103}): &cometBFTLightBlockValidate{}, - common.BytesToAddress([]byte{104}): &verifyDoubleSignEvidence{}, - common.BytesToAddress([]byte{105}): &secp256k1SignatureRecover{}, -} - -// PrecompiledContractsFeynman contains the default set of pre-compiled Ethereum -// contracts used in the Feynman release. -var PrecompiledContractsFeynman = map[common.Address]PrecompiledContract{ - common.BytesToAddress([]byte{1}): &ecrecover{}, - common.BytesToAddress([]byte{2}): &sha256hash{}, - common.BytesToAddress([]byte{3}): &ripemd160hash{}, - common.BytesToAddress([]byte{4}): &dataCopy{}, - common.BytesToAddress([]byte{5}): &bigModExp{eip2565: true}, - common.BytesToAddress([]byte{6}): &bn256AddIstanbul{}, - common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, - common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, - common.BytesToAddress([]byte{9}): &blake2F{}, - common.BytesToAddress([]byte{100}): &tmHeaderValidate{}, common.BytesToAddress([]byte{101}): &iavlMerkleProofValidatePlato{}, common.BytesToAddress([]byte{102}): &blsSignatureVerify{}, @@ -263,17 +263,17 @@ var PrecompiledContractsBLS = map[common.Address]PrecompiledContract{ var ( PrecompiledAddressesCancun []common.Address + PrecompiledAddressesFeynman []common.Address PrecompiledAddressesHertz []common.Address + PrecompiledAddressesBerlin []common.Address PrecompiledAddressesPlato []common.Address PrecompiledAddressesLuban []common.Address PrecompiledAddressesPlanck []common.Address PrecompiledAddressesMoran []common.Address PrecompiledAddressesNano []common.Address - PrecompiledAddressesBerlin []common.Address PrecompiledAddressesIstanbul []common.Address PrecompiledAddressesByzantium []common.Address PrecompiledAddressesHomestead []common.Address - PrecompiledAddressesFeynman []common.Address ) func init() { @@ -286,9 +286,6 @@ func init() { for k := range PrecompiledContractsIstanbul { PrecompiledAddressesIstanbul = append(PrecompiledAddressesIstanbul, k) } - for k := range PrecompiledContractsBerlin { - PrecompiledAddressesBerlin = append(PrecompiledAddressesBerlin, k) - } for k := range PrecompiledContractsNano { PrecompiledAddressesNano = append(PrecompiledAddressesNano, k) } @@ -304,15 +301,18 @@ func init() { for k := range PrecompiledContractsPlato { PrecompiledAddressesPlato = append(PrecompiledAddressesPlato, k) } + for k := range PrecompiledContractsBerlin { + PrecompiledAddressesBerlin = append(PrecompiledAddressesBerlin, k) + } for k := range PrecompiledContractsHertz { PrecompiledAddressesHertz = append(PrecompiledAddressesHertz, k) } - for k := range PrecompiledContractsCancun { - PrecompiledAddressesCancun = append(PrecompiledAddressesCancun, k) - } for k := range PrecompiledContractsFeynman { PrecompiledAddressesFeynman = append(PrecompiledAddressesFeynman, k) } + for k := range PrecompiledContractsCancun { + PrecompiledAddressesCancun = append(PrecompiledAddressesCancun, k) + } } // ActivePrecompiles returns the precompiles enabled with the current configuration. @@ -324,6 +324,8 @@ func ActivePrecompiles(rules params.Rules) []common.Address { return PrecompiledAddressesFeynman case rules.IsHertz: return PrecompiledAddressesHertz + case rules.IsBerlin: + return PrecompiledAddressesBerlin case rules.IsPlato: return PrecompiledAddressesPlato case rules.IsLuban: @@ -334,8 +336,6 @@ func ActivePrecompiles(rules params.Rules) []common.Address { return PrecompiledAddressesMoran case rules.IsNano: return PrecompiledAddressesNano - case rules.IsBerlin: - return PrecompiledAddressesBerlin case rules.IsIstanbul: return PrecompiledAddressesIstanbul case rules.IsByzantium: diff --git a/docs/parlia/README-BEP-127.md b/docs/parlia/README-BEP-127.md index 636ad1ba99..bd83b128ed 100644 --- a/docs/parlia/README-BEP-127.md +++ b/docs/parlia/README-BEP-127.md @@ -39,9 +39,7 @@ web3.eth.sendTransaction({ web3.eth.sendTransaction({ from: "consensus address of your validator", to: "0x0000000000000000000000000000000000001000", + gas: "1000000", data: "0x04c4fec6" }) ``` - - - diff --git a/eth/api_backend.go b/eth/api_backend.go index 344b32348a..a95356065d 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -240,6 +240,9 @@ func (b *EthAPIBackend) GetReceipts(ctx context.Context, hash common.Hash) (type return b.eth.blockchain.GetReceiptsByHash(hash), nil } +func (b *EthAPIBackend) GetBlobSidecars(ctx context.Context, hash common.Hash) (types.BlobSidecars, error) { + return b.eth.blockchain.GetSidecarsByHash(hash), nil +} func (b *EthAPIBackend) GetLogs(ctx context.Context, hash common.Hash, number uint64) ([][]*types.Log, error) { return rawdb.ReadLogs(b.eth.chainDb, hash, number), nil } diff --git a/eth/backend.go b/eth/backend.go index 8dcdc5a466..b14e7e3d7e 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -179,14 +179,6 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { } // Override the chain config with provided settings. var overrides core.ChainOverrides - if config.OverrideShanghai != nil { - chainConfig.ShanghaiTime = config.OverrideShanghai - overrides.OverrideShanghai = config.OverrideShanghai - } - if config.OverrideKepler != nil { - chainConfig.KeplerTime = config.OverrideKepler - overrides.OverrideKepler = config.OverrideKepler - } if config.OverrideCancun != nil { chainConfig.CancunTime = config.OverrideCancun overrides.OverrideCancun = config.OverrideCancun @@ -199,6 +191,18 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { chainConfig.FeynmanTime = config.OverrideFeynman overrides.OverrideFeynman = config.OverrideFeynman } + if config.OverrideFeynmanFix != nil { + chainConfig.FeynmanFixTime = config.OverrideFeynmanFix + overrides.OverrideFeynmanFix = config.OverrideFeynmanFix + } + + // startup ancient freeze + if err = chainDb.SetupFreezerEnv(ðdb.FreezerEnv{ + ChainCfg: chainConfig, + BlobExtraReserve: config.BlobExtraReserve, + }); err != nil { + return nil, err + } networkID := config.NetworkId if networkID == 0 { diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index 1cd8c51b25..480eb03a53 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -874,7 +874,7 @@ func getBody(block *types.Block) *engine.ExecutionPayloadBodyV1 { } // Post-shanghai withdrawals MUST be set to empty slice instead of nil - if withdrawals == nil && block.Header().WithdrawalsHash != nil { + if withdrawals == nil && !block.Header().EmptyWithdrawalsHash() { withdrawals = make([]*types.Withdrawal, 0) } diff --git a/eth/catalyst/simulated_beacon.go b/eth/catalyst/simulated_beacon.go index f1c5689e1d..4ae60ed490 100644 --- a/eth/catalyst/simulated_beacon.go +++ b/eth/catalyst/simulated_beacon.go @@ -18,6 +18,7 @@ package catalyst import ( "crypto/rand" + "crypto/sha256" "errors" "math/big" "sync" @@ -27,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/txpool" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" @@ -161,14 +163,14 @@ func (c *SimulatedBeacon) sealBlock(withdrawals []*types.Withdrawal, timestamp u SuggestedFeeRecipient: feeRecipient, Withdrawals: withdrawals, Random: random, - }, engine.PayloadV2, true) + BeaconRoot: &common.Hash{}, + }, engine.PayloadV3, true) if err != nil { return err } if fcResponse == engine.STATUS_SYNCING { return errors.New("chain rewind prevented invocation of payload creation") } - envelope, err := c.engineAPI.getPayload(*fcResponse.PayloadID, true) if err != nil { return err @@ -186,8 +188,21 @@ func (c *SimulatedBeacon) sealBlock(withdrawals []*types.Withdrawal, timestamp u } } + // Independently calculate the blob hashes from sidecars. + blobHashes := make([]common.Hash, 0) + if envelope.BlobsBundle != nil { + hasher := sha256.New() + for _, commit := range envelope.BlobsBundle.Commitments { + var c kzg4844.Commitment + if len(commit) != len(c) { + return errors.New("invalid commitment length") + } + copy(c[:], commit) + blobHashes = append(blobHashes, kzg4844.CalcBlobHashV1(hasher, &c)) + } + } // Mark the payload as canon - if _, err = c.engineAPI.NewPayloadV2(*payload); err != nil { + if _, err = c.engineAPI.NewPayloadV3(*payload, blobHashes, &common.Hash{}); err != nil { return err } c.setCurrentState(payload.BlockHash, finalizedHash) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 7e7e63bef9..7e57153c28 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -49,7 +49,7 @@ var ( maxQueuedHeaders = 32 * 1024 // [eth/62] Maximum number of headers to queue for import (DOS protection) maxHeadersProcess = 2048 // Number of header download results to import at once into the chain maxResultsProcess = 2048 // Number of content download results to import at once into the chain - fullMaxForkAncestry uint64 = params.FullImmutabilityThreshold // Maximum chain reorganisation (locally redeclared so tests can reduce it) + FullMaxForkAncestry uint64 = params.FullImmutabilityThreshold // Maximum chain reorganisation (locally redeclared so tests can reduce it) lightMaxForkAncestry uint64 = params.LightImmutabilityThreshold // Maximum chain reorganisation (locally redeclared so tests can reduce it) reorgProtThreshold = 48 // Threshold number of recent blocks to disable mini reorg protection @@ -206,6 +206,9 @@ type BlockChain interface { // TrieDB retrieves the low level trie database used for interacting // with trie nodes. TrieDB() *triedb.Database + + // UpdateChasingHead update remote best chain head, used by DA check now. + UpdateChasingHead(head *types.Header) } type DownloadOption func(downloader *Downloader) *Downloader @@ -547,8 +550,8 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td, ttd * // Legacy sync, use the best announcement we have from the remote peer. // TODO(karalabe): Drop this pathway. - if remoteHeight > fullMaxForkAncestry+1 { - d.ancientLimit = remoteHeight - fullMaxForkAncestry - 1 + if remoteHeight > FullMaxForkAncestry+1 { + d.ancientLimit = remoteHeight - FullMaxForkAncestry - 1 } else { d.ancientLimit = 0 } @@ -591,6 +594,8 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td, ttd * } else if mode == FullSync { fetchers = append(fetchers, func() error { return d.processFullSyncContent(ttd, beaconMode) }) } + // update the chasing head + d.blockchain.UpdateChasingHead(remoteHeader) return d.spawnSync(fetchers) } @@ -784,7 +789,7 @@ func (d *Downloader) findAncestor(p *peerConnection, localHeight uint64, remoteH p.log.Debug("Looking for common ancestor", "local", localHeight, "remote", remoteHeight) // Recap floor value for binary search - maxForkAncestry := fullMaxForkAncestry + maxForkAncestry := FullMaxForkAncestry if d.getMode() == LightSync { maxForkAncestry = lightMaxForkAncestry } @@ -1384,7 +1389,7 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error { ) blocks := make([]*types.Block, len(results)) for i, result := range results { - blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles).WithWithdrawals(result.Withdrawals) + blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles).WithWithdrawals(result.Withdrawals).WithSidecars(result.Sidecars) } // Downloaded blocks are always regarded as trusted after the // transition. Because the downloaded chain is guided by the @@ -1595,7 +1600,7 @@ func (d *Downloader) commitSnapSyncData(results []*fetchResult, stateSync *state blocks := make([]*types.Block, len(results)) receipts := make([]types.Receipts, len(results)) for i, result := range results { - blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles).WithWithdrawals(result.Withdrawals) + blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles).WithWithdrawals(result.Withdrawals).WithSidecars(result.Sidecars) receipts[i] = result.Receipts } if index, err := d.blockchain.InsertReceiptChain(blocks, receipts, d.ancientLimit); err != nil { @@ -1606,7 +1611,7 @@ func (d *Downloader) commitSnapSyncData(results []*fetchResult, stateSync *state } func (d *Downloader) commitPivotBlock(result *fetchResult) error { - block := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles).WithWithdrawals(result.Withdrawals) + block := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles).WithWithdrawals(result.Withdrawals).WithSidecars(result.Sidecars) log.Debug("Committing snap sync pivot as new head", "number", block.Number(), "hash", block.Hash()) // Commit the pivot block as the new head, will require full sync from here on diff --git a/eth/downloader/fetchers_concurrent_bodies.go b/eth/downloader/fetchers_concurrent_bodies.go index 5105fda66b..49f3644fd9 100644 --- a/eth/downloader/fetchers_concurrent_bodies.go +++ b/eth/downloader/fetchers_concurrent_bodies.go @@ -89,10 +89,10 @@ func (q *bodyQueue) request(peer *peerConnection, req *fetchRequest, resCh chan // deliver is responsible for taking a generic response packet from the concurrent // fetcher, unpacking the body data and delivering it to the downloader's queue. func (q *bodyQueue) deliver(peer *peerConnection, packet *eth.Response) (int, error) { - txs, uncles, withdrawals := packet.Res.(*eth.BlockBodiesResponse).Unpack() + txs, uncles, withdrawals, sidecars := packet.Res.(*eth.BlockBodiesResponse).Unpack() hashsets := packet.Meta.([][]common.Hash) // {txs hashes, uncle hashes, withdrawal hashes} - accepted, err := q.queue.DeliverBodies(peer.id, txs, hashsets[0], uncles, hashsets[1], withdrawals, hashsets[2]) + accepted, err := q.queue.DeliverBodies(peer.id, txs, hashsets[0], uncles, hashsets[1], withdrawals, hashsets[2], sidecars) switch { case err == nil && len(txs) == 0: peer.log.Trace("Requested bodies delivered") diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index 07c0e79d3a..8a2de4104a 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -71,6 +71,7 @@ type fetchResult struct { Transactions types.Transactions Receipts types.Receipts Withdrawals types.Withdrawals + Sidecars types.BlobSidecars } func newFetchResult(header *types.Header, fastSync bool, pid string) *fetchResult { @@ -80,7 +81,7 @@ func newFetchResult(header *types.Header, fastSync bool, pid string) *fetchResul } if !header.EmptyBody() { item.pending.Store(item.pending.Load() | (1 << bodyType)) - } else if header.WithdrawalsHash != nil { + } else if !header.EmptyWithdrawalsHash() { item.Withdrawals = make(types.Withdrawals, 0) } if fastSync && !header.EmptyReceipts() { @@ -776,7 +777,7 @@ func (q *queue) DeliverHeaders(id string, headers []*types.Header, hashes []comm // also wakes any threads waiting for data delivery. func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListHashes []common.Hash, uncleLists [][]*types.Header, uncleListHashes []common.Hash, - withdrawalLists [][]*types.Withdrawal, withdrawalListHashes []common.Hash) (int, error) { + withdrawalLists [][]*types.Withdrawal, withdrawalListHashes []common.Hash, sidecars []types.BlobSidecars) (int, error) { q.lock.Lock() defer q.lock.Unlock() @@ -787,9 +788,9 @@ func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListH if uncleListHashes[index] != header.UncleHash { return errInvalidBody } - if header.WithdrawalsHash == nil { + if header.EmptyWithdrawalsHash() { // nil hash means that withdrawals should not be present in body - if withdrawalLists[index] != nil { + if len(withdrawalLists[index]) != 0 { return errInvalidBody } } else { // non-nil hash: body must have withdrawals @@ -826,11 +827,21 @@ func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListH if want := *header.BlobGasUsed / params.BlobTxBlobGasPerBlob; uint64(blobs) != want { // div because the header is surely good vs the body might be bloated return errInvalidBody } + if blobs > params.MaxBlobGasPerBlock { + return errInvalidBody + } } else { if blobs != 0 { return errInvalidBody } } + + // do some sanity check for sidecar + for _, sidecar := range sidecars[index] { + if err := sidecar.SanityCheck(header.Number, header.Hash()); err != nil { + return err + } + } return nil } @@ -838,6 +849,7 @@ func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListH result.Transactions = txLists[index] result.Uncles = uncleLists[index] result.Withdrawals = withdrawalLists[index] + result.Sidecars = sidecars[index] result.SetBodyDone() } return q.deliver(id, q.blockTaskPool, q.blockTaskQueue, q.blockPendPool, diff --git a/eth/downloader/queue_test.go b/eth/downloader/queue_test.go index 50b9031a27..c10483b5b2 100644 --- a/eth/downloader/queue_test.go +++ b/eth/downloader/queue_test.go @@ -341,7 +341,7 @@ func XTestDelivery(t *testing.T) { uncleHashes[i] = types.CalcUncleHash(uncles) } time.Sleep(100 * time.Millisecond) - _, err := q.DeliverBodies(peer.id, txset, txsHashes, uncleset, uncleHashes, nil, nil) + _, err := q.DeliverBodies(peer.id, txset, txsHashes, uncleset, uncleHashes, nil, nil, nil) if err != nil { fmt.Printf("delivered %d bodies %v\n", len(txset), err) } diff --git a/eth/downloader/testchain_test.go b/eth/downloader/testchain_test.go index 46f3febd8b..52a8cedf0a 100644 --- a/eth/downloader/testchain_test.go +++ b/eth/downloader/testchain_test.go @@ -57,7 +57,7 @@ var pregenerated bool func init() { // Reduce some of the parameters to make the tester faster - fullMaxForkAncestry = 10000 + FullMaxForkAncestry = 10000 lightMaxForkAncestry = 10000 blockCacheMaxItems = 1024 fsHeaderSafetyNet = 256 @@ -65,7 +65,7 @@ func init() { testChainBase = newTestChain(blockCacheMaxItems+200, testGenesis) - var forkLen = int(fullMaxForkAncestry + 50) + var forkLen = int(FullMaxForkAncestry + 50) var wg sync.WaitGroup // Generate the test chains to seed the peers with diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 38025cde54..17da32e0f8 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -71,7 +71,8 @@ var Defaults = Config{ RPCGasCap: 50000000, RPCEVMTimeout: 5 * time.Second, GPO: FullNodeGPO, - RPCTxFeeCap: 1, // 1 ether + RPCTxFeeCap: 1, // 1 ether + BlobExtraReserve: params.DefaultExtraReserveForBlobRequests, // Extra reserve threshold for blob, blob never expires when -1 is set, default 28800 } //go:generate go run github.com/fjl/gencodec -type Config -formats toml -out gen_config.go @@ -188,12 +189,6 @@ type Config struct { // send-transaction variants. The unit is ether. RPCTxFeeCap float64 - // OverrideShanghai (TODO: remove after the fork) - OverrideShanghai *uint64 `toml:",omitempty"` - - // OverrideKepler (TODO: remove after the fork) - OverrideKepler *uint64 `toml:",omitempty"` - // OverrideCancun (TODO: remove after the fork) OverrideCancun *uint64 `toml:",omitempty"` @@ -202,6 +197,12 @@ type Config struct { // OverrideFeynman (TODO: remove after the fork) OverrideFeynman *uint64 `toml:",omitempty"` + + // OverrideFeynmanFix (TODO: remove after the fork) + OverrideFeynmanFix *uint64 `toml:",omitempty"` + + // blob setting + BlobExtraReserve uint64 } // CreateConsensusEngine creates a consensus engine for the given chain config. diff --git a/eth/ethconfig/gen_config.go b/eth/ethconfig/gen_config.go index 729e108afb..cadfb0b7f9 100644 --- a/eth/ethconfig/gen_config.go +++ b/eth/ethconfig/gen_config.go @@ -69,10 +69,10 @@ func (c Config) MarshalTOML() (interface{}, error) { RPCGasCap uint64 RPCEVMTimeout time.Duration RPCTxFeeCap float64 - OverrideShanghai *uint64 `toml:",omitempty"` - OverrideKepler *uint64 `toml:",omitempty"` OverrideCancun *uint64 `toml:",omitempty"` OverrideVerkle *uint64 `toml:",omitempty"` + OverrideFeynman *uint64 `toml:",omitempty"` + OverrideFeynmanFix *uint64 `toml:",omitempty"` } var enc Config enc.Genesis = c.Genesis @@ -127,10 +127,10 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.RPCGasCap = c.RPCGasCap enc.RPCEVMTimeout = c.RPCEVMTimeout enc.RPCTxFeeCap = c.RPCTxFeeCap - enc.OverrideShanghai = c.OverrideShanghai - enc.OverrideKepler = c.OverrideKepler enc.OverrideCancun = c.OverrideCancun enc.OverrideVerkle = c.OverrideVerkle + enc.OverrideFeynman = c.OverrideFeynman + enc.OverrideFeynmanFix = c.OverrideFeynmanFix return &enc, nil } @@ -189,10 +189,10 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { RPCGasCap *uint64 RPCEVMTimeout *time.Duration RPCTxFeeCap *float64 - OverrideShanghai *uint64 `toml:",omitempty"` - OverrideKepler *uint64 `toml:",omitempty"` OverrideCancun *uint64 `toml:",omitempty"` OverrideVerkle *uint64 `toml:",omitempty"` + OverrideFeynman *uint64 `toml:",omitempty"` + OverrideFeynmanFix *uint64 `toml:",omitempty"` } var dec Config if err := unmarshal(&dec); err != nil { @@ -354,17 +354,17 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.RPCTxFeeCap != nil { c.RPCTxFeeCap = *dec.RPCTxFeeCap } - if dec.OverrideShanghai != nil { - c.OverrideShanghai = dec.OverrideShanghai - } - if dec.OverrideKepler != nil { - c.OverrideKepler = dec.OverrideKepler - } if dec.OverrideCancun != nil { c.OverrideCancun = dec.OverrideCancun } if dec.OverrideVerkle != nil { c.OverrideVerkle = dec.OverrideVerkle } + if dec.OverrideFeynman != nil { + c.OverrideFeynman = dec.OverrideFeynman + } + if dec.OverrideFeynmanFix != nil { + c.OverrideFeynmanFix = dec.OverrideFeynmanFix + } return nil } diff --git a/eth/fetcher/block_fetcher.go b/eth/fetcher/block_fetcher.go index c574b80498..e013e3b29d 100644 --- a/eth/fetcher/block_fetcher.go +++ b/eth/fetcher/block_fetcher.go @@ -124,12 +124,13 @@ type headerFilterTask struct { time time.Time // Arrival time of the headers } -// bodyFilterTask represents a batch of block bodies (transactions and uncles) +// bodyFilterTask represents a batch of block bodies (transactions, sidecars and uncles) // needing fetcher filtering. type bodyFilterTask struct { peer string // The source peer of block bodies transactions [][]*types.Transaction // Collection of transactions per block bodies uncles [][]*types.Header // Collection of uncles per block bodies + sidecars []types.BlobSidecars // Collection of sidecars per block bodies time time.Time // Arrival time of the blocks' contents } @@ -314,8 +315,8 @@ func (f *BlockFetcher) FilterHeaders(peer string, headers []*types.Header, time // FilterBodies extracts all the block bodies that were explicitly requested by // the fetcher, returning those that should be handled differently. -func (f *BlockFetcher) FilterBodies(peer string, transactions [][]*types.Transaction, uncles [][]*types.Header, time time.Time) ([][]*types.Transaction, [][]*types.Header) { - log.Trace("Filtering bodies", "peer", peer, "txs", len(transactions), "uncles", len(uncles)) +func (f *BlockFetcher) FilterBodies(peer string, transactions [][]*types.Transaction, uncles [][]*types.Header, sidecars []types.BlobSidecars, time time.Time) ([][]*types.Transaction, [][]*types.Header, []types.BlobSidecars) { + log.Trace("Filtering bodies", "peer", peer, "txs", len(transactions), "uncles", len(uncles), "sidecars", len(sidecars)) // Send the filter channel to the fetcher filter := make(chan *bodyFilterTask) @@ -323,20 +324,20 @@ func (f *BlockFetcher) FilterBodies(peer string, transactions [][]*types.Transac select { case f.bodyFilter <- filter: case <-f.quit: - return nil, nil + return nil, nil, nil } // Request the filtering of the body list select { - case filter <- &bodyFilterTask{peer: peer, transactions: transactions, uncles: uncles, time: time}: + case filter <- &bodyFilterTask{peer: peer, transactions: transactions, uncles: uncles, sidecars: sidecars, time: time}: case <-f.quit: - return nil, nil + return nil, nil, nil } // Retrieve the bodies remaining after filtering select { case task := <-filter: - return task.transactions, task.uncles + return task.transactions, task.uncles, task.sidecars case <-f.quit: - return nil, nil + return nil, nil, nil } } @@ -576,8 +577,8 @@ func (f *BlockFetcher) loop() { case res := <-resCh: res.Done <- nil // Ignoring withdrawals here, since the block fetcher is not used post-merge. - txs, uncles, _ := res.Res.(*eth.BlockBodiesResponse).Unpack() - f.FilterBodies(peer, txs, uncles, time.Now()) + txs, uncles, _, sidecars := res.Res.(*eth.BlockBodiesResponse).Unpack() + f.FilterBodies(peer, txs, uncles, sidecars, time.Now()) case <-timeout.C: // The peer didn't respond in time. The request @@ -695,7 +696,7 @@ func (f *BlockFetcher) loop() { blocks := []*types.Block{} // abort early if there's nothing explicitly requested if len(f.completing) > 0 { - for i := 0; i < len(task.transactions) && i < len(task.uncles); i++ { + for i := 0; i < len(task.transactions) && i < len(task.uncles) && i < len(task.sidecars); i++ { // Match up a body to any possible completion request var ( matched = false @@ -722,6 +723,7 @@ func (f *BlockFetcher) loop() { matched = true if f.getBlock(hash) == nil { block := types.NewBlockWithHeader(announce.header).WithBody(task.transactions[i], task.uncles[i]) + block = block.WithSidecars(task.sidecars[i]) block.ReceivedAt = task.time blocks = append(blocks, block) } else { @@ -731,6 +733,7 @@ func (f *BlockFetcher) loop() { if matched { task.transactions = append(task.transactions[:i], task.transactions[i+1:]...) task.uncles = append(task.uncles[:i], task.uncles[i+1:]...) + task.sidecars = append(task.sidecars[:i], task.sidecars[i+1:]...) i-- continue } diff --git a/eth/handler.go b/eth/handler.go index 15e51af5c6..5dd63cfd2f 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -33,7 +33,6 @@ import ( "github.com/ethereum/go-ethereum/core/monitor" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/txpool" - "github.com/ethereum/go-ethereum/core/txpool/legacypool" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/fetcher" @@ -332,7 +331,7 @@ func newHandler(config *handlerConfig) (*handler, error) { addTxs := func(peer string, txs []*types.Transaction) []error { errors := h.txpool.Add(txs, false, false) for _, err := range errors { - if err == legacypool.ErrInBlackList { + if err == txpool.ErrInBlackList { accountBlacklistPeerCounter.Inc(1) p := h.peers.peer(peer) if p != nil { @@ -795,6 +794,7 @@ func (h *handler) BroadcastBlock(block *types.Block, propagate bool) { } else { transfer = peers[:int(math.Sqrt(float64(len(peers))))] } + for _, peer := range transfer { peer.AsyncSendNewBlock(block, td) } diff --git a/eth/handler_eth.go b/eth/handler_eth.go index 2b778acd5f..dd119fdf6e 100644 --- a/eth/handler_eth.go +++ b/eth/handler_eth.go @@ -65,7 +65,7 @@ func (h *ethHandler) Handle(peer *eth.Peer, packet eth.Packet) error { return h.handleBlockAnnounces(peer, hashes, numbers) case *eth.NewBlockPacket: - return h.handleBlockBroadcast(peer, packet.Block, packet.TD) + return h.handleBlockBroadcast(peer, packet) case *eth.NewPooledTransactionHashesPacket: return h.txFetcher.Notify(peer.ID(), packet.Types, packet.Sizes, packet.Hashes) @@ -115,13 +115,20 @@ func (h *ethHandler) handleBlockAnnounces(peer *eth.Peer, hashes []common.Hash, // handleBlockBroadcast is invoked from a peer's message handler when it transmits a // block broadcast for the local node to process. -func (h *ethHandler) handleBlockBroadcast(peer *eth.Peer, block *types.Block, td *big.Int) error { +func (h *ethHandler) handleBlockBroadcast(peer *eth.Peer, packet *eth.NewBlockPacket) error { // Drop all incoming block announces from the p2p network if // the chain already entered the pos stage and disconnect the // remote peer. if h.merger.PoSFinalized() { return errors.New("disallowed block broadcast") } + block := packet.Block + td := packet.TD + sidecars := packet.Sidecars + if sidecars != nil { + block = block.WithSidecars(sidecars) + } + // Schedule the block for import h.blockFetcher.Enqueue(peer.ID(), block) diff --git a/eth/handler_test.go b/eth/handler_test.go index 45da3f726d..6db7bad6f0 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -17,9 +17,16 @@ package eth import ( + "crypto/ecdsa" "math/big" "sort" "sync" + "testing" + + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" @@ -202,6 +209,108 @@ func newTestHandlerWithBlocks(blocks int) *testHandler { } } +type mockParlia struct { + consensus.Engine +} + +func (c *mockParlia) Author(header *types.Header) (common.Address, error) { + return header.Coinbase, nil +} + +func (c *mockParlia) VerifyUncles(chain consensus.ChainReader, block *types.Block) error { + return nil +} + +func (c *mockParlia) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header) error { + return nil +} + +func (c *mockParlia) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header) (chan<- struct{}, <-chan error) { + abort := make(chan<- struct{}) + results := make(chan error, len(headers)) + for i := 0; i < len(headers); i++ { + results <- nil + } + return abort, results +} + +func (c *mockParlia) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, _ *[]*types.Transaction, uncles []*types.Header, withdrawals []*types.Withdrawal, + _ *[]*types.Receipt, _ *[]*types.Transaction, _ *uint64) (err error) { + return +} + +func (c *mockParlia) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, + uncles []*types.Header, receipts []*types.Receipt, withdrawals []*types.Withdrawal) (*types.Block, []*types.Receipt, error) { + // Finalize block + c.Finalize(chain, header, state, &txs, uncles, nil, nil, nil, nil) + + // Assign the final state root to header. + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + + // Header seems complete, assemble into a block and return + return types.NewBlock(header, txs, uncles, receipts, trie.NewStackTrie(nil)), receipts, nil +} + +func (c *mockParlia) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, parent *types.Header) *big.Int { + return big.NewInt(1) +} + +func newTestParliaHandlerAfterCancun(t *testing.T, config *params.ChainConfig, mode downloader.SyncMode, preCancunBlks, postCancunBlks uint64) *testHandler { + // Have N headers in the freezer + frdir := t.TempDir() + db, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "", false, false, false, false) + if err != nil { + t.Fatalf("failed to create database with ancient backend") + } + gspec := &core.Genesis{ + Config: config, + Alloc: types.GenesisAlloc{testAddr: {Balance: new(big.Int).SetUint64(10 * params.Ether)}}, + } + engine := &mockParlia{} + chain, _ := core.NewBlockChain(db, nil, gspec, nil, engine, vm.Config{}, nil, nil) + signer := types.LatestSigner(config) + + _, bs, _ := core.GenerateChainWithGenesis(gspec, engine, int(preCancunBlks+postCancunBlks), func(i int, gen *core.BlockGen) { + if !config.IsCancun(gen.Number(), gen.Timestamp()) { + tx, _ := makeMockTx(config, signer, testKey, gen.TxNonce(testAddr), gen.BaseFee().Uint64(), eip4844.CalcBlobFee(gen.ExcessBlobGas()).Uint64(), false) + gen.AddTxWithChain(chain, tx) + return + } + tx, sidecar := makeMockTx(config, signer, testKey, gen.TxNonce(testAddr), gen.BaseFee().Uint64(), eip4844.CalcBlobFee(gen.ExcessBlobGas()).Uint64(), true) + gen.AddTxWithChain(chain, tx) + gen.AddBlobSidecar(&types.BlobSidecar{ + BlobTxSidecar: *sidecar, + TxIndex: 0, + TxHash: tx.Hash(), + }) + }) + if _, err := chain.InsertChain(bs); err != nil { + panic(err) + } + txpool := newTestTxPool() + votepool := newTestVotePool() + + handler, _ := newHandler(&handlerConfig{ + Database: db, + Chain: chain, + TxPool: txpool, + Merger: consensus.NewMerger(rawdb.NewMemoryDatabase()), + VotePool: votepool, + Network: 1, + Sync: mode, + BloomCache: 1, + }) + handler.Start(1000, 3) + + return &testHandler{ + db: db, + chain: chain, + txpool: txpool, + votepool: votepool, + handler: handler, + } +} + // close tears down the handler and all its internal constructs. func (b *testHandler) close() { b.handler.Stop() @@ -249,3 +358,43 @@ func (t *testVotePool) GetVotes() []*types.VoteEnvelope { func (t *testVotePool) SubscribeNewVoteEvent(ch chan<- core.NewVoteEvent) event.Subscription { return t.voteFeed.Subscribe(ch) } + +var ( + emptyBlob = kzg4844.Blob{} + emptyBlobCommit, _ = kzg4844.BlobToCommitment(emptyBlob) + emptyBlobProof, _ = kzg4844.ComputeBlobProof(emptyBlob, emptyBlobCommit) +) + +func makeMockTx(config *params.ChainConfig, signer types.Signer, key *ecdsa.PrivateKey, nonce uint64, baseFee uint64, blobBaseFee uint64, isBlobTx bool) (*types.Transaction, *types.BlobTxSidecar) { + if !isBlobTx { + raw := &types.DynamicFeeTx{ + ChainID: config.ChainID, + Nonce: nonce, + GasTipCap: big.NewInt(10), + GasFeeCap: new(big.Int).SetUint64(baseFee + 10), + Gas: params.TxGas, + To: &common.Address{0x00}, + Value: big.NewInt(0), + } + tx, _ := types.SignTx(types.NewTx(raw), signer, key) + return tx, nil + } + sidecar := &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob, emptyBlob}, + Commitments: []kzg4844.Commitment{emptyBlobCommit, emptyBlobCommit}, + Proofs: []kzg4844.Proof{emptyBlobProof, emptyBlobProof}, + } + raw := &types.BlobTx{ + ChainID: uint256.MustFromBig(config.ChainID), + Nonce: nonce, + GasTipCap: uint256.NewInt(10), + GasFeeCap: uint256.NewInt(baseFee + 10), + Gas: params.TxGas, + To: common.Address{0x00}, + Value: uint256.NewInt(0), + BlobFeeCap: uint256.NewInt(blobBaseFee), + BlobHashes: sidecar.BlobHashes(), + } + tx, _ := types.SignTx(types.NewTx(raw), signer, key) + return tx, sidecar +} diff --git a/eth/protocols/eth/broadcast.go b/eth/protocols/eth/broadcast.go index 57c98215b4..625a081373 100644 --- a/eth/protocols/eth/broadcast.go +++ b/eth/protocols/eth/broadcast.go @@ -47,7 +47,7 @@ func (p *Peer) broadcastBlocks() { if err := p.SendNewBlock(prop.block, prop.td); err != nil { return } - p.Log().Trace("Propagated block", "number", prop.block.Number(), "hash", prop.block.Hash(), "td", prop.td) + p.Log().Trace("Propagated block", "number", prop.block.Number(), "hash", prop.block.Hash(), "td", prop.td, "sidecars", len(prop.block.Sidecars())) case block := <-p.queuedBlockAnns: if err := p.SendNewBlockHashes([]common.Hash{block.Hash()}, []uint64{block.NumberU64()}); err != nil { diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go index f553e69d69..de49912e57 100644 --- a/eth/protocols/eth/handler_test.go +++ b/eth/protocols/eth/handler_test.go @@ -17,6 +17,8 @@ package eth import ( + rand2 "crypto/rand" + "io" "math" "math/big" "math/rand" @@ -33,10 +35,14 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/ethereum/go-ethereum/eth/protocols/bsc" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/holiman/uint256" ) var ( @@ -146,7 +152,7 @@ func (b *testBackend) AcceptTxs() bool { panic("data processing tests should be done in the handler package") } func (b *testBackend) Handle(*Peer, Packet) error { - panic("data processing tests should be done in the handler package") + return nil } // Tests that block headers can be retrieved from a remote chain based on user queries. @@ -499,3 +505,152 @@ func testGetBlockReceipts(t *testing.T, protocol uint) { t.Errorf("receipts mismatch: %v", err) } } + +func TestHandleNewBlock(t *testing.T) { + t.Parallel() + + gen := func(n int, g *core.BlockGen) { + if n%2 == 0 { + w := &types.Withdrawal{ + Address: common.Address{0xaa}, + Amount: 42, + } + g.AddWithdrawal(w) + } + } + + backend := newTestBackendWithGenerator(maxBodiesServe+15, true, gen) + defer backend.close() + + peer, _ := newTestPeer("peer", ETH68, backend) + defer peer.close() + + v := new(uint32) + *v = 1 + genBlobs := makeBlkBlobs(1, 2) + tx1 := types.NewTx(&types.BlobTx{ + ChainID: new(uint256.Int).SetUint64(1), + GasTipCap: new(uint256.Int), + GasFeeCap: new(uint256.Int), + Gas: 0, + Value: new(uint256.Int), + Data: nil, + BlobFeeCap: new(uint256.Int), + BlobHashes: []common.Hash{common.HexToHash("0x34ec6e64f9cda8fe0451a391e4798085a3ef51a65ed1bfb016e34fc1a2028f8f"), common.HexToHash("0xb9a412e875f29fac436acde234f954e91173c4cf79814f6dcf630d8a6345747f")}, + Sidecar: genBlobs[0], + V: new(uint256.Int), + R: new(uint256.Int), + S: new(uint256.Int), + }) + block := types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(0), + Extra: []byte("test block"), + UncleHash: types.EmptyUncleHash, + TxHash: types.EmptyTxsHash, + ReceiptHash: types.EmptyReceiptsHash, + }) + sidecars := types.BlobSidecars{types.NewBlobSidecarFromTx(tx1)} + for _, s := range sidecars { + s.BlockNumber = block.Number() + s.BlockHash = block.Hash() + } + dataNil := NewBlockPacket{ + Block: block, + TD: big.NewInt(1), + Sidecars: nil, + } + dataNonNil := NewBlockPacket{ + Block: block, + TD: big.NewInt(1), + Sidecars: sidecars, + } + sizeNonNil, rNonNil, _ := rlp.EncodeToReader(dataNonNil) + sizeNil, rNil, _ := rlp.EncodeToReader(dataNil) + + // Define the test cases + testCases := []struct { + name string + msg p2p.Msg + err error + }{ + { + name: "Valid block", + msg: p2p.Msg{ + Code: 1, + Size: uint32(sizeNonNil), + Payload: rNonNil, + }, + err: nil, + }, + { + name: "Nil sidecars", + msg: p2p.Msg{ + Code: 2, + Size: uint32(sizeNil), + Payload: rNil, + }, + err: nil, + }, + } + + protos := []p2p.Protocol{ + { + Name: "eth", + Version: ETH68, + }, + { + Name: "bsc", + Version: bsc.Bsc1, + }, + } + caps := []p2p.Cap{ + { + Name: "eth", + Version: ETH68, + }, + { + Name: "bsc", + Version: bsc.Bsc1, + }, + } + // Create a source handler to send messages through and a sink peer to receive them + p2pEthSrc, p2pEthSink := p2p.MsgPipe() + defer p2pEthSrc.Close() + defer p2pEthSink.Close() + + localEth := NewPeer(ETH68, p2p.NewPeerWithProtocols(enode.ID{1}, protos, "", caps), p2pEthSrc, nil) + + // Run the tests + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := handleNewBlock(backend, tc.msg, localEth) + if err != tc.err { + t.Errorf("expected error %v, got %v", tc.err, err) + } + }) + } +} + +func makeBlkBlobs(n, nPerTx int) []*types.BlobTxSidecar { + if n <= 0 { + return nil + } + ret := make([]*types.BlobTxSidecar, n) + for i := 0; i < n; i++ { + blobs := make([]kzg4844.Blob, nPerTx) + commitments := make([]kzg4844.Commitment, nPerTx) + proofs := make([]kzg4844.Proof, nPerTx) + for i := 0; i < nPerTx; i++ { + io.ReadFull(rand2.Reader, blobs[i][:]) + commitments[i], _ = kzg4844.BlobToCommitment(blobs[i]) + proofs[i], _ = kzg4844.ComputeBlobProof(blobs[i], commitments[i]) + } + ret[i] = &types.BlobTxSidecar{ + Blobs: blobs, + Commitments: commitments, + Proofs: proofs, + } + } + return ret +} diff --git a/eth/protocols/eth/handlers.go b/eth/protocols/eth/handlers.go index 0275708a6c..992449be69 100644 --- a/eth/protocols/eth/handlers.go +++ b/eth/protocols/eth/handlers.go @@ -224,10 +224,24 @@ func ServiceGetBlockBodiesQuery(chain *core.BlockChain, query GetBlockBodiesRequ lookups >= 2*maxBodiesServe { break } - if data := chain.GetBodyRLP(hash); len(data) != 0 { - bodies = append(bodies, data) - bytes += len(data) + body := chain.GetBody(hash) + if body == nil { + continue + } + sidecars := chain.GetSidecarsByHash(hash) + bodyWithSidecars := &BlockBody{ + Transactions: body.Transactions, + Uncles: body.Uncles, + Withdrawals: body.Withdrawals, + Sidecars: sidecars, + } + enc, err := rlp.EncodeToBytes(bodyWithSidecars) + if err != nil { + log.Error("block body encode err", "hash", hash, "err", err) + continue } + bodies = append(bodies, enc) + bytes += len(enc) } return bodies } @@ -293,9 +307,12 @@ func handleNewBlock(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(ann); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } + + // Now that we have our packet, perform operations using the interface methods if err := ann.sanityCheck(); err != nil { return err } + if hash := types.CalcUncleHash(ann.Block.Uncles()); hash != ann.Block.UncleHash() { log.Warn("Propagated block has invalid uncles", "have", hash, "exp", ann.Block.UncleHash()) return nil // TODO(karalabe): return error eventually, but wait a few releases @@ -349,7 +366,8 @@ func handleBlockBodies(backend Backend, msg Decoder, peer *Peer) error { for i, body := range res.BlockBodiesResponse { txsHashes[i] = types.DeriveSha(types.Transactions(body.Transactions), hasher) uncleHashes[i] = types.CalcUncleHash(body.Uncles) - if body.Withdrawals != nil { + // Withdrawals may be not nil, but a empty value when Sidecars not empty + if len(body.Withdrawals) > 0 { withdrawalHashes[i] = types.DeriveSha(types.Withdrawals(body.Withdrawals), hasher) } } diff --git a/eth/protocols/eth/peer.go b/eth/protocols/eth/peer.go index 0826698030..7720d9bd44 100644 --- a/eth/protocols/eth/peer.go +++ b/eth/protocols/eth/peer.go @@ -306,8 +306,9 @@ func (p *Peer) SendNewBlock(block *types.Block, td *big.Int) error { // Mark all the block hash as known, but ensure we don't overflow our limits p.knownBlocks.Add(block.Hash()) return p2p.Send(p.rw, NewBlockMsg, &NewBlockPacket{ - Block: block, - TD: td, + Block: block, + TD: td, + Sidecars: block.Sidecars(), }) } diff --git a/eth/protocols/eth/protocol.go b/eth/protocols/eth/protocol.go index 3e592a7d3c..d1e07df25c 100644 --- a/eth/protocols/eth/protocol.go +++ b/eth/protocols/eth/protocol.go @@ -215,8 +215,9 @@ type BlockHeadersRLPPacket struct { // NewBlockPacket is the network packet for the block propagation message. type NewBlockPacket struct { - Block *types.Block - TD *big.Int + Block *types.Block + TD *big.Int + Sidecars types.BlobSidecars `rlp:"optional"` } // sanityCheck verifies that the values are reasonable, as a DoS protection @@ -229,6 +230,15 @@ func (request *NewBlockPacket) sanityCheck() error { if tdlen := request.TD.BitLen(); tdlen > 100 { return fmt.Errorf("too large block TD: bitlen %d", tdlen) } + + if len(request.Sidecars) > 0 { + for _, sidecar := range request.Sidecars { + if err := sidecar.SanityCheck(request.Block.Number(), request.Block.Hash()); err != nil { + return err + } + } + } + return nil } @@ -267,21 +277,23 @@ type BlockBody struct { Transactions []*types.Transaction // Transactions contained within a block Uncles []*types.Header // Uncles contained within a block Withdrawals []*types.Withdrawal `rlp:"optional"` // Withdrawals contained within a block + Sidecars types.BlobSidecars `rlp:"optional"` // Sidecars contained within a block } // Unpack retrieves the transactions and uncles from the range packet and returns // them in a split flat format that's more consistent with the internal data structures. -func (p *BlockBodiesResponse) Unpack() ([][]*types.Transaction, [][]*types.Header, [][]*types.Withdrawal) { +func (p *BlockBodiesResponse) Unpack() ([][]*types.Transaction, [][]*types.Header, [][]*types.Withdrawal, []types.BlobSidecars) { // TODO(matt): add support for withdrawals to fetchers var ( txset = make([][]*types.Transaction, len(*p)) uncleset = make([][]*types.Header, len(*p)) withdrawalset = make([][]*types.Withdrawal, len(*p)) + sidecarset = make([]types.BlobSidecars, len(*p)) ) for i, body := range *p { - txset[i], uncleset[i], withdrawalset[i] = body.Transactions, body.Uncles, body.Withdrawals + txset[i], uncleset[i], withdrawalset[i], sidecarset[i] = body.Transactions, body.Uncles, body.Withdrawals, body.Sidecars } - return txset, uncleset, withdrawalset + return txset, uncleset, withdrawalset, sidecarset } // GetReceiptsRequest represents a block receipts query. diff --git a/eth/sync_test.go b/eth/sync_test.go index a31986730f..d846e06abb 100644 --- a/eth/sync_test.go +++ b/eth/sync_test.go @@ -20,6 +20,10 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/eth/protocols/snap" @@ -93,3 +97,98 @@ func testSnapSyncDisabling(t *testing.T, ethVer uint, snapVer uint) { t.Fatalf("snap sync not disabled after successful synchronisation") } } + +func TestFullSyncWithBlobs(t *testing.T) { + testChainSyncWithBlobs(t, downloader.FullSync, 128, 128) +} + +func TestSnapSyncWithBlobs(t *testing.T) { + testChainSyncWithBlobs(t, downloader.SnapSync, 128, 128) +} + +func testChainSyncWithBlobs(t *testing.T, mode downloader.SyncMode, preCancunBlks, postCancunBlks uint64) { + t.Parallel() + config := *params.ParliaTestChainConfig + cancunTime := (preCancunBlks + 1) * 10 + config.CancunTime = &cancunTime + + // Create a full handler and ensure snap sync ends up disabled + full := newTestParliaHandlerAfterCancun(t, &config, mode, preCancunBlks, postCancunBlks) + defer full.close() + if downloader.SnapSync == mode && full.handler.snapSync.Load() { + t.Fatalf("snap sync not disabled on non-empty blockchain") + } + + // check blocks and blobs + checkChainWithBlobs(t, full.chain, preCancunBlks, postCancunBlks) + + // Create an empty handler and ensure it's in snap sync mode + empty := newTestParliaHandlerAfterCancun(t, &config, mode, 0, 0) + defer empty.close() + if downloader.SnapSync == mode && !empty.handler.snapSync.Load() { + t.Fatalf("snap sync disabled on pristine blockchain") + } + + // Sync up the two handlers via both `eth` and `snap` + ethVer := uint(eth.ETH68) + snapVer := uint(snap.SNAP1) + + // Sync up the two handlers via both `eth` and `snap` + caps := []p2p.Cap{{Name: "eth", Version: ethVer}, {Name: "snap", Version: snapVer}} + + emptyPipeEth, fullPipeEth := p2p.MsgPipe() + defer emptyPipeEth.Close() + defer fullPipeEth.Close() + + emptyPeerEth := eth.NewPeer(ethVer, p2p.NewPeer(enode.ID{1}, "", caps), emptyPipeEth, empty.txpool) + fullPeerEth := eth.NewPeer(ethVer, p2p.NewPeer(enode.ID{2}, "", caps), fullPipeEth, full.txpool) + defer emptyPeerEth.Close() + defer fullPeerEth.Close() + + go empty.handler.runEthPeer(emptyPeerEth, func(peer *eth.Peer) error { + return eth.Handle((*ethHandler)(empty.handler), peer) + }) + go full.handler.runEthPeer(fullPeerEth, func(peer *eth.Peer) error { + return eth.Handle((*ethHandler)(full.handler), peer) + }) + + emptyPipeSnap, fullPipeSnap := p2p.MsgPipe() + defer emptyPipeSnap.Close() + defer fullPipeSnap.Close() + + emptyPeerSnap := snap.NewPeer(snapVer, p2p.NewPeer(enode.ID{1}, "", caps), emptyPipeSnap) + fullPeerSnap := snap.NewPeer(snapVer, p2p.NewPeer(enode.ID{2}, "", caps), fullPipeSnap) + + go empty.handler.runSnapExtension(emptyPeerSnap, func(peer *snap.Peer) error { + return snap.Handle((*snapHandler)(empty.handler), peer) + }) + go full.handler.runSnapExtension(fullPeerSnap, func(peer *snap.Peer) error { + return snap.Handle((*snapHandler)(full.handler), peer) + }) + // Wait a bit for the above handlers to start + time.Sleep(250 * time.Millisecond) + + // Check that snap sync was disabled + op := peerToSyncOp(mode, empty.handler.peers.peerWithHighestTD()) + if err := empty.handler.doSync(op); err != nil { + t.Fatal("sync failed:", err) + } + if !empty.handler.synced.Load() { + t.Fatalf("full sync not done after successful synchronisation") + } + + // check blocks and blobs + checkChainWithBlobs(t, empty.chain, preCancunBlks, postCancunBlks) +} + +func checkChainWithBlobs(t *testing.T, chain *core.BlockChain, preCancunBlks, postCancunBlks uint64) { + block := chain.GetBlockByNumber(preCancunBlks) + require.NotNil(t, block, preCancunBlks) + require.Nil(t, chain.GetSidecarsByHash(block.Hash()), preCancunBlks) + block = chain.GetBlockByNumber(preCancunBlks + 1) + require.NotNil(t, block, preCancunBlks+1) + require.NotNil(t, chain.GetSidecarsByHash(block.Hash()), preCancunBlks+1) + block = chain.GetBlockByNumber(preCancunBlks + postCancunBlks) + require.NotNil(t, block, preCancunBlks+postCancunBlks) + require.NotNil(t, chain.GetSidecarsByHash(block.Hash()), preCancunBlks+postCancunBlks) +} diff --git a/eth/tracers/internal/tracetest/prestate_test.go b/eth/tracers/internal/tracetest/prestate_test.go index 8a60123dc2..38097ff334 100644 --- a/eth/tracers/internal/tracetest/prestate_test.go +++ b/eth/tracers/internal/tracetest/prestate_test.go @@ -25,6 +25,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" @@ -107,6 +108,11 @@ func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T) { ) defer state.Close() + if test.Genesis.ExcessBlobGas != nil && test.Genesis.BlobGasUsed != nil { + excessBlobGas := eip4844.CalcExcessBlobGas(*test.Genesis.ExcessBlobGas, *test.Genesis.BlobGasUsed) + context.BlobBaseFee = eip4844.CalcBlobFee(excessBlobGas) + } + tracer, err := tracers.DefaultDirectory.New(tracerName, new(tracers.Context), test.TracerConfig) if err != nil { t.Fatalf("failed to create call tracer: %v", err) diff --git a/eth/tracers/internal/tracetest/testdata/prestate_tracer/blob_tx.json b/eth/tracers/internal/tracetest/testdata/prestate_tracer/blob_tx.json new file mode 100644 index 0000000000..315481aff5 --- /dev/null +++ b/eth/tracers/internal/tracetest/testdata/prestate_tracer/blob_tx.json @@ -0,0 +1,63 @@ +{ + "genesis": { + "baseFeePerGas": "7", + "blobGasUsed": "0", + "difficulty": "0", + "excessBlobGas": "36306944", + "extraData": "0xd983010e00846765746888676f312e32312e308664617277696e", + "gasLimit": "15639172", + "hash": "0xc682259fda061bb9ce8ccb491d5b2d436cb73daf04e1025dd116d045ce4ad28c", + "miner": "0x0000000000000000000000000000000000000000", + "mixHash": "0xae1a5ba939a4c9ac38aabeff361169fb55a6fc2c9511457e0be6eff9514faec0", + "nonce": "0x0000000000000000", + "number": "315", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "stateRoot": "0x577f42ab21ccfd946511c57869ace0bdf7c217c36f02b7cd3459df0ed1cffc1a", + "timestamp": "1709626771", + "totalDifficulty": "1", + "withdrawals": [], + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x272e0528" + }, + "0x0c2c51a0990aee1d73c1228de158688341557508": { + "balance": "0xde0b6b3a7640000" + } + }, + "config": { + "chainId": 1337, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true + } + }, + "context": { + "number": "316", + "difficulty": "0", + "timestamp": "1709626785", + "gasLimit": "15654443", + "miner": "0x0000000000000000000000000000000000000000" + }, + "input": "0x03f8b1820539806485174876e800825208940c2c51a0990aee1d73c1228de1586883415575088080c083020000f842a00100c9fbdf97f747e85847b4f3fff408f89c26842f77c882858bf2c89923849aa00138e3896f3c27f2389147507f8bcec52028b0efca6ee842ed83c9158873943880a0dbac3f97a532c9b00e6239b29036245a5bfbb96940b9d848634661abee98b945a03eec8525f261c2e79798f7b45a5d6ccaefa24576d53ba5023e919b86841c0675", + "result": { + "0x0000000000000000000000000000000000000000": { "balance": "0x272e0528" }, + "0x0c2c51a0990aee1d73c1228de158688341557508": { + "balance": "0xde0b6b3a7640000" + } + } +} diff --git a/eth/tracers/native/prestate.go b/eth/tracers/native/prestate.go index a1d511fb3c..c737506d31 100644 --- a/eth/tracers/native/prestate.go +++ b/eth/tracers/native/prestate.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" ) //go:generate go run github.com/fjl/gencodec -type account -field-override accountMarshaling -out gen_account_json.go @@ -109,6 +110,12 @@ func (t *prestateTracer) CaptureStart(env *vm.EVM, from common.Address, to commo gasPrice := env.TxContext.GasPrice consumedGas := new(big.Int).Mul(gasPrice, new(big.Int).SetUint64(t.gasLimit)) fromBal.Add(fromBal, new(big.Int).Add(value, consumedGas)) + + // Add blob fee to the sender's balance. + if env.Context.BlobBaseFee != nil && len(env.TxContext.BlobHashes) > 0 { + blobGas := uint64(params.BlobTxBlobGasPerBlob * len(env.TxContext.BlobHashes)) + fromBal.Add(fromBal, new(big.Int).Mul(env.Context.BlobBaseFee, new(big.Int).SetUint64(blobGas))) + } t.pre[from].Balance = fromBal t.pre[from].Nonce-- diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 39fb0d7ec8..d02e7975a5 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -130,6 +130,26 @@ func (ec *Client) BlockReceipts(ctx context.Context, blockNrOrHash rpc.BlockNumb return r, err } +// BlobSidecars return the Sidecars of a given block number or hash. +func (ec *Client) BlobSidecars(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) ([]*types.BlobTxSidecar, error) { + var r []*types.BlobTxSidecar + err := ec.c.CallContext(ctx, &r, "eth_getBlobSidecars", blockNrOrHash.String()) + if err == nil && r == nil { + return nil, ethereum.NotFound + } + return r, err +} + +// BlobSidecarByTxHash return a sidecar of a given blob transaction +func (ec *Client) BlobSidecarByTxHash(ctx context.Context, hash common.Hash) (*types.BlobTxSidecar, error) { + var r *types.BlobTxSidecar + err := ec.c.CallContext(ctx, &r, "eth_getBlockSidecarByTxHash", hash) + if err == nil && r == nil { + return nil, ethereum.NotFound + } + return r, err +} + type rpcBlock struct { Hash common.Hash `json:"hash"` Transactions []rpcTransaction `json:"transactions"` diff --git a/ethclient/gethclient/gethclient.go b/ethclient/gethclient/gethclient.go index 73d05d499e..b1678b6766 100644 --- a/ethclient/gethclient/gethclient.go +++ b/ethclient/gethclient/gethclient.go @@ -245,6 +245,12 @@ func toCallArg(msg ethereum.CallMsg) interface{} { if msg.AccessList != nil { arg["accessList"] = msg.AccessList } + if msg.BlobGasFeeCap != nil { + arg["maxFeePerBlobGas"] = (*hexutil.Big)(msg.BlobGasFeeCap) + } + if msg.BlobHashes != nil { + arg["blobVersionedHashes"] = msg.BlobHashes + } return arg } diff --git a/ethdb/database.go b/ethdb/database.go index cb694fe420..f92ee77b84 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -17,7 +17,11 @@ // Package ethdb defines the interfaces for an Ethereum data store. package ethdb -import "io" +import ( + "io" + + "github.com/ethereum/go-ethereum/params" +) // KeyValueReader wraps the Has and Get method of a backing data store. type KeyValueReader interface { @@ -136,6 +140,20 @@ type AncientWriter interface { // The second argument is a function that takes a raw entry and returns it // in the newest format. MigrateTable(string, func([]byte) ([]byte, error)) error + + // ResetTable will reset certain table to new boundary + ResetTable(kind string, tail uint64, head uint64, onlyEmpty bool) error +} + +type FreezerEnv struct { + ChainCfg *params.ChainConfig + BlobExtraReserve uint64 +} + +// AncientFreezer defines the help functions for freezing ancient data +type AncientFreezer interface { + // SetupFreezerEnv provides params.ChainConfig for checking hark forks, like isCancun. + SetupFreezerEnv(env *FreezerEnv) error } // AncientWriteOp is given to the function argument of ModifyAncients. @@ -211,5 +229,6 @@ type Database interface { Stater Compacter Snapshotter + AncientFreezer io.Closer } diff --git a/ethdb/remotedb/remotedb.go b/ethdb/remotedb/remotedb.go index 0214126153..2d9768236e 100644 --- a/ethdb/remotedb/remotedb.go +++ b/ethdb/remotedb/remotedb.go @@ -126,6 +126,14 @@ func (db *Database) ModifyAncients(f func(ethdb.AncientWriteOp) error) (int64, e panic("not supported") } +func (db *Database) ResetTable(kind string, tail uint64, head uint64, onlyEmpty bool) error { + panic("not supported") +} + +func (db *Database) AncientReset(tail, head uint64) error { + panic("not supported") +} + func (db *Database) TruncateHead(n uint64) (uint64, error) { panic("not supported") } @@ -175,6 +183,10 @@ func (db *Database) Close() error { return nil } +func (db *Database) SetupFreezerEnv(env *ethdb.FreezerEnv) error { + panic("not supported") +} + func New(client *rpc.Client) ethdb.Database { return &Database{ remote: client, diff --git a/graphql/graphql.go b/graphql/graphql.go index fd782206fb..0fccfa74ff 100644 --- a/graphql/graphql.go +++ b/graphql/graphql.go @@ -1041,7 +1041,7 @@ func (b *Block) WithdrawalsRoot(ctx context.Context) (*common.Hash, error) { return nil, err } // Pre-shanghai blocks - if header.WithdrawalsHash == nil { + if header.EmptyWithdrawalsHash() { return nil, nil } return header.WithdrawalsHash, nil @@ -1053,7 +1053,7 @@ func (b *Block) Withdrawals(ctx context.Context) (*[]*Withdrawal, error) { return nil, err } // Pre-shanghai blocks - if block.Header().WithdrawalsHash == nil { + if block.Header().EmptyWithdrawalsHash() { return nil, nil } ret := make([]*Withdrawal, 0, len(block.Withdrawals())) diff --git a/graphql/graphql_test.go b/graphql/graphql_test.go index 1dda102058..f3f9d1778a 100644 --- a/graphql/graphql_test.go +++ b/graphql/graphql_test.go @@ -32,6 +32,7 @@ import ( "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -452,6 +453,7 @@ func newGQLService(t *testing.T, stack *node.Node, shanghai bool, gspec *core.Ge TrieDirtyCache: 5, TrieTimeout: 60 * time.Minute, SnapshotCache: 5, + StateScheme: rawdb.HashScheme, } var engine consensus.Engine = ethash.NewFaker() if shanghai { diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index f115e4230b..a1b132b9c4 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1010,6 +1010,48 @@ func (s *BlockChainAPI) GetBlockReceipts(ctx context.Context, blockNrOrHash rpc. return result, nil } +func (s *BlockChainAPI) GetBlobSidecars(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) ([]map[string]interface{}, error) { + header, err := s.b.HeaderByNumberOrHash(ctx, blockNrOrHash) + if header == nil || err != nil { + // When the block doesn't exist, the RPC method should return JSON null + // as per specification. + return nil, nil + } + blobSidecars, err := s.b.GetBlobSidecars(ctx, header.Hash()) + if err != nil || len(blobSidecars) == 0 { + return nil, nil + } + result := make([]map[string]interface{}, len(blobSidecars)) + for i, sidecar := range blobSidecars { + result[i] = marshalBlobSidecar(sidecar) + } + return result, nil +} + +func (s *BlockChainAPI) GetBlobSidecarByTxHash(ctx context.Context, hash common.Hash) (map[string]interface{}, error) { + txTarget, blockHash, _, Index := rawdb.ReadTransaction(s.b.ChainDb(), hash) + if txTarget == nil { + return nil, nil + } + block, err := s.b.BlockByHash(ctx, blockHash) + if block == nil || err != nil { + // When the block doesn't exist, the RPC method should return JSON null + // as per specification. + return nil, nil + } + blobSidecars, err := s.b.GetBlobSidecars(ctx, blockHash) + if err != nil || len(blobSidecars) == 0 { + return nil, nil + } + for _, sidecar := range blobSidecars { + if sidecar.TxIndex == Index { + return marshalBlobSidecar(sidecar), nil + } + } + + return nil, nil +} + // OverrideAccount indicates the overriding fields of account during the execution // of a message call. // Note, state and stateDiff can't be specified at the same time. If state is @@ -1475,7 +1517,7 @@ func RPCMarshalHeader(head *types.Header) map[string]interface{} { if head.BaseFee != nil { result["baseFeePerGas"] = (*hexutil.Big)(head.BaseFee) } - if head.WithdrawalsHash != nil { + if !head.EmptyWithdrawalsHash() { result["withdrawalsRoot"] = head.WithdrawalsHash } if head.BlobGasUsed != nil { @@ -1519,7 +1561,7 @@ func RPCMarshalBlock(block *types.Block, inclTx bool, fullTx bool, config *param uncleHashes[i] = uncle.Hash() } fields["uncles"] = uncleHashes - if block.Header().WithdrawalsHash != nil { + if !block.Header().EmptyWithdrawalsHash() { fields["withdrawals"] = block.Withdrawals() } return fields @@ -2100,6 +2142,17 @@ func marshalReceipt(receipt *types.Receipt, blockHash common.Hash, blockNumber u return fields } +func marshalBlobSidecar(sidecar *types.BlobSidecar) map[string]interface{} { + fields := map[string]interface{}{ + "blockHash": sidecar.BlockHash, + "blockNumber": hexutil.EncodeUint64(sidecar.BlockNumber.Uint64()), + "txHash": sidecar.TxHash, + "txIndex": hexutil.EncodeUint64(sidecar.TxIndex), + "blobSidecar": sidecar.BlobTxSidecar, + } + return fields +} + // sign is a helper function that signs a transaction with the private key of the given address. func (s *TransactionAPI) sign(addr common.Address, tx *types.Transaction) (*types.Transaction, error) { // Look up the wallet containing the requested signer @@ -2527,6 +2580,16 @@ func (s *NetAPI) Version() string { return fmt.Sprintf("%d", s.networkVersion) } +// NodeInfo retrieves all the information we know about the host node at the +// protocol granularity. This is the same as the `admin_nodeInfo` method. +func (s *NetAPI) NodeInfo() (*p2p.NodeInfo, error) { + server := s.net + if server == nil { + return nil, errors.New("server not found") + } + return s.net.NodeInfo(), nil +} + // checkTxFee is an internal function used to check whether the fee of // the given transaction is _reasonable_(under the cap). func checkTxFee(gasPrice *big.Int, gas uint64, cap float64) error { diff --git a/internal/ethapi/api_test.go b/internal/ethapi/api_test.go index 37a2c716d6..3a8d4b51b2 100644 --- a/internal/ethapi/api_test.go +++ b/internal/ethapi/api_test.go @@ -58,6 +58,11 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) +var emptyBlob = kzg4844.Blob{} +var emptyBlobCommit, _ = kzg4844.BlobToCommitment(emptyBlob) +var emptyBlobProof, _ = kzg4844.ComputeBlobProof(emptyBlob, emptyBlobCommit) +var emptyBlobHash common.Hash = kzg4844.CalcBlobHashV1(sha256.New(), &emptyBlobCommit) + func testTransactionMarshal(t *testing.T, tests []txData, config *params.ChainConfig) { t.Parallel() var ( @@ -563,6 +568,15 @@ func (b testBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.R receipts := rawdb.ReadReceipts(b.db, hash, header.Number.Uint64(), header.Time, b.chain.Config()) return receipts, nil } + +func (b testBackend) GetBlobSidecars(ctx context.Context, hash common.Hash) (types.BlobSidecars, error) { + header, err := b.HeaderByHash(ctx, hash) + if header == nil || err != nil { + return nil, err + } + blobSidecars := rawdb.ReadRawBlobSidecars(b.db, hash, header.Number.Uint64()) + return blobSidecars, nil +} func (b testBackend) GetTd(ctx context.Context, hash common.Hash) *big.Int { if b.pending != nil && hash == b.pending.Hash() { return nil @@ -1127,10 +1141,6 @@ func TestFillBlobTransaction(t *testing.T) { Config: params.MergedTestChainConfig, Alloc: types.GenesisAlloc{}, } - emptyBlob = kzg4844.Blob{} - emptyBlobCommit, _ = kzg4844.BlobToCommitment(emptyBlob) - emptyBlobProof, _ = kzg4844.ComputeBlobProof(emptyBlob, emptyBlobCommit) - emptyBlobHash common.Hash = kzg4844.CalcBlobHashV1(sha256.New(), &emptyBlobCommit) ) b := newTestBackend(t, 1, genesis, beacon.New(ethash.NewFaker()), func(i int, b *core.BlockGen) { b.SetPoS() @@ -1895,6 +1905,28 @@ func setupReceiptBackend(t *testing.T, genBlocks int) (*testBackend, []common.Ha BlobHashes: []common.Hash{{1}}, Value: new(uint256.Int), }), signer, acc1Key) + + case 6: + // blob tx with blobSidecar + blobSidecars := makeBlkSidecars(1, 1) + blobHashes := blobSidecars[0].BlobHashes() + fee := big.NewInt(500) + fee.Add(fee, b.BaseFee()) + tx, err = types.SignTx(types.NewTx(&types.BlobTx{ + Nonce: uint64(i), + GasTipCap: uint256.NewInt(1), + GasFeeCap: uint256.MustFromBig(fee), + Gas: params.TxGas, + To: acc2Addr, + BlobFeeCap: uint256.NewInt(1), + BlobHashes: blobHashes, + Value: new(uint256.Int), + }), signer, acc1Key) + b.AddBlobSidecar(&types.BlobSidecar{ + BlobTxSidecar: *blobSidecars[0], + TxHash: tx.Hash(), + TxIndex: 0, + }) } if err != nil { t.Errorf("failed to sign tx: %v", err) @@ -2073,6 +2105,156 @@ func TestRPCGetBlockReceipts(t *testing.T) { } } +func makeBlkSidecars(n, nPerTx int) []*types.BlobTxSidecar { + if n <= 0 { + return nil + } + ret := make([]*types.BlobTxSidecar, n) + for i := 0; i < n; i++ { + blobs := make([]kzg4844.Blob, nPerTx) + commitments := make([]kzg4844.Commitment, nPerTx) + proofs := make([]kzg4844.Proof, nPerTx) + for i := 0; i < nPerTx; i++ { + commitments[i], _ = kzg4844.BlobToCommitment(blobs[i]) + proofs[i], _ = kzg4844.ComputeBlobProof(blobs[i], commitments[i]) + } + ret[i] = &types.BlobTxSidecar{ + Blobs: blobs, + Commitments: commitments, + Proofs: proofs, + } + } + return ret +} + +func TestRPCGetBlobSidecars(t *testing.T) { + t.Parallel() + var ( + genBlocks = 7 + backend, _ = setupReceiptBackend(t, genBlocks) + api = NewBlockChainAPI(backend) + ) + blockHashes := make([]common.Hash, genBlocks+1) + ctx := context.Background() + for i := 0; i <= genBlocks; i++ { + header, err := backend.HeaderByNumber(ctx, rpc.BlockNumber(i)) + if err != nil { + t.Errorf("failed to get block: %d err: %v", i, err) + } + blockHashes[i] = header.Hash() + } + + var testSuite = []struct { + test rpc.BlockNumberOrHash + file string + }{ + // 1. block without any txs(number) + { + test: rpc.BlockNumberOrHashWithNumber(0), + file: "number-1", + }, + // 2. earliest tag + { + test: rpc.BlockNumberOrHashWithNumber(rpc.EarliestBlockNumber), + file: "tag-earliest", + }, + // 3. latest tag + { + test: rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber), + file: "tag-latest", + }, + // 4. block is empty + { + test: rpc.BlockNumberOrHashWithHash(common.Hash{}, false), + file: "hash-empty", + }, + // 5. block is not found + { + test: rpc.BlockNumberOrHashWithHash(common.HexToHash("deadbeef"), false), + file: "hash-notfound", + }, + // 6. block is not found + { + test: rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(genBlocks + 1)), + file: "block-notfound", + }, + // 7. block with blob tx + { + test: rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(6)), + file: "block-with-blob-tx", + }, + // 8. block with sidecar + { + test: rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(7)), + file: "block-with-blobSidecars", + }, + } + + for i, tt := range testSuite { + var ( + result interface{} + err error + ) + result, err = api.GetBlobSidecars(context.Background(), tt.test) + if err != nil { + t.Errorf("test %d: want no error, have %v", i, err) + continue + } + testRPCResponseWithFile(t, i, result, "eth_getBlobSidecars", tt.file) + } +} + +func TestGetBlobSidecarByTxHash(t *testing.T) { + t.Parallel() + var ( + backend, txHashs = setupReceiptBackend(t, 7) + api = NewBlockChainAPI(backend) + ) + var testSuite = []struct { + test common.Hash + file string + }{ + // 0. txHash is empty + { + test: common.Hash{}, + file: "hash-empty", + }, + // 1. txHash is not found + { + test: common.HexToHash("deadbeef"), + file: "hash-notfound", + }, + // 2. txHash is not blob tx + { + test: common.HexToHash("deadbeef"), + file: "not-blob-tx", + }, + // 3. block with blob tx without sidecar + { + test: txHashs[5], + file: "block-with-blob-tx", + }, + // 4. block with sidecar + { + test: txHashs[6], + file: "block-with-blobSidecars", + }, + } + + for i, tt := range testSuite { + var ( + result interface{} + err error + ) + result, err = api.GetBlobSidecarByTxHash(context.Background(), tt.test) + if err != nil { + t.Errorf("test %d: want no error, have %v", i, err) + continue + } + testRPCResponseWithFile(t, i, result, "eth_getBlobSidecarByTxHash", tt.file) + } +} + func testRPCResponseWithFile(t *testing.T, testid int, result interface{}, rpc string, file string) { data, err := json.MarshalIndent(result, "", " ") if err != nil { diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index b753dc8f22..24971f003e 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -74,6 +74,7 @@ type Backend interface { SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription + GetBlobSidecars(ctx context.Context, hash common.Hash) (types.BlobSidecars, error) // Transaction pool API SendTx(ctx context.Context, signedTx *types.Transaction) error diff --git a/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-block-with-blob-tx.json b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-block-with-blob-tx.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-block-with-blob-tx.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-block-with-blobSidecars.json b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-block-with-blobSidecars.json new file mode 100644 index 0000000000..ba5fd7b587 --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-block-with-blobSidecars.json @@ -0,0 +1,17 @@ +{ + "blobSidecar": { + "blobs": [ + "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "commitments": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "proofs": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "blockHash": "0x6fe5e7eea22c44f700c95da066d6e0740894b6c1e993825cc63f634ad4f74250", + "blockNumber": "0x7", + "txHash": "0xc520427e696154779f6b21ab03a0735769e1c029035a484f5876f60383a0a7ce", + "txIndex": "0x0" +} \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-hash-empty.json b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-hash-empty.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-hash-empty.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-hash-notfound.json b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-hash-notfound.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-hash-notfound.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-not-blob-tx.json b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-not-blob-tx.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecarByTxHash-not-blob-tx.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-block-notfound.json b/internal/ethapi/testdata/eth_getBlobSidecars-block-notfound.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-block-notfound.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-block-with-blob-tx.json b/internal/ethapi/testdata/eth_getBlobSidecars-block-with-blob-tx.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-block-with-blob-tx.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-block-with-blobSidecars.json b/internal/ethapi/testdata/eth_getBlobSidecars-block-with-blobSidecars.json new file mode 100644 index 0000000000..2cb9331ed1 --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-block-with-blobSidecars.json @@ -0,0 +1,19 @@ +[ + { + "blobSidecar": { + "blobs": [ + "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "commitments": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "proofs": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "blockHash": "0x6fe5e7eea22c44f700c95da066d6e0740894b6c1e993825cc63f634ad4f74250", + "blockNumber": "0x7", + "txHash": "0xc520427e696154779f6b21ab03a0735769e1c029035a484f5876f60383a0a7ce", + "txIndex": "0x0" + } +] \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-hash-empty.json b/internal/ethapi/testdata/eth_getBlobSidecars-hash-empty.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-hash-empty.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-hash-notfound.json b/internal/ethapi/testdata/eth_getBlobSidecars-hash-notfound.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-hash-notfound.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-number-0.json b/internal/ethapi/testdata/eth_getBlobSidecars-number-0.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-number-0.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-number-1.json b/internal/ethapi/testdata/eth_getBlobSidecars-number-1.json new file mode 100644 index 0000000000..ec747fa47d --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-number-1.json @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-tag-earliest.json b/internal/ethapi/testdata/eth_getBlobSidecars-tag-earliest.json new file mode 100644 index 0000000000..19765bd501 --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-tag-earliest.json @@ -0,0 +1 @@ +null diff --git a/internal/ethapi/testdata/eth_getBlobSidecars-tag-latest.json b/internal/ethapi/testdata/eth_getBlobSidecars-tag-latest.json new file mode 100644 index 0000000000..2cb9331ed1 --- /dev/null +++ b/internal/ethapi/testdata/eth_getBlobSidecars-tag-latest.json @@ -0,0 +1,19 @@ +[ + { + "blobSidecar": { + "blobs": [ + "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "commitments": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "proofs": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "blockHash": "0x6fe5e7eea22c44f700c95da066d6e0740894b6c1e993825cc63f634ad4f74250", + "blockNumber": "0x7", + "txHash": "0xc520427e696154779f6b21ab03a0735769e1c029035a484f5876f60383a0a7ce", + "txIndex": "0x0" + } +] \ No newline at end of file diff --git a/internal/ethapi/transaction_args_test.go b/internal/ethapi/transaction_args_test.go index 97a822f42b..34e4677160 100644 --- a/internal/ethapi/transaction_args_test.go +++ b/internal/ethapi/transaction_args_test.go @@ -364,6 +364,9 @@ func (b *backendMock) PendingBlockAndReceipts() (*types.Block, types.Receipts) { func (b *backendMock) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { return nil, nil } +func (b *backendMock) GetBlobSidecars(ctx context.Context, hash common.Hash) (types.BlobSidecars, error) { + return nil, nil +} func (b *backendMock) GetLogs(ctx context.Context, blockHash common.Hash, number uint64) ([][]*types.Log, error) { return nil, nil } diff --git a/internal/jsre/deps/web3.js b/internal/jsre/deps/web3.js index 7afe766c1f..0e6b13ae10 100644 --- a/internal/jsre/deps/web3.js +++ b/internal/jsre/deps/web3.js @@ -3734,7 +3734,7 @@ var inputCallFormatter = function (options){ options.to = inputAddressFormatter(options.to); } - ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { + ['maxFeePerBlobGas', 'maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { return options[key] !== undefined; }).forEach(function(key){ options[key] = utils.fromDecimal(options[key]); @@ -3759,7 +3759,7 @@ var inputTransactionFormatter = function (options){ options.to = inputAddressFormatter(options.to); } - ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { + ['maxFeePerBlobGas', 'maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { return options[key] !== undefined; }).forEach(function(key){ options[key] = utils.fromDecimal(options[key]); @@ -3789,6 +3789,9 @@ var outputTransactionFormatter = function (tx){ if(tx.maxPriorityFeePerGas !== undefined) { tx.maxPriorityFeePerGas = utils.toBigNumber(tx.maxPriorityFeePerGas); } + if(tx.maxFeePerBlobGas !== undefined) { + tx.maxFeePerBlobGas = utils.toBigNumber(tx.maxFeePerBlobGas); + } tx.value = utils.toBigNumber(tx.value); return tx; }; @@ -3810,6 +3813,12 @@ var outputTransactionReceiptFormatter = function (receipt){ if(receipt.effectiveGasPrice !== undefined) { receipt.effectiveGasPrice = utils.toBigNumber(receipt.effectiveGasPrice); } + if(receipt.blobGasPrice !== undefined) { + receipt.blobGasPrice = utils.toBigNumber(receipt.blobGasPrice); + } + if(receipt.blobGasUsed !== undefined) { + receipt.blobGasUsed = utils.toBigNumber(receipt.blobGasUsed); + } if(utils.isArray(receipt.logs)) { receipt.logs = receipt.logs.map(function(log){ return outputLogFormatter(log); @@ -3864,11 +3873,17 @@ var outputBlockFormatter = function(block) { if (block.baseFeePerGas !== undefined) { block.baseFeePerGas = utils.toBigNumber(block.baseFeePerGas); } + if (block.blobGasUsed !== undefined) { + block.blobGasUsed = utils.toBigNumber(block.blobGasUsed); + } + if (block.excessBlobGas !== undefined) { + block.excessBlobGas = utils.toBigNumber(block.excessBlobGas); + } block.gasLimit = utils.toDecimal(block.gasLimit); block.gasUsed = utils.toDecimal(block.gasUsed); block.size = utils.toDecimal(block.size); block.timestamp = utils.toDecimal(block.timestamp); - if(block.number !== null) + if (block.number !== null) block.number = utils.toDecimal(block.number); block.difficulty = utils.toBigNumber(block.difficulty); diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index ae76af4090..909b3db791 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -614,6 +614,16 @@ web3._extend({ call: 'eth_getBlockReceipts', params: 1, }), + new web3._extend.Method({ + name: 'getBlobSidecars', + call: 'eth_getBlobSidecars', + params: 1, + }), + new web3._extend.Method({ + name: 'getBlobSidecarByTxHash', + call: 'eth_getBlobSidecarByTxHash', + params: 1, + }), ], properties: [ new web3._extend.Property({ diff --git a/miner/bid_simulator.go b/miner/bid_simulator.go index 51dcf58355..5f9d2588b0 100644 --- a/miner/bid_simulator.go +++ b/miner/bid_simulator.go @@ -18,6 +18,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/miner/builderclient" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" @@ -36,10 +37,12 @@ const ( ) var ( - diffInTurn = big.NewInt(2) // the difficulty of a block that proposed by an in-turn validator + bidSimTimer = metrics.NewRegisteredTimer("bid/sim/duration", nil) ) var ( + diffInTurn = big.NewInt(2) // the difficulty of a block that proposed by an in-turn validator + dialer = &net.Dialer{ Timeout: time.Second, KeepAlive: 60 * time.Second, @@ -503,6 +506,7 @@ func (b *bidSimulator) simBid(interruptCh chan int32, bidRuntime *BidRuntime) { // ensure simulation exited then start next simulation b.SetSimulatingBid(parentHash, bidRuntime) + start := time.Now() defer func(simStart time.Time) { logCtx := []any{ @@ -532,6 +536,7 @@ func (b *bidSimulator) simBid(interruptCh chan int32, bidRuntime *BidRuntime) { } b.RemoveSimulatingBid(parentHash) + bidSimTimer.UpdateSince(start) }(time.Now()) // prepareWork will configure header with a suitable time according to consensus @@ -606,6 +611,8 @@ func (b *bidSimulator) simBid(interruptCh chan int32, bidRuntime *BidRuntime) { // reportIssue reports the issue to the mev-sentry func (b *bidSimulator) reportIssue(bidRuntime *BidRuntime, err error) { + metrics.GetOrRegisterCounter(fmt.Sprintf("bid/err/%v", bidRuntime.bid.Builder), nil).Inc(1) + cli := b.builders[bidRuntime.bid.Builder] if cli != nil { cli.ReportIssue(context.Background(), &types.BidIssue{ @@ -648,11 +655,11 @@ func (r *BidRuntime) commitTransaction(chain *core.BlockChain, chainConfig *para env = r.env snap = env.state.Snapshot() gp = env.gasPool.Gas() - sc *types.BlobTxSidecar + sc *types.BlobSidecar ) if tx.Type() == types.BlobTxType { - sc := tx.BlobTxSidecar() + sc := types.NewBlobSidecarFromTx(tx) if sc == nil { return errors.New("blob transaction without blobs in miner") } @@ -674,6 +681,7 @@ func (r *BidRuntime) commitTransaction(chain *core.BlockChain, chainConfig *para } if tx.Type() == types.BlobTxType { + sc.TxIndex = uint64(len(env.txs)) env.txs = append(env.txs, tx.WithoutBlobTxSidecar()) env.receipts = append(env.receipts, receipt) env.sidecars = append(env.sidecars, sc) diff --git a/miner/miner_mev.go b/miner/miner_mev.go index 01d2a71dce..26822eeba6 100644 --- a/miner/miner_mev.go +++ b/miner/miner_mev.go @@ -114,5 +114,6 @@ func (miner *Miner) MevParams() *types.MevParams { return &types.MevParams{ ValidatorCommission: miner.worker.config.Mev.ValidatorCommission, BidSimulationLeftOver: miner.worker.config.Mev.BidSimulationLeftOver, + GasCeil: miner.worker.config.GasCeil, } } diff --git a/miner/payload_building.go b/miner/payload_building.go index 719736c479..1ac3cd1c5a 100644 --- a/miner/payload_building.go +++ b/miner/payload_building.go @@ -71,7 +71,7 @@ type Payload struct { id engine.PayloadID empty *types.Block full *types.Block - sidecars []*types.BlobTxSidecar + sidecars types.BlobSidecars fullFees *big.Int stop chan struct{} lock sync.Mutex diff --git a/miner/worker.go b/miner/worker.go index 4f06018e02..076ecfd75b 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -89,7 +89,7 @@ type environment struct { header *types.Header txs []*types.Transaction receipts []*types.Receipt - sidecars []*types.BlobTxSidecar + sidecars types.BlobSidecars blobs int profit *big.Int // block gas fee + BNBSentToSystem @@ -112,8 +112,10 @@ func (env *environment) copy() *environment { cpy.txs = make([]*types.Transaction, len(env.txs)) copy(cpy.txs, env.txs) - cpy.sidecars = make([]*types.BlobTxSidecar, len(env.sidecars)) - copy(cpy.sidecars, env.sidecars) + if env.sidecars != nil { + cpy.sidecars = make(types.BlobSidecars, len(env.sidecars)) + copy(cpy.sidecars, env.sidecars) + } return cpy } @@ -157,8 +159,8 @@ type newWorkReq struct { type newPayloadResult struct { err error block *types.Block - fees *big.Int // total block fees - sidecars []*types.BlobTxSidecar // collected blobs of blob transactions + fees *big.Int // total block fees + sidecars types.BlobSidecars // collected blobs of blob transactions } // getWorkReq represents a request for getting a new sealing work with provided parameters. @@ -665,7 +667,6 @@ func (w *worker) resultLoop() { writeBlockTimer.UpdateSince(start) log.Info("Successfully sealed new block", "number", block.Number(), "sealhash", sealhash, "hash", hash, "elapsed", common.PrettyDuration(time.Since(task.createdAt))) - // Broadcast the block and announce chain insertion event w.mux.Post(core.NewMinedBlockEvent{Block: block}) case <-w.exitCh: @@ -737,7 +738,7 @@ func (w *worker) commitTransaction(env *environment, tx *types.Transaction, rece } func (w *worker) commitBlobTransaction(env *environment, tx *types.Transaction, receiptProcessors ...core.ReceiptProcessor) ([]*types.Log, error) { - sc := tx.BlobTxSidecar() + sc := types.NewBlobSidecarFromTx(tx) if sc == nil { panic("blob transaction without blobs in miner") } @@ -753,6 +754,7 @@ func (w *worker) commitBlobTransaction(env *environment, tx *types.Transaction, if err != nil { return nil, err } + sc.TxIndex = uint64(len(env.txs)) env.txs = append(env.txs, tx.WithoutBlobTxSidecar()) env.receipts = append(env.receipts, receipt) env.sidecars = append(env.sidecars, sc) @@ -1007,6 +1009,12 @@ func (w *worker) prepareWork(genParams *generateParams) (*environment, error) { header.GasLimit = core.CalcGasLimit(parentGasLimit, w.config.GasCeil) } } + // Run the consensus preparation with the default or customized consensus engine. + // Note that the `header.Time` may be changed. + if err := w.engine.Prepare(w.chain, header); err != nil { + log.Error("Failed to prepare header for sealing", "err", err) + return nil, err + } // Apply EIP-4844, EIP-4788. if w.chainConfig.IsCancun(header.Number, header.Time) { var excessBlobGas uint64 @@ -1018,15 +1026,13 @@ func (w *worker) prepareWork(genParams *generateParams) (*environment, error) { } header.BlobGasUsed = new(uint64) header.ExcessBlobGas = &excessBlobGas + if w.chainConfig.Parlia != nil { + header.WithdrawalsHash = new(common.Hash) + } if w.chainConfig.Parlia == nil { header.ParentBeaconRoot = genParams.beaconRoot } } - // Run the consensus preparation with the default or customized consensus engine. - if err := w.engine.Prepare(w.chain, header); err != nil { - log.Error("Failed to prepare header for sealing", "err", err) - return nil, err - } // Could potentially happen if starting to mine in an odd state. // Note genParams.coinbase can be different with header.Coinbase // since clique algorithm can modify the coinbase field in header. @@ -1133,6 +1139,7 @@ func (w *worker) generateWork(params *generateParams) *newPayloadResult { if err != nil { return &newPayloadResult{err: err} } + return &newPayloadResult{ block: block, fees: fees.ToBig(), @@ -1336,6 +1343,7 @@ LOOP: // when out-turn, use bestWork to prevent bundle leakage. // when in-turn, compare with remote work. + from := bestWork.coinbase if w.bidFetcher != nil && bestWork.header.Difficulty.Cmp(diffInTurn) == 0 { bestBid := w.bidFetcher.GetBestBid(bestWork.header.ParentHash) @@ -1347,10 +1355,13 @@ LOOP: // blockReward(benefits delegators) and validatorReward(benefits the validator) are both optimal if localValidatorReward.CmpBig(bestBid.packedValidatorReward) < 0 { bestWork = bestBid.env + from = bestBid.bid.Builder } } } + metrics.GetOrRegisterCounter(fmt.Sprintf("block/from/%v", from), nil).Inc(1) + w.commit(bestWork, w.fullTaskHook, true, start) // Swap out the old work with the new one, terminating any leftover @@ -1396,10 +1407,16 @@ func (w *worker) commit(env *environment, interval func(), update bool, start ti // env.receipts = receipts finalizeBlockTimer.UpdateSince(finalizeStart) + // If Cancun enabled, sidecars can't be nil then. + if w.chainConfig.IsCancun(env.header.Number, env.header.Time) && env.sidecars == nil { + env.sidecars = make(types.BlobSidecars, 0) + } // Create a local environment copy, avoid the data race with snapshot state. // https://github.com/ethereum/go-ethereum/issues/24299 env := env.copy() + block = block.WithSidecars(env.sidecars) + // If we're post merge, just ignore if !w.isTTDReached(block.Header()) { select { diff --git a/node/config.go b/node/config.go index bc30a0ab0a..a3dcd3c9f8 100644 --- a/node/config.go +++ b/node/config.go @@ -239,6 +239,8 @@ type Config struct { EnablePersonal bool `toml:"-"` DBEngine string `toml:",omitempty"` + + Instance int `toml:",omitempty"` } // IPCEndpoint resolves an IPC endpoint based on a configured value, taking into diff --git a/node/defaults.go b/node/defaults.go index 29cb68947a..2defed7215 100644 --- a/node/defaults.go +++ b/node/defaults.go @@ -28,12 +28,14 @@ import ( ) const ( - DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server - DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server - DefaultWSHost = "localhost" // Default host interface for the websocket RPC server - DefaultWSPort = 8546 // Default TCP port for the websocket RPC server - DefaultAuthHost = "localhost" // Default host interface for the authenticated apis - DefaultAuthPort = 8551 // Default port for the authenticated apis + DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server + DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server + DefaultWSHost = "localhost" // Default host interface for the websocket RPC server + DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultAuthHost = "localhost" // Default host interface for the authenticated apis + DefaultAuthPort = 8551 // Default port for the authenticated apis + DefaultListenPort = 30303 // Default port for the TCP listening address + DefaultDiscPort = 30303 // Default port for the UDP discovery address ) const ( @@ -73,7 +75,8 @@ var DefaultConfig = Config{ MaxPeersPerIP: 0, // by default, it will be same as MaxPeers NAT: nat.Any(), }, - DBEngine: "", // Use whatever exists, will default to Leveldb if non-existent and supported + DBEngine: "", // Use whatever exists, will default to Pebble if non-existent and supported + Instance: 1, } // DefaultDataDir is the default data directory to use for the databases and other diff --git a/params/config.go b/params/config.go index 9824658f1a..bc438b25f8 100644 --- a/params/config.go +++ b/params/config.go @@ -150,6 +150,8 @@ var ( // UnixTime: 1705996800 is January 23, 2024 8:00:00 AM UTC ShanghaiTime: newUint64(1705996800), KeplerTime: newUint64(1705996800), + // TODO(GalaIO): enable cancun fork time later + //CancunTime: newUint64(), // TODO FeynmanTime: nil, @@ -187,9 +189,12 @@ var ( HertzBlock: big.NewInt(31103030), HertzfixBlock: big.NewInt(35682300), // UnixTime: 1702972800 is December 19, 2023 8:00:00 AM UTC - ShanghaiTime: newUint64(1702972800), - KeplerTime: newUint64(1702972800), - FeynmanTime: newUint64(1710136800), + ShanghaiTime: newUint64(1702972800), + KeplerTime: newUint64(1702972800), + FeynmanTime: newUint64(1710136800), + FeynmanFixTime: newUint64(1711342800), + // TODO(GalaIO): enable cancun fork time later + //CancunTime: newUint64(), Parlia: &ParliaConfig{ Period: 3, @@ -227,6 +232,8 @@ var ( ShanghaiTime: newUint64(0), KeplerTime: newUint64(0), FeynmanTime: newUint64(0), + FeynmanFixTime: newUint64(0), + CancunTime: newUint64(0), Parlia: &ParliaConfig{ Period: 3, @@ -260,6 +267,11 @@ var ( LondonBlock: big.NewInt(0), HertzBlock: big.NewInt(0), HertzfixBlock: big.NewInt(0), + ShanghaiTime: newUint64(0), + KeplerTime: newUint64(0), + FeynmanTime: newUint64(0), + FeynmanFixTime: newUint64(0), + CancunTime: newUint64(0), Parlia: &ParliaConfig{ Period: 3, Epoch: 200, @@ -312,6 +324,7 @@ var ( ArrowGlacierBlock: big.NewInt(0), GrayGlacierBlock: big.NewInt(0), ShanghaiTime: newUint64(0), + CancunTime: newUint64(0), TerminalTotalDifficulty: big.NewInt(0), TerminalTotalDifficultyPassed: true, } @@ -491,12 +504,13 @@ type ChainConfig struct { // Fork scheduling was switched from blocks to timestamps here - ShanghaiTime *uint64 `json:"shanghaiTime,omitempty"` // Shanghai switch time (nil = no fork, 0 = already on shanghai) - KeplerTime *uint64 `json:"keplerTime,omitempty"` // Kepler switch time (nil = no fork, 0 = already activated) - FeynmanTime *uint64 `json:"feynmanTime,omitempty"` // Feynman switch time (nil = no fork, 0 = already activated) - CancunTime *uint64 `json:"cancunTime,omitempty"` // Cancun switch time (nil = no fork, 0 = already on cancun) - PragueTime *uint64 `json:"pragueTime,omitempty"` // Prague switch time (nil = no fork, 0 = already on prague) - VerkleTime *uint64 `json:"verkleTime,omitempty"` // Verkle switch time (nil = no fork, 0 = already on verkle) + ShanghaiTime *uint64 `json:"shanghaiTime,omitempty"` // Shanghai switch time (nil = no fork, 0 = already on shanghai) + KeplerTime *uint64 `json:"keplerTime,omitempty"` // Kepler switch time (nil = no fork, 0 = already activated) + FeynmanTime *uint64 `json:"feynmanTime,omitempty"` // Feynman switch time (nil = no fork, 0 = already activated) + FeynmanFixTime *uint64 `json:"feynmanFixTime,omitempty"` // FeynmanFix switch time (nil = no fork, 0 = already activated) + CancunTime *uint64 `json:"cancunTime,omitempty"` // Cancun switch time (nil = no fork, 0 = already on cancun) + PragueTime *uint64 `json:"pragueTime,omitempty"` // Prague switch time (nil = no fork, 0 = already on prague) + VerkleTime *uint64 `json:"verkleTime,omitempty"` // Verkle switch time (nil = no fork, 0 = already on verkle) // TerminalTotalDifficulty is the amount of total difficulty reached by // the network that triggers the consensus upgrade. @@ -590,7 +604,17 @@ func (c *ChainConfig) String() string { FeynmanTime = big.NewInt(0).SetUint64(*c.FeynmanTime) } - return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Ramanujan: %v, Niels: %v, MirrorSync: %v, Bruno: %v, Berlin: %v, YOLO v3: %v, CatalystBlock: %v, London: %v, ArrowGlacier: %v, MergeFork:%v, Euler: %v, Gibbs: %v, Nano: %v, Moran: %v, Planck: %v,Luban: %v, Plato: %v, Hertz: %v, Hertzfix: %v, ShanghaiTime: %v, KeplerTime: %v, FeynmanTime: %v, Engine: %v}", + var FeynmanFixTime *big.Int + if c.FeynmanFixTime != nil { + FeynmanFixTime = big.NewInt(0).SetUint64(*c.FeynmanFixTime) + } + + var CancunTime *big.Int + if c.CancunTime != nil { + CancunTime = big.NewInt(0).SetUint64(*c.CancunTime) + } + + return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Ramanujan: %v, Niels: %v, MirrorSync: %v, Bruno: %v, Berlin: %v, YOLO v3: %v, CatalystBlock: %v, London: %v, ArrowGlacier: %v, MergeFork:%v, Euler: %v, Gibbs: %v, Nano: %v, Moran: %v, Planck: %v,Luban: %v, Plato: %v, Hertz: %v, Hertzfix: %v, ShanghaiTime: %v, KeplerTime: %v, FeynmanTime: %v, FeynmanFixTime: %v, CancunTime: %v, Engine: %v}", c.ChainID, c.HomesteadBlock, c.DAOForkBlock, @@ -625,6 +649,8 @@ func (c *ChainConfig) String() string { ShanghaiTime, KeplerTime, FeynmanTime, + FeynmanFixTime, + CancunTime, engine, ) } @@ -873,6 +899,20 @@ func (c *ChainConfig) IsOnFeynman(currentBlockNumber *big.Int, lastBlockTime uin return !c.IsFeynman(lastBlockNumber, lastBlockTime) && c.IsFeynman(currentBlockNumber, currentBlockTime) } +// IsFeynmanFix returns whether time is either equal to the FeynmanFix fork time or greater. +func (c *ChainConfig) IsFeynmanFix(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.FeynmanFixTime, time) +} + +// IsOnFeynmanFix returns whether currentBlockTime is either equal to the FeynmanFix fork time or greater firstly. +func (c *ChainConfig) IsOnFeynmanFix(currentBlockNumber *big.Int, lastBlockTime uint64, currentBlockTime uint64) bool { + lastBlockNumber := new(big.Int) + if currentBlockNumber.Cmp(big.NewInt(1)) >= 0 { + lastBlockNumber.Sub(currentBlockNumber, big.NewInt(1)) + } + return !c.IsFeynmanFix(lastBlockNumber, lastBlockTime) && c.IsFeynmanFix(currentBlockNumber, currentBlockTime) +} + // IsCancun returns whether num is either equal to the Cancun fork time or greater. func (c *ChainConfig) IsCancun(num *big.Int, time uint64) bool { return c.IsLondon(num) && isTimestampForked(c.CancunTime, time) @@ -939,7 +979,8 @@ func (c *ChainConfig) CheckConfigForkOrder() error { {name: "hertzfixBlock", block: c.HertzfixBlock}, {name: "keplerTime", timestamp: c.KeplerTime}, {name: "feynmanTime", timestamp: c.FeynmanTime}, - {name: "cancunTime", timestamp: c.CancunTime, optional: true}, + {name: "feynmanFixTime", timestamp: c.FeynmanFixTime}, + {name: "cancunTime", timestamp: c.CancunTime}, {name: "pragueTime", timestamp: c.PragueTime, optional: true}, {name: "verkleTime", timestamp: c.VerkleTime, optional: true}, } { @@ -1081,6 +1122,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, headNumber *big.Int, if isForkTimestampIncompatible(c.FeynmanTime, newcfg.FeynmanTime, headTimestamp) { return newTimestampCompatError("Feynman fork timestamp", c.FeynmanTime, newcfg.FeynmanTime) } + if isForkTimestampIncompatible(c.FeynmanFixTime, newcfg.FeynmanFixTime, headTimestamp) { + return newTimestampCompatError("FeynmanFix fork timestamp", c.FeynmanFixTime, newcfg.FeynmanFixTime) + } if isForkTimestampIncompatible(c.CancunTime, newcfg.CancunTime, headTimestamp) { return newTimestampCompatError("Cancun fork timestamp", c.CancunTime, newcfg.CancunTime) } diff --git a/params/network_params.go b/params/network_params.go index cc322e86f4..4ab2a63a54 100644 --- a/params/network_params.go +++ b/params/network_params.go @@ -56,15 +56,17 @@ const ( // StableStateThreshold is the reserve number of block state save to disk before delete ancientdb StableStateThreshold uint64 = 128 - // FullImmutabilityThreshold is the number of blocks after which a chain segment is - // considered immutable (i.e. soft finality). It is used by the downloader as a - // hard limit against deep ancestors, by the blockchain against deep reorgs, by - // the freezer as the cutoff threshold and by clique as the snapshot trust limit. - FullImmutabilityThreshold = 90000 - // LightImmutabilityThreshold is the number of blocks after which a header chain // segment is considered immutable for light client(i.e. soft finality). It is used by // the downloader as a hard limit against deep ancestors, by the blockchain against deep // reorgs, by the light pruner as the pruning validity guarantee. LightImmutabilityThreshold = 30000 ) + +var ( + // FullImmutabilityThreshold is the number of blocks after which a chain segment is + // considered immutable (i.e. soft finality). It is used by the downloader as a + // hard limit against deep ancestors, by the blockchain against deep reorgs, by + // the freezer as the cutoff threshold and by clique as the snapshot trust limit. + FullImmutabilityThreshold uint64 = 90000 +) diff --git a/params/protocol_params.go b/params/protocol_params.go index b84fa148fc..95c1eb266d 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -185,6 +185,11 @@ const ( MaxBlobGasPerBlock = 6 * BlobTxBlobGasPerBlob // Maximum consumable blob gas for data blobs per block ) +var ( + MinBlocksForBlobRequests uint64 = 524288 // it keeps blob data available for ~18.2 days in local, ref: https://github.com/bnb-chain/BEPs/blob/master/BEPs/BEP-336.md#51-parameters. + DefaultExtraReserveForBlobRequests uint64 = 1 * (24 * 3600) / 3 // it adds more time for expired blobs for some request cases, like expiry blob when remote peer is syncing, default 1 day. +) + // Gas discount table for BLS12-381 G1 and G2 multi exponentiation operations var Bls12381MultiExpDiscountTable = [128]uint64{1200, 888, 764, 641, 594, 547, 500, 453, 438, 423, 408, 394, 379, 364, 349, 334, 330, 326, 322, 318, 314, 310, 306, 302, 298, 294, 289, 285, 281, 277, 273, 269, 268, 266, 265, 263, 262, 260, 259, 257, 256, 254, 253, 251, 250, 248, 247, 245, 244, 242, 241, 239, 238, 236, 235, 233, 232, 231, 229, 228, 226, 225, 223, 222, 221, 220, 219, 219, 218, 217, 216, 216, 215, 214, 213, 213, 212, 211, 211, 210, 209, 208, 208, 207, 206, 205, 205, 204, 203, 202, 202, 201, 200, 199, 199, 198, 197, 196, 196, 195, 194, 193, 193, 192, 191, 191, 190, 189, 188, 188, 187, 186, 185, 185, 184, 183, 182, 182, 181, 180, 179, 179, 178, 177, 176, 176, 175, 174} @@ -194,8 +199,8 @@ var ( MinimumDifficulty = big.NewInt(131072) // The minimum that the difficulty may ever be. DurationLimit = big.NewInt(13) // The decision boundary on the blocktime duration used to determine whether difficulty should go up or not. - // BeaconRootsStorageAddress is the address where historical beacon roots are stored as per EIP-4788 - BeaconRootsStorageAddress = common.HexToAddress("0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02") + // BeaconRootsAddress is the address where historical beacon roots are stored as per EIP-4788 + BeaconRootsAddress = common.HexToAddress("0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02") // SystemAddress is where the system-transaction is sent from as per EIP-4788 - SystemAddress common.Address = common.HexToAddress("0xfffffffffffffffffffffffffffffffffffffffe") + SystemAddress = common.HexToAddress("0xfffffffffffffffffffffffffffffffffffffffe") ) diff --git a/params/version.go b/params/version.go index a68d4a1279..6dad103e93 100644 --- a/params/version.go +++ b/params/version.go @@ -23,7 +23,7 @@ import ( const ( VersionMajor = 1 // Major version component of the current release VersionMinor = 4 // Minor version component of the current release - VersionPatch = 2 // Patch version component of the current release + VersionPatch = 3 // Patch version component of the current release VersionMeta = "" // Version metadata to append to the version string ) diff --git a/tests/0001-diff-go-ethereum.patch b/tests/0001-diff-go-ethereum.patch index 32ad84b430..a6187ee4b6 100644 --- a/tests/0001-diff-go-ethereum.patch +++ b/tests/0001-diff-go-ethereum.patch @@ -1,8 +1,8 @@ diff --git a/core/vm/contracts.go b/core/vm/contracts.go -index 36d33e41c..adb10883e 100644 +index 5988bb15f..c92cbf542 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go -@@ -78,9 +78,6 @@ var PrecompiledContractsIstanbul = map[common.Address]PrecompiledContract{ +@@ -83,9 +83,6 @@ var PrecompiledContractsIstanbul = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, common.BytesToAddress([]byte{9}): &blake2F{}, @@ -12,6 +12,20 @@ index 36d33e41c..adb10883e 100644 } var PrecompiledContractsNano = map[common.Address]PrecompiledContract{ +@@ -238,13 +235,6 @@ var PrecompiledContractsCancun = map[common.Address]PrecompiledContract{ + common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, + common.BytesToAddress([]byte{9}): &blake2F{}, + common.BytesToAddress([]byte{0x0a}): &kzgPointEvaluation{}, +- +- common.BytesToAddress([]byte{100}): &tmHeaderValidate{}, +- common.BytesToAddress([]byte{101}): &iavlMerkleProofValidatePlato{}, +- common.BytesToAddress([]byte{102}): &blsSignatureVerify{}, +- common.BytesToAddress([]byte{103}): &cometBFTLightBlockValidateHertz{}, +- common.BytesToAddress([]byte{104}): &verifyDoubleSignEvidence{}, +- common.BytesToAddress([]byte{105}): &secp256k1SignatureRecover{}, + } + + // PrecompiledContractsBLS contains the set of pre-compiled Ethereum diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 70c543f14..65716f944 100644 --- a/core/vm/jump_table.go @@ -26,7 +40,7 @@ index 70c543f14..65716f944 100644 enable3860(&instructionSet) // Limit and meter initcode diff --git a/params/protocol_params.go b/params/protocol_params.go -index b32b4d943..8b544af08 100644 +index b84fa148f..97bf6c4d2 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -23,7 +23,7 @@ import ( diff --git a/tests/init_test.go b/tests/init_test.go index f9b6025d54..2e2c4fa11d 100644 --- a/tests/init_test.go +++ b/tests/init_test.go @@ -252,10 +252,6 @@ func (tm *testMatcher) runTestFile(t *testing.T, path, name string, runTest inte if r, _ := tm.findSkip(name); r != "" { t.Skip(r) } - // TODO(Nathan): fix before enable Cancun - if strings.Contains(key, "Cancun") { - return - } runTestFunc(runTest, t, name, m, key) }) } diff --git a/tests/truffle/scripts/bsc-rpc.sh b/tests/truffle/scripts/bsc-rpc.sh index 3b175d08e2..29042c1349 100755 --- a/tests/truffle/scripts/bsc-rpc.sh +++ b/tests/truffle/scripts/bsc-rpc.sh @@ -11,6 +11,6 @@ while [ "$i" -lt ${account_cnt} ]; do done geth --config ${DATA_DIR}/config.toml --datadir ${DATA_DIR} --netrestrict ${CLUSTER_CIDR} \ - --verbosity ${VERBOSE} --nousb \ + --verbosity ${VERBOSE} --nousb --syncmode "full"\ --rpc.allow-unprotected-txs --history.transactions 15768000 \ -unlock ${unlock_sequences} --password /dev/null >${DATA_DIR}/bscnode-rpc.log diff --git a/triedb/database.go b/triedb/database.go index 11e7cc33ee..14393c1e43 100644 --- a/triedb/database.go +++ b/triedb/database.go @@ -132,12 +132,12 @@ func NewDatabase(diskdb ethdb.Database, config *Config) *Database { */ if config.HashDB != nil { if rawdb.ReadStateScheme(triediskdb) == rawdb.PathScheme { - log.Warn("incompatible state scheme", "old", rawdb.PathScheme, "new", rawdb.HashScheme) + log.Warn("Incompatible state scheme", "old", rawdb.PathScheme, "new", rawdb.HashScheme) } db.backend = hashdb.New(triediskdb, config.HashDB, trie.MerkleResolver{}) } else if config.PathDB != nil { if rawdb.ReadStateScheme(triediskdb) == rawdb.HashScheme { - log.Warn("incompatible state scheme", "old", rawdb.HashScheme, "new", rawdb.PathScheme) + log.Warn("Incompatible state scheme", "old", rawdb.HashScheme, "new", rawdb.PathScheme) } db.backend = pathdb.New(triediskdb, config.PathDB) } else if strings.Compare(dbScheme, rawdb.PathScheme) == 0 { diff --git a/triedb/pathdb/asyncnodebuffer.go b/triedb/pathdb/asyncnodebuffer.go index 2c96fedc02..a94fab4461 100644 --- a/triedb/pathdb/asyncnodebuffer.go +++ b/triedb/pathdb/asyncnodebuffer.go @@ -72,7 +72,7 @@ func (a *asyncnodebuffer) commit(nodes map[common.Hash]map[string]*trienode.Node err := a.current.commit(nodes) if err != nil { - log.Crit("[BUG] failed to commit nodes to asyncnodebuffer", "error", err) + log.Crit("[BUG] Failed to commit nodes to asyncnodebuffer", "error", err) } return a } @@ -87,7 +87,7 @@ func (a *asyncnodebuffer) revert(db ethdb.KeyValueReader, nodes map[common.Hash] var err error a.current, err = a.current.merge(a.background) if err != nil { - log.Crit("[BUG] failed to merge node cache under revert async node buffer", "error", err) + log.Crit("[BUG] Failed to merge node cache under revert async node buffer", "error", err) } a.background.reset() return a.current.revert(db, nodes) @@ -129,7 +129,7 @@ func (a *asyncnodebuffer) flush(db ethdb.KeyValueStore, clean *fastcache.Cache, for { if atomic.LoadUint64(&a.background.immutable) == 1 { time.Sleep(time.Duration(DefaultBackgroundFlushInterval) * time.Second) - log.Info("waiting background memory table flushed into disk for forcing flush node buffer") + log.Info("Waiting background memory table flushed into disk for forcing flush node buffer") continue } atomic.StoreUint64(&a.current.immutable, 1) @@ -155,10 +155,10 @@ func (a *asyncnodebuffer) flush(db ethdb.KeyValueStore, clean *fastcache.Cache, for { err := a.background.flush(db, clean, persistID) if err == nil { - log.Debug("succeed to flush background nodecache to disk", "state_id", persistID) + log.Debug("Succeed to flush background nodecache to disk", "state_id", persistID) return } - log.Error("failed to flush background nodecache to disk", "state_id", persistID, "error", err) + log.Error("Failed to flush background nodecache to disk", "state_id", persistID, "error", err) } }(id) return nil @@ -168,7 +168,7 @@ func (a *asyncnodebuffer) waitAndStopFlushing() { a.stopFlushing.Store(true) for a.isFlushing.Load() { time.Sleep(time.Second) - log.Warn("waiting background memory table flushed into disk") + log.Warn("Waiting background memory table flushed into disk") } } @@ -178,7 +178,7 @@ func (a *asyncnodebuffer) getAllNodes() map[common.Hash]map[string]*trienode.Nod cached, err := a.current.merge(a.background) if err != nil { - log.Crit("[BUG] failed to merge node cache under revert async node buffer", "error", err) + log.Crit("[BUG] Failed to merge node cache under revert async node buffer", "error", err) } return cached.nodes } diff --git a/triedb/pathdb/database.go b/triedb/pathdb/database.go index e9edf0dcfa..15183cb031 100644 --- a/triedb/pathdb/database.go +++ b/triedb/pathdb/database.go @@ -215,7 +215,6 @@ func New(diskdb ethdb.Database, config *Config) *Database { log.Crit("Failed to disable database", "err", err) // impossible to happen } } - log.Warn("Path-based state scheme is an experimental feature", "sync", db.config.SyncFlush) return db } diff --git a/triedb/pathdb/disklayer.go b/triedb/pathdb/disklayer.go index d25a65e515..f0f8dbe84b 100644 --- a/triedb/pathdb/disklayer.go +++ b/triedb/pathdb/disklayer.go @@ -79,10 +79,10 @@ type trienodebuffer interface { func NewTrieNodeBuffer(sync bool, limit int, nodes map[common.Hash]map[string]*trienode.Node, layers uint64) trienodebuffer { if sync { - log.Info("new sync node buffer", "limit", common.StorageSize(limit), "layers", layers) + log.Info("New sync node buffer", "limit", common.StorageSize(limit), "layers", layers) return newNodeBuffer(limit, nodes, layers) } - log.Info("new async node buffer", "limit", common.StorageSize(limit), "layers", layers) + log.Info("New async node buffer", "limit", common.StorageSize(limit), "layers", layers) return newAsyncNodeBuffer(limit, nodes, layers) }