diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index e9979b0699..92cee17c12 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -6,6 +6,10 @@ on: tags: - 'pre-*' +env: + CGO_CFLAGS: "-O -D__BLST_PORTABLE__" + CGO_CFLAGS_ALLOW: "-O -D__BLST_PORTABLE__" + jobs: build: name: Build Release diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e771923e56..18f043788b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,9 @@ on: # Publish `v1.2.3` tags as releases. tags: - v* +env: + CGO_CFLAGS: "-O -D__BLST_PORTABLE__" + CGO_CFLAGS_ALLOW: "-O -D__BLST_PORTABLE__" jobs: build: diff --git a/CHANGELOG.md b/CHANGELOG.md index 780fe2e162..843c129e3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,28 @@ # Changelog +## v1.2.2 +FEATURE +* [\#1574](https://github.com/bnb-chain/bsc/pull/1574) upgrade: update PlatoUpgrade contracts code +* [\#1594](https://github.com/bnb-chain/bsc/pull/1594) upgrade: block height of Plato on testnet + +IMPROVEMENT +* [\#866](https://github.com/bnb-chain/bsc/pull/866) code: x = append(y) is equivalent to x = y +* [\#1488](https://github.com/bnb-chain/bsc/pull/1488) eth/tracers, core/vm: remove `time` from trace output and tracing interface +* [\#1547](https://github.com/bnb-chain/bsc/pull/1547) fix: recently signed check when slashing unavailable validator +* [\#1573](https://github.com/bnb-chain/bsc/pull/1573) feat: remove supports for legacy proof type +* [\#1576](https://github.com/bnb-chain/bsc/pull/1576) fix: support golang 1.20 by upgrading prysm to v4 +* [\#1578](https://github.com/bnb-chain/bsc/pull/1578) fix: output an error log when bsc extension fail to handshake +* [\#1583](https://github.com/bnb-chain/bsc/pull/1583) metrics: add a counter for validator to check work status of voting + +BUGFIX +* [\#1566](https://github.com/bnb-chain/bsc/pull/1566) fix: config for VoteJournalDir and BLSWalletDir +* [\#1572](https://github.com/bnb-chain/bsc/pull/1572) fix: remove dynamic metric labels about fast finality +* [\#1575](https://github.com/bnb-chain/bsc/pull/1575) fix: make BLST PORTABLE for release binary +* [\#1590](https://github.com/bnb-chain/bsc/pull/1590) fix: fix snap flaky tests + +## v1.2.1 +IMPROVEMENT +* [\#1527](https://github.com/bnb-chain/bsc/pull/1527) log: revert a log back to trace level + ## v1.2.0 FEATURE * [\#936](https://github.com/bnb-chain/bsc/pull/936) BEP-126: Introduce Fast Finality Mechanism diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index 036b968ef8..86a81914ff 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -35,19 +35,21 @@ import ( func main() { var ( - listenAddr = flag.String("addr", ":30301", "listen address") - genKey = flag.String("genkey", "", "generate a node key") - writeAddr = flag.Bool("writeaddress", false, "write out the node's public key and quit") - nodeKeyFile = flag.String("nodekey", "", "private key filename") - nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)") - natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:)") - netrestrict = flag.String("netrestrict", "", "restrict network communication to the given IP networks (CIDR masks)") - runv5 = flag.Bool("v5", false, "run a v5 topic discovery bootnode") - verbosity = flag.Int("verbosity", int(log.LvlInfo), "log verbosity (0-5)") - vmodule = flag.String("vmodule", "", "log verbosity pattern") - - nodeKey *ecdsa.PrivateKey - err error + listenAddr = flag.String("addr", ":30301", "listen address") + genKey = flag.String("genkey", "", "generate a node key") + writeAddr = flag.Bool("writeaddress", false, "write out the node's public key and quit") + nodeKeyFile = flag.String("nodekey", "", "private key filename") + nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)") + natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:)") + netrestrict = flag.String("netrestrict", "", "restrict network communication to the given IP networks (CIDR masks)") + runv5 = flag.Bool("v5", false, "run a v5 topic discovery bootnode") + verbosity = flag.Int("verbosity", int(log.LvlInfo), "log verbosity (0-5)") + vmodule = flag.String("vmodule", "", "log verbosity pattern") + networkFilter = flag.String("network", "", " filters nodes by eth ENR entry") + + nodeKey *ecdsa.PrivateKey + filterFunction discover.NodeFilterFunc + err error ) flag.Parse() @@ -86,6 +88,12 @@ func main() { } } + if *networkFilter != "" { + if filterFunction, err = discover.ParseEthFilter(*networkFilter); err != nil { + utils.Fatalf("-network: %v", err) + } + } + if *writeAddr { fmt.Printf("%x\n", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:]) os.Exit(0) @@ -123,8 +131,9 @@ func main() { db, _ := enode.OpenDB("") ln := enode.NewLocalNode(db, nodeKey) cfg := discover.Config{ - PrivateKey: nodeKey, - NetRestrict: restrictList, + PrivateKey: nodeKey, + NetRestrict: restrictList, + FilterFunction: filterFunction, } if *runv5 { if _, err := discover.ListenV5(conn, ln, cfg); err != nil { diff --git a/cmd/geth/blsaccountcmd.go b/cmd/geth/blsaccountcmd.go index 45d11269e7..08f1c01309 100644 --- a/cmd/geth/blsaccountcmd.go +++ b/cmd/geth/blsaccountcmd.go @@ -12,16 +12,16 @@ import ( "github.com/google/uuid" "github.com/logrusorgru/aurora" - "github.com/prysmaticlabs/prysm/v3/crypto/bls" - "github.com/prysmaticlabs/prysm/v3/encoding/bytesutil" - "github.com/prysmaticlabs/prysm/v3/io/prompt" - "github.com/prysmaticlabs/prysm/v3/proto/eth/service" - "github.com/prysmaticlabs/prysm/v3/validator/accounts" - "github.com/prysmaticlabs/prysm/v3/validator/accounts/iface" - "github.com/prysmaticlabs/prysm/v3/validator/accounts/petnames" - "github.com/prysmaticlabs/prysm/v3/validator/accounts/wallet" - "github.com/prysmaticlabs/prysm/v3/validator/keymanager" - "github.com/prysmaticlabs/prysm/v3/validator/keymanager/local" + "github.com/prysmaticlabs/prysm/v4/crypto/bls" + "github.com/prysmaticlabs/prysm/v4/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/v4/io/prompt" + "github.com/prysmaticlabs/prysm/v4/proto/eth/service" + "github.com/prysmaticlabs/prysm/v4/validator/accounts" + "github.com/prysmaticlabs/prysm/v4/validator/accounts/iface" + "github.com/prysmaticlabs/prysm/v4/validator/accounts/petnames" + "github.com/prysmaticlabs/prysm/v4/validator/accounts/wallet" + "github.com/prysmaticlabs/prysm/v4/validator/keymanager" + "github.com/prysmaticlabs/prysm/v4/validator/keymanager/local" keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" "gopkg.in/urfave/cli.v1" diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 7a73a0a988..c1b7bc9e93 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1403,7 +1403,7 @@ func setVoteJournalDir(ctx *cli.Context, cfg *node.Config) { dataDir := cfg.DataDir if ctx.GlobalIsSet(VoteJournalDirFlag.Name) { cfg.VoteJournalDir = ctx.GlobalString(VoteJournalDirFlag.Name) - } else { + } else if cfg.VoteJournalDir == "" { cfg.VoteJournalDir = filepath.Join(dataDir, "voteJournal") } } @@ -1412,7 +1412,7 @@ func setBLSWalletDir(ctx *cli.Context, cfg *node.Config) { dataDir := cfg.DataDir if ctx.GlobalIsSet(BLSWalletDirFlag.Name) { cfg.BLSWalletDir = ctx.GlobalString(BLSWalletDirFlag.Name) - } else { + } else if cfg.BLSWalletDir == "" { cfg.BLSWalletDir = filepath.Join(dataDir, "bls/wallet") } } diff --git a/consensus/parlia/parlia.go b/consensus/parlia/parlia.go index a1eaf83a30..2c2de749cc 100644 --- a/consensus/parlia/parlia.go +++ b/consensus/parlia/parlia.go @@ -16,7 +16,7 @@ import ( "time" lru "github.com/hashicorp/golang-lru" - "github.com/prysmaticlabs/prysm/v3/crypto/bls" + "github.com/prysmaticlabs/prysm/v4/crypto/bls" "github.com/willf/bitset" "golang.org/x/crypto/sha3" @@ -75,9 +75,10 @@ var ( diffInTurn = big.NewInt(2) // Block difficulty for in-turn signatures diffNoTurn = big.NewInt(1) // Block difficulty for out-of-turn signatures // 100 native token - maxSystemBalance = new(big.Int).Mul(big.NewInt(100), big.NewInt(params.Ether)) - verifyVoteAttestationFailedGauge = metrics.NewRegisteredGauge("parlia/verifyVoteAttestationFailed", nil) - updateAttestationFailedGauge = metrics.NewRegisteredGauge("parlia/updateAttestationFailed", nil) + maxSystemBalance = new(big.Int).Mul(big.NewInt(100), big.NewInt(params.Ether)) + verifyVoteAttestationErrorCounter = metrics.NewRegisteredCounter("parlia/verifyVoteAttestation/error", nil) + updateAttestationErrorCounter = metrics.NewRegisteredCounter("parlia/updateAttestation/error", nil) + validVotesfromSelfCounter = metrics.NewRegisteredCounter("parlia/VerifyVote/self", nil) systemContracts = map[common.Address]bool{ common.HexToAddress(systemcontracts.ValidatorContract): true, @@ -599,7 +600,7 @@ func (p *Parlia) verifyCascadingFields(chain consensus.ChainHeaderReader, header // Verify vote attestation for fast finality. if err := p.verifyVoteAttestation(chain, header, parents); err != nil { - verifyVoteAttestationFailedGauge.Inc(1) + verifyVoteAttestationErrorCounter.Inc(1) if chain.Config().IsPlato(header.Number) { return err } @@ -754,13 +755,8 @@ func (p *Parlia) verifySeal(chain consensus.ChainHeaderReader, header *types.Hea return errUnauthorizedValidator } - for seen, recent := range snap.Recents { - if recent == signer { - // Signer is among recents, only fail if the current block doesn't shift it out - if limit := uint64(len(snap.Validators)/2 + 1); seen > number-limit { - return errRecentlySigned - } - } + if snap.SignRecently(signer) { + return errRecentlySigned } // Ensure that the difficulty corresponds to the turn-ness of the signer @@ -1065,12 +1061,17 @@ func (p *Parlia) Finalize(chain consensus.ChainHeaderReader, header *types.Heade if header.Difficulty.Cmp(diffInTurn) != 0 { spoiledVal := snap.supposeValidator() signedRecently := false - for _, recent := range snap.Recents { - if recent == spoiledVal { - signedRecently = true - break + if p.chainConfig.IsPlato(header.Number) { + signedRecently = snap.SignRecently(spoiledVal) + } else { + for _, recent := range snap.Recents { + if recent == spoiledVal { + signedRecently = true + break + } } } + if !signedRecently { log.Trace("slash validator", "block hash", header.Hash(), "address", spoiledVal) err = p.slash(spoiledVal, state, header, cx, txs, receipts, systemTxs, usedGas, false) @@ -1123,10 +1124,14 @@ func (p *Parlia) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header * } spoiledVal := snap.supposeValidator() signedRecently := false - for _, recent := range snap.Recents { - if recent == spoiledVal { - signedRecently = true - break + if p.chainConfig.IsPlato(header.Number) { + signedRecently = snap.SignRecently(spoiledVal) + } else { + for _, recent := range snap.Recents { + if recent == spoiledVal { + signedRecently = true + break + } } } if !signedRecently { @@ -1216,8 +1221,11 @@ func (p *Parlia) VerifyVote(chain consensus.ChainHeaderReader, vote *types.VoteE validators := snap.Validators voteAddress := vote.VoteAddress - for _, validator := range validators { + for addr, validator := range validators { if validator.VoteAddress == voteAddress { + if addr == p.val { + validVotesfromSelfCounter.Inc(1) + } return nil } } @@ -1294,14 +1302,9 @@ func (p *Parlia) Seal(chain consensus.ChainHeaderReader, block *types.Block, res } // If we're amongst the recent signers, wait for the next block - for seen, recent := range snap.Recents { - if recent == val { - // Signer is among recents, only wait if the current block doesn't shift it out - if limit := uint64(len(snap.Validators)/2 + 1); number < limit || seen > number-limit { - log.Info("Signed recently, must wait for others") - return nil - } - } + if snap.SignRecently(val) { + log.Info("Signed recently, must wait for others") + return nil } // Sweet, the protocol permits us to sign the block, wait for our time @@ -1408,19 +1411,7 @@ func (p *Parlia) SignRecently(chain consensus.ChainReader, parent *types.Block) return true, errUnauthorizedValidator } - // If we're amongst the recent signers, wait for the next block - number := parent.NumberU64() + 1 - for seen, recent := range snap.Recents { - if recent != p.val { - continue - } - - // Signer is among recents, only wait if the current block doesn't shift it out - if limit := uint64(len(snap.Validators)/2 + 1); number < limit || seen > number-limit { - return true, nil - } - } - return false, nil + return snap.SignRecently(p.val), nil } // CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty diff --git a/consensus/parlia/snapshot.go b/consensus/parlia/snapshot.go index e7a9dea460..74dd983be5 100644 --- a/consensus/parlia/snapshot.go +++ b/consensus/parlia/snapshot.go @@ -194,7 +194,7 @@ func (s *Snapshot) updateAttestation(header *types.Header, chainConfig *params.C if targetHash != header.ParentHash || targetNumber+1 != header.Number.Uint64() { log.Warn("updateAttestation failed", "error", fmt.Errorf("invalid attestation, target mismatch, expected block: %d, hash: %s; real block: %d, hash: %s", header.Number.Uint64()-1, header.ParentHash, targetNumber, targetHash)) - updateAttestationFailedGauge.Inc(1) + updateAttestationErrorCounter.Inc(1) return } @@ -207,6 +207,17 @@ func (s *Snapshot) updateAttestation(header *types.Header, chainConfig *params.C } } +func (s *Snapshot) SignRecently(validator common.Address) bool { + for seen, recent := range s.Recents { + if recent == validator { + if limit := uint64(len(s.Validators)/2 + 1); s.Number+1 < limit || seen > s.Number+1-limit { + return true + } + } + } + return false +} + func (s *Snapshot) apply(headers []*types.Header, chain consensus.ChainHeaderReader, parents []*types.Header, chainConfig *params.ChainConfig) (*Snapshot, error) { // Allow passing in no headers for cleaner code if len(headers) == 0 { diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go index e04f94e7d4..a0cc44b68f 100644 --- a/core/rawdb/schema.go +++ b/core/rawdb/schema.go @@ -200,7 +200,7 @@ func blockReceiptsKey(number uint64, hash common.Hash) []byte { // diffLayerKey = diffLayerKeyPrefix + hash func diffLayerKey(hash common.Hash) []byte { - return append(append(diffLayerPrefix, hash.Bytes()...)) + return append(diffLayerPrefix, hash.Bytes()...) } // txLookupKey = txLookupPrefix + hash diff --git a/core/systemcontracts/upgrade.go b/core/systemcontracts/upgrade.go index e323035b24..4b9a267fad 100644 --- a/core/systemcontracts/upgrade.go +++ b/core/systemcontracts/upgrade.go @@ -53,6 +53,8 @@ var ( planckUpgrade = make(map[string]*Upgrade) lubanUpgrade = make(map[string]*Upgrade) + + platoUpgrade = make(map[string]*Upgrade) ) func init() { @@ -645,6 +647,54 @@ func init() { }, }, } + + platoUpgrade[mainNet] = &Upgrade{ + UpgradeName: "plato", + Configs: []*UpgradeConfig{ + { + ContractAddr: common.HexToAddress(ValidatorContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/ff8df0741e8f7e9b2c85c2a3b7b2426ad2ba1fad", + Code: "60806040526004361061048d5760003560e01c806388b32f1111610255578063c81b166211610144578063e40716a1116100c1578063f92eb86b11610085578063f92eb86b14610bd7578063f9a2bbc714610bec578063fc3e590814610c01578063fccc281314610c16578063fd4ad81f14610c2b578063fd6a687914610c5a57610494565b8063e40716a114610b5a578063ea321e4914610b6f578063eb57e20214610b8f578063eda5868c14610baf578063f340fa0114610bc457610494565b8063d86222d511610108578063d86222d514610af1578063daacdb6614610b06578063dc927faf14610b1b578063e086c7b114610b30578063e1c7392a14610b4557610494565b8063c81b166214610a92578063c8509d81146108a0578063ce910b0c14610aa7578063d04aa99614610ac7578063d68fb56a14610adc57610494565b8063a78abc16116101d2578063aef198a911610196578063aef198a914610a31578063b7ab4db514610a46578063b8cf4ef114610a68578063bf9f499514610650578063c6d3394514610a7d57610494565b8063a78abc16146109b2578063aaf5eb68146109c7578063ab51bb96146109dc578063ac431751146109f1578063ad3c9da614610a1157610494565b80639dc09262116102195780639dc09262146109495780639fe0f8161461095e578063a0dc275814610973578063a1a11bf514610988578063a5422d5c1461099d57610494565b806388b32f11146108d55780638b5ad0c9146108ea5780638d19a410146108ff5780639369d7de1461091f57806396713da91461093457610494565b80635192c82c1161037c5780636e47b482116102f95780637942fd05116102bd5780637942fd05146108615780637a84ca2a1461087657806381650b621461088b578063831d65d1146108a0578063853230aa1461084c57806386249882146108c057610494565b80636e47b482146107f857806370fd5bad1461080d578063718a8aa81461082257806375d47a0a1461083757806378dfed4a1461084c57610494565b80635667515a116103405780635667515a146107675780635d77156c1461077c57806360eba4fe1461079157806362b72cf5146107b15780636969a25c146107c657610494565b80635192c82c146106e857806351e80672146106fd578063549b03f21461071257806355614fcc14610727578063565c56b31461074757610494565b80633365af3a1161040a57806343756e5c116103ce57806343756e5c1461067257806345cf9daf14610687578063493279b11461069c5780634bf6c882146106be5780634df6e0c3146106d357610494565b80633365af3a146105d857806335409f7f146105f85780633b071dcc146106185780633de0f0d81461063b5780633dffc3871461065057610494565b8063152ad3b811610451578063152ad3b81461054c5780631ff180691461056e578063219f22d514610583578063300c356714610598578063321d398a146105b857610494565b806304c4fec61461049957806307a56847146104b05780630bee7a67146104db5780630e2374a5146104fd5780631182b8751461051f57610494565b3661049457005b600080fd5b3480156104a557600080fd5b506104ae610c6f565b005b3480156104bc57600080fd5b506104c5610ce1565b6040516104d29190617594565b60405180910390f35b3480156104e757600080fd5b506104f0610ce7565b6040516104d291906175be565b34801561050957600080fd5b50610512610cec565b6040516104d2919061699b565b34801561052b57600080fd5b5061053f61053a366004616881565b610cf2565b6040516104d29190616b12565b34801561055857600080fd5b50610561610f2a565b6040516104d29190616b07565b34801561057a57600080fd5b506104c5610f33565b34801561058f57600080fd5b506104f0610f39565b3480156105a457600080fd5b506104ae6105b336600461670b565b610f3e565b3480156105c457600080fd5b506105616105d336600461682e565b6112c2565b3480156105e457600080fd5b506105616105f336600461682e565b611391565b34801561060457600080fd5b506104ae6106133660046166e4565b611442565b34801561062457600080fd5b5061062d61159b565b6040516104d2929190616a1d565b34801561064757600080fd5b506104c5611877565b34801561065c57600080fd5b5061066561187d565b6040516104d291906175cf565b34801561067e57600080fd5b50610512611882565b34801561069357600080fd5b506104c5611888565b3480156106a857600080fd5b506106b161188e565b6040516104d29190617585565b3480156106ca57600080fd5b50610665611893565b3480156106df57600080fd5b5061062d611898565b3480156106f457600080fd5b506104c5611a16565b34801561070957600080fd5b50610512611a1c565b34801561071e57600080fd5b506104c5611a22565b34801561073357600080fd5b506105616107423660046166e4565b611a28565b34801561075357600080fd5b506104c56107623660046166e4565b611a5d565b34801561077357600080fd5b50610665611aae565b34801561078857600080fd5b506104f0611ab3565b34801561079d57600080fd5b5061053f6107ac36600461682e565b611ab8565b3480156107bd57600080fd5b506104c5611b5e565b3480156107d257600080fd5b506107e66107e136600461682e565b611b64565b6040516104d2969594939291906169c8565b34801561080457600080fd5b50610512611bc8565b34801561081957600080fd5b50610665611bce565b34801561082e57600080fd5b50610665611bd3565b34801561084357600080fd5b50610512611bd8565b34801561085857600080fd5b506104c5611bde565b34801561086d57600080fd5b50610665611be4565b34801561088257600080fd5b506104c5611be9565b34801561089757600080fd5b506104f0611bef565b3480156108ac57600080fd5b506104ae6108bb366004616881565b611bf4565b3480156108cc57600080fd5b506104c5611c55565b3480156108e157600080fd5b506104c5611c5b565b3480156108f657600080fd5b506104c5611c61565b34801561090b57600080fd5b506104c561091a3660046166e4565b611c67565b34801561092b57600080fd5b506104ae611ca7565b34801561094057600080fd5b50610665611dbb565b34801561095557600080fd5b50610512611dc0565b34801561096a57600080fd5b506104c5611dc6565b34801561097f57600080fd5b506104c5611dcb565b34801561099457600080fd5b50610512611dd0565b3480156109a957600080fd5b5061053f611dd6565b3480156109be57600080fd5b50610561611df5565b3480156109d357600080fd5b506104c5611dfe565b3480156109e857600080fd5b506104f0611aae565b3480156109fd57600080fd5b506104ae610a0c3660046167d2565b611e07565b348015610a1d57600080fd5b506104c5610a2c3660046166e4565b6126b3565b348015610a3d57600080fd5b506104c56126c5565b348015610a5257600080fd5b50610a5b6126d2565b6040516104d29190616a0a565b348015610a7457600080fd5b506104c56127be565b348015610a8957600080fd5b506104c5611bce565b348015610a9e57600080fd5b506105126127c3565b348015610ab357600080fd5b5061053f610ac236600461682e565b6127c9565b348015610ad357600080fd5b506104c56127d6565b348015610ae857600080fd5b506104c56127db565b348015610afd57600080fd5b506104c561281a565b348015610b1257600080fd5b506104c5612826565b348015610b2757600080fd5b5061051261282c565b348015610b3c57600080fd5b506104c5612832565b348015610b5157600080fd5b506104ae612837565b348015610b6657600080fd5b506104c56129e6565b348015610b7b57600080fd5b50610561610b8a366004616793565b6129ec565b348015610b9b57600080fd5b506104ae610baa3660046166e4565b612b72565b348015610bbb57600080fd5b506104f0612c7a565b6104ae610bd23660046166e4565b612c7f565b348015610be357600080fd5b506104c5612f07565b348015610bf857600080fd5b50610512612f0d565b348015610c0d57600080fd5b50610665611dc6565b348015610c2257600080fd5b50610512612f13565b348015610c3757600080fd5b50610c4b610c4636600461682e565b612f19565b6040516104d29392919061759d565b348015610c6657600080fd5b50610512612fdb565b6000610c7a33611c67565b9050600b8181548110610c8957fe5b600091825260209091206001601690920201015460ff16610cc55760405162461bcd60e51b8152600401610cbc9061723d565b60405180910390fd5b6000610ccf6127db565b9050610cdc338383612fe1565b505050565b60095481565b606481565b61200181565b60005460609060ff16610d175760405162461bcd60e51b8152600401610cbc90616cd1565b3361200014610d385760405162461bcd60e51b8152600401610cbc9061741c565b600b54610df657610d476163d0565b60015460005b81811015610df257600b805460018101825560009190915283516000805160206176478339815191526016909202918201908155602080860151600080516020617c768339815191528401805460ff1916911515919091179055604086015180518794610dce936000805160206176678339815191529091019201906163ff565b506060820151610de49060038301906013616479565b505050806001019050610d4d565b5050505b610dfe6164a6565b6000610e3f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506131cd92505050565b9150915080610e5b57610e526064613389565b92505050610f23565b815160009060ff16610e8057610e79836020015184604001516133ea565b9050610eef565b825160ff1660011415610eeb57826020015151600114610ec557600080516020617627833981519152604051610eb590617124565b60405180910390a1506067610ee6565b610e798360200151600081518110610ed957fe5b602002602001015161403e565b610eef565b5060655b63ffffffff8116610f145750506040805160008152602081019091529150610f239050565b610f1d81613389565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b334114610f5d5760405162461bcd60e51b8152600401610cbc9061746b565b6010544311610f7e5760405162461bcd60e51b8152600401610cbc90616e2d565b60005460ff16610fa05760405162461bcd60e51b8152600401610cbc90616cd1565b600f54610fb8576032600f55611002316011556112b8565b60006110023168056bc75e2d63100000811115610fe757610fe081606463ffffffff6141b516565b9150611030565b60115481111561102957610fe0606461101d600f54611011601154866141f790919063ffffffff16565b9063ffffffff61423916565b9063ffffffff6141b516565b50506112b8565b6040516309a99b4f60e41b815261100290639a99b4f09061105790309086906004016169af565b602060405180830381600087803b15801561107157600080fd5b505af1158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190616846565b611002316011559150816110be5750506112b8565b6000805b848110156110ec578585828181106110d657fe5b90506020020135820191508060010190506110c2565b50806110fa575050506112b8565b6000806000805b898110156112b0578489898381811061111657fe5b9050602002013588028161112657fe5b0493508a8a8281811061113557fe5b905060200201602081019061114a91906166e4565b6001600160a01b0381166000908152600460205260409020549093509150811561126657600060018084038154811061117f57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156111ec57836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516111df9190617594565b60405180910390a2611260565b6003546111ff908663ffffffff61427316565b6003908155810154611217908663ffffffff61427316565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611257908890617594565b60405180910390a25b506112a8565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d858560405161129f9190617594565b60405180910390a25b600101611101565b505050505050505b5050436010555050565b60015460009082106112d65750600061138c565b60006001600160a01b0316600183815481106112ee57fe5b60009182526020909120600490910201546001600160a01b0316148061131e5750600854158061131e5750600a54155b8061132d575060085460095410155b8061133e575061133c82611391565b155b8061136757506000600b838154811061135357fe5b906000526020600020906016020160000154115b8061137b575060016113776126d2565b5111155b156113885750600061138c565b5060015b919050565b60015460009082106113a55750600061138c565b600b5482106113e257600182815481106113bb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615905061138c565b600182815481106113ef57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615801561143c5750600b828154811061142357fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146114635760405162461bcd60e51b8152600401610cbc9061753c565b600b54611521576114726163d0565b60015460005b8181101561151d57600b805460018101825560009190915283516000805160206176478339815191526016909202918201908155602080860151600080516020617c768339815191528401805460ff19169115159190911790556040860151805187946114f9936000805160206176678339815191529091019201906163ff565b50606082015161150f9060038301906013616479565b505050806001019050611478565b5050505b6001600160a01b038116600090815260046020526040902054806115455750611598565b6001810390506000600b828154811061155a57fe5b600091825260209091206001601690920201015460ff16905061157d8383614298565b80156115865750805b15610cdc576009805460001901905550505b50565b60015460609081906000805b828110156115ee57600181815481106115bc57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166115e6576001909101905b6001016115a7565b5060608160405190808252806020026020018201604052801561161b578160200160208202803683370190505b50905060608260405190808252806020026020018201604052801561165457816020015b606081526020019060019003908161163f5790505b50600b54600094509091508414156117cf5760005b848110156117c9576001818154811061167e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166117c157600181815481106116ae57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106116d957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061170657fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561179e5780601f106117735761010080835404028352916020019161179e565b820191906000526020600020905b81548152906001019060200180831161178157829003601f168201915b50505050508285815181106117af57fe5b60209081029190910101526001909301925b600101611669565b5061186b565b60005b8481101561186957600181815481106117e757fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611861576001818154811061181757fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061184257fe5b6001600160a01b03909216602092830291909101909101526001909301925b6001016117d2565b505b909450925050505b9091565b61271081565b600181565b61100181565b60085481565b603881565b600881565b600e54600c546060918291806118ac575060155b60606118b66126d2565b905060606118c38261464b565b9050828251116118da579094509250611873915050565b838383510310156118ec578282510393505b83156119225760c8430461190883838388880360008a8a6147b9565b6119208383838888038989038a8b8b8b5103016147b9565b505b60608360405190808252806020026020018201604052801561194e578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561198757816020015b60608152602001906001900390816119725790505b50905060005b85811015611a08578481815181106119a157fe5b60200260200101518382815181106119b557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106119e157fe5b60200260200101518282815181106119f557fe5b602090810291909101015260010161198d565b509096509450505050509091565b60065481565b61200081565b600f5481565b6001600160a01b03811660009081526004602052604081205480611a5057600091505061138c565b60001901610f2381611391565b6001600160a01b03811660009081526004602052604081205480611a8557600091505061138c565b600180820381548110611a9457fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611ac557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611b565780601f10611b2b57610100808354040283529160200191611b56565b820191906000526020600020905b815481529060010190602001808311611b3957829003601f168201915b505050505081565b60105481565b60018181548110611b7157fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b606681565b3361200014611c155760405162461bcd60e51b8152600401610cbc9061741c565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051611c48939291906175dd565b60405180910390a1505050565b60025481565b60115481565b600a5481565b6001600160a01b03811660009081526004602052604081205480611c9d5760405162461bcd60e51b8152600401610cbc906173a4565b6000190192915050565b600b54611d6557611cb66163d0565b60015460005b81811015611d6157600b805460018101825560009190915283516000805160206176478339815191526016909202918201908155602080860151600080516020617c768339815191528401805460ff1916911515919091179055604086015180518794611d3d936000805160206176678339815191529091019201906163ff565b506060820151611d539060038301906013616479565b505050806001019050611cbc565b5050505b600854611d725760036008555b600a54611d7f576002600a555b6000611d8a33611c67565b9050611d95816112c2565b611db15760405162461bcd60e51b8152600401610cbc906170e1565b6115983382614910565b600981565b61100781565b600381565b60c881565b61100681565b6040518061062001604052806105ef81526020016176876105ef913981565b60005460ff1681565b6402540be40081565b60005460ff16611e295760405162461bcd60e51b8152600401610cbc90616cd1565b3361100714611e4a5760405162461bcd60e51b8152600401610cbc906171aa565b611eb484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506149a89050565b15611f515760208114611ed95760405162461bcd60e51b8152600401610cbc9061735e565b604080516020601f8401819004810282018101909252828152600091611f1791858580838501838280828437600092019190915250614a0192505050565b905060648110158015611f2d5750620186a08111155b611f495760405162461bcd60e51b8152600401610cbc90616f8a565b600255612670565b611fb184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506149a89050565b1561204d5760208114611fd65760405162461bcd60e51b8152600401610cbc90616b57565b604080516020601f840181900481028201810190925282815260009161201491858580838501838280828437600092019190915250614a0192505050565b90506127108111156120385760405162461bcd60e51b8152600401610cbc90616e6f565b6006556007805460ff19166001179055612670565b6120b784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506149a89050565b1561215157602081146120dc5760405162461bcd60e51b8152600401610cbc90616b8e565b604080516020601f840181900481028201810190925282815260009161211a91858580838501838280828437600092019190915250614a0192505050565b600c5490915080612129575060155b8082106121485760405162461bcd60e51b8152600401610cbc90616ee2565b50600855612670565b6121ba84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506149a89050565b1561225357602081146121df5760405162461bcd60e51b8152600401610cbc90616c57565b604080516020601f840181900481028201810190925282815260009161221d91858580838501838280828437600092019190915250614a0192505050565b905060008111801561222f5750600a81105b61224b5760405162461bcd60e51b8152600401610cbc906174b8565b600a55612670565b6122c784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506149a89050565b1561235657602081146122ec5760405162461bcd60e51b8152600401610cbc90616c0b565b604080516020601f840181900481028201810190925282815260009161232a91858580838501838280828437600092019190915250614a0192505050565b9050600d5481111561234e5760405162461bcd60e51b8152600401610cbc90617000565b600e55612670565b6123bf84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506149a89050565b1561244157602081146123e45760405162461bcd60e51b8152600401610cbc906171f8565b604080516020601f840181900481028201810190925282815260009161242291858580838501838280828437600092019190915250614a0192505050565b600d819055600e5490915081101561243b57600d54600e555b50612670565b6124a584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506149a89050565b1561255357602081146124ca5760405162461bcd60e51b8152600401610cbc90616c9c565b604080516020601f840181900481028201810190925282815260009161250891858580838501838280828437600092019190915250614a0192505050565b90506000811161252a5760405162461bcd60e51b8152600401610cbc90616d3f565b602981111561254b5760405162461bcd60e51b8152600401610cbc90616d87565b600c55612670565b6125bd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527266696e616c697479526577617264526174696f60681b602082015291506149a89050565b1561265857602081146125e25760405162461bcd60e51b8152600401610cbc906172e1565b604080516020601f840181900481028201810190925282815260009161262091858580838501838280828437600092019190915250614a0192505050565b905060018110158015612634575060648111155b6126505760405162461bcd60e51b8152600401610cbc9061706f565b600f55612670565b60405162461bcd60e51b8152600401610cbc90617515565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516126a59493929190616b25565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b82811015612701576126ed81611391565b156126f9578160010191505b6001016126dc565b5060608160405190808252806020026020018201604052801561272e578160200160208202803683370190505b5090506000915060005b838110156127b55761274981611391565b156127ad576001818154811061275b57fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061278657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612738565b50925050505b90565b601581565b61100281565b60138181548110611ac557fe5b603281565b60006127e56126d2565b519050600080600c54116127fa5760156127fe565b600c545b90508082111561280c578091505b8161281657600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561285a5760405162461bcd60e51b8152600401610cbc906172aa565b6128626164a6565b60006128886040518061062001604052806105ef81526020016176876105ef91396131cd565b91509150806128a95760405162461bcd60e51b8152600401610cbc906173db565b60005b8260200151518110156129ce576001836020015182815181106128cb57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106129a157fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016128ac565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b81811015612af557612add85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612a4557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ad35780601f10612aa857610100808354040283529160200191612ad3565b820191906000526020600020905b815481529060010190602001808311612ab657829003601f168201915b5050505050614a06565b15612aed5760019250505061143c565b6001016129f4565b5060125460005b81811015612b6657612b4d86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612a4557fe5b15612b5e576001935050505061143c565b600101612afc565b50600095945050505050565b3361100114612b935760405162461bcd60e51b8152600401610cbc9061753c565b600b54612c5157612ba26163d0565b60015460005b81811015612c4d57600b805460018101825560009190915283516000805160206176478339815191526016909202918201908155602080860151600080516020617c768339815191528401805460ff1916911515919091179055604086015180518794612c29936000805160206176678339815191529091019201906163ff565b506060820151612c3f9060038301906013616479565b505050806001019050612ba8565b5050505b6000612c5c82614a6a565b9050612c67816112c2565b15612c7657612c768282614910565b5050565b606581565b334114612c9e5760405162461bcd60e51b8152600401610cbc9061746b565b60005460ff16612cc05760405162461bcd60e51b8152600401610cbc90616cd1565b60003411612ce05760405162461bcd60e51b8152600401610cbc90616fd1565b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615612d1057506006545b600083118015612d205750600081115b15612dc1576000612d3d61271061101d868563ffffffff61423916565b90508015612dbf5760405161dead9082156108fc029083906000818181858888f19350505050158015612d74573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee581604051612da49190617594565b60405180910390a1612dbc848263ffffffff6141f716565b93505b505b8115612ebf576000600180840381548110612dd857fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615612e4557846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051612e389190617594565b60405180910390a2612eb9565b600354612e58908563ffffffff61427316565b6003908155810154612e70908563ffffffff61427316565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590612eb0908790617594565b60405180910390a25b50612f01565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051612ef89190617594565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612f2657fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015612fd15780601f10612fa657610100808354040283529160200191612fd1565b820191906000526020600020905b815481529060010190602001808311612fb457829003601f168201915b5050505050905083565b61100481565b6000600a5460001480612ff2575081155b80612ffd5750600954155b1561300a57506000610f23565b60096000815460019003919050819055506000613055600a5461101d8561101d600b898154811061303757fe5b6000918252602090912060169091020154439063ffffffff6141f716565b90506000600b858154811061306657fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156130cb57600080fd5b505afa1580156130df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613103919061685e565b915091506000935080831061317d5761311c8787614298565b506040516305bfb49960e41b815261100190635bfb499090613142908a9060040161699b565b600060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050506001935061318f565b81831061318f5761318d87614a6a565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b6131d56164a6565b60006131df6164a6565b6131e76164ca565b6131f86131f386614c0d565b614c32565b90506000805b61320783614c7c565b1561337b578061322c5761322261321d84614c9d565b614ceb565b60ff168452613373565b806001141561336e57606061324861324385614c9d565b614d6b565b9050805160405190808252806020026020018201604052801561328557816020015b6132726164ea565b81526020019060019003908161326a5790505b50856020018190525080516040519080825280602002602001820160405280156132c357816020015b60608152602001906001900390816132ae5790505b50604086015260005b8151811015613363576132dd6164ea565b606060006132fd8585815181106132f057fe5b6020026020010151614e3c565b9250925092508061331d578860009a509a50505050505050505050613384565b828960200151858151811061332e57fe5b6020026020010181905250818960400151858151811061334a57fe5b60200260200101819052505050508060010190506132cc565b506001925050613373565b61337b565b6001016131fe565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816133a35790505090506133c98363ffffffff16614f56565b816000815181106133d657fe5b6020026020010181905250610f2381614f69565b60006029835111156134215760008051602061762783398151915260405161341190616de4565b60405180910390a150606661143c565b60005b83518110156134bf5760005b818110156134b65784818151811061344457fe5b6020026020010151600001516001600160a01b031685838151811061346557fe5b6020026020010151600001516001600160a01b031614156134ae5760008051602061762783398151915260405161349b90616f3f565b60405180910390a160669250505061143c565b600101613430565b50600101613424565b506060806134cd8585614ff3565b60015491935091506000908190815b818110156135525767016345785d8a0000600182815481106134fa57fe5b9060005260206000209060040201600301541061351c5783600101935061354a565b60006001828154811061352b57fe5b906000526020600020906004020160030154111561354a578260010192505b6001016134dc565b5060608360405190808252806020026020018201604052801561357f578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156135ae578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156135dd578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561360c578160200160208202803683370190505b509050600060608760405190808252806020026020018201604052801561363d578160200160208202803683370190505b50905060608860405190808252806020026020018201604052801561366c578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156136b457600080fd5b505afa1580156136c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ec9190616846565b905067016345785d8a00008111156137375760008051602061762783398151915260405161371990617269565b60405180910390a160689d505050505050505050505050505061143c565b60005b898110156139a85767016345785d8a00006001828154811061375857fe5b906000526020600020906004020160030154106138dd576001818154811061377c57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d815181106137ad57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106137e257fe5b906000526020600020906004020160030154816137fb57fe5b066001838154811061380957fe5b90600052602060002090600402016003015403905061383183826141f790919063ffffffff16565b898e8151811061383d57fe5b6020026020010181815250506001828154811061385657fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878e8151811061388757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e815181106138b457fe5b60209081029190910101526138cf868263ffffffff61427316565b95508c6001019c50506139a0565b6000600182815481106138ec57fe5b90600052602060002090600402016003015411156139a0576001818154811061391157fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c8151811061394257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061396f57fe5b906000526020600020906004020160030154838c8151811061398d57fe5b6020026020010181815250508a6001019a505b60010161373a565b5060008415613c1e576002546040516303702b2960e51b815261100491636e0565209188916139e2918e918e918d91420190600401616a8d565b6020604051808303818588803b1580156139fb57600080fd5b505af193505050508015613a2c575060408051601f3d908101601f19168201909252613a2991810190616773565b60015b613ba3576040516000815260443d1015613a4857506000613ae3565b60046000803e60005160e01c6308c379a08114613a69576000915050613ae3565b60043d036004833e81513d60248201116001600160401b0382111715613a9457600092505050613ae3565b80830180516001600160401b03811115613ab5576000945050505050613ae3565b8060208301013d8601811115613ad357600095505050505050613ae3565b601f01601f191660405250925050505b80613aee5750613b30565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051613b229190616b12565b60405180910390a250613b9e565b3d808015613b5a576040519150601f19603f3d011682016040523d82523d6000602084013e613b5f565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051613b949190616b12565b60405180910390a2505b613c1e565b8015613be5577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051613bd89190617594565b60405180910390a1613c1c565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051613c1390616bd4565b60405180910390a25b505b8015613dd45760005b8751811015613dd2576000888281518110613c3e57fe5b60200260200101519050600060018281548110613c5757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110613c8857fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015613d445760018281548110613cc957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110613d1857fe5b906000526020600020906004020160030154604051613d379190617594565b60405180910390a2613dc8565b60018281548110613d5157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110613da057fe5b906000526020600020906004020160030154604051613dbf9190617594565b60405180910390a25b5050600101613c27565b505b835115613f1e5760005b8451811015613f1c576000858281518110613df557fe5b60200260200101516001600160a01b03166108fc868481518110613e1557fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613eab57858281518110613e4b57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613e8957fe5b6020026020010151604051613e9e9190617594565b60405180910390a2613f13565b858281518110613eb757fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613ef557fe5b6020026020010151604051613f0a9190617594565b60405180910390a25b50600101613dde565b505b5050505050505050505050506000471115613f9a577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d47604051613f629190617594565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015613f98573d6000803e3d6000fd5b505b60006003819055600555815115613fb557613fb5828261522c565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613ff257600080fd5b505af1158015614006573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b80516001600160a01b031660009081526004602052604081205480158061408f575060018082038154811061406f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b156140d55782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a2600091505061138c565b60015460055460001982011180159061412b5784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000935050505061138c565b60058054600190810190915580548190600019860190811061414957fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000610f2383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506159e6565b6000610f2383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a1d565b6000826142485750600061143c565b8282028284828161425557fe5b0414610f235760405162461bcd60e51b8152600401610cbc90617169565b600082820183811015610f235760405162461bcd60e51b8152600401610cbc90616d08565b600080600183815481106142a857fe5b906000526020600020906004020160030154905060006001808054905003905060016142d26126d2565b5111614307576000600185815481106142e757fe5b90600052602060002090600402016003018190555060009250505061143c565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516143409190617594565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561452d576001816001018154811061438157fe5b90600052602060002090600402016001828154811061439c57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061445d57fe5b9060005260206000209060160201600b828154811061447857fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff19909216919091179055600280840180546144cf93838601939082161561010002600019019091160461651f565b506144e260038281019084016013616594565b509050508060010160046000600184815481106144fb57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101614363565b50600180548061453957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061458c57fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906145be60028301826165be565b6145cc600383016000616602565b5050905560008183816145db57fe5b049050801561463f5760015460005b8181101561463c57826001828154811061460057fe5b906000526020600020906004020160030154016001828154811061462057fe5b60009182526020909120600360049092020101556001016145ea565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561468a57816020015b60608152602001906001900390816146755790505b50600b5490915083146146a157925061138c915050565b60005b828110156147b057600b6001600460008985815181106146c057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106146f457fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561478c5780601f106147615761010080835404028352916020019161478c565b820191906000526020600020905b81548152906001019060200180831161476f57829003601f168201915b505050505082828151811061479d57fe5b60209081029190910101526001016146a4565b50949350505050565b60005b8281101561490657600082878388016040516020016147dc92919061698d565b6040516020818303038152906040528051906020012060001c816147fc57fe5b069050808501828701146148fd576000898388018151811061481a57fe5b602002602001015190506060898489018151811061483457fe5b602002602001015190508a8388018151811061484c57fe5b60200260200101518b858a018151811061486257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061489157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505089838801815181106148bf57fe5b60200260200101518a858a01815181106148d557fe5b6020026020010181905250808a848901815181106148ef57fe5b602002602001018190525050505b506001016147bc565b5050505050505050565b600980546001908101909155600b80548390811061492a57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061496057fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016149bb9190616971565b60405160208183030381529060405280519060200120836040516020016149e29190616971565b6040516020818303038152906040528051906020012014905092915050565b015190565b815181516000916001918114808314614a225760009250614a60565b600160208701838101602088015b600284838510011415614a5b578051835114614a4f5760009650600093505b60209283019201614a30565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614a935750600019905061138c565b600181039050600060018281548110614aa857fe5b9060005260206000209060040201600301549050600060018381548110614acb57fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614b24908590617594565b60405180910390a280614b3c5782935050505061138c565b6000818381614b4757fe5b0490508015614c035760005b84811015614ba5578160018281548110614b6957fe5b9060005260206000209060040201600301540160018281548110614b8957fe5b6000918252602090912060036004909202010155600101614b53565b50600180549085015b81811015614c00578260018281548110614bc457fe5b9060005260206000209060040201600301540160018281548110614be457fe5b6000918252602090912060036004909202010155600101614bae565b50505b5091949350505050565b614c15616611565b506040805180820190915281518152602082810190820152919050565b614c3a6164ca565b614c4382615a49565b614c4c57600080fd5b6000614c5b8360200151615a83565b60208085015160408051808201909152868152920190820152915050919050565b6000614c86616611565b505080518051602091820151919092015191011190565b614ca5616611565b614cae82614c7c565b614cb757600080fd5b60208201516000614cc782615ae6565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590614d0057508151602110155b614d0957600080fd5b6000614d188360200151615a83565b90508083600001511015614d3e5760405162461bcd60e51b8152600401610cbc90617327565b8251602080850151830180519284900392918310156147b057506020919091036101000a90049392505050565b6060614d7682615a49565b614d7f57600080fd5b6000614d8a83615bc7565b9050606081604051908082528060200260200182016040528015614dc857816020015b614db5616611565b815260200190600190039081614dad5790505b5090506000614dda8560200151615a83565b60208601510190506000805b84811015614e3157614df783615ae6565b9150604051806040016040528083815260200184815250848281518110614e1a57fe5b602090810291909101015291810191600101614de6565b509195945050505050565b614e446164ea565b60606000614e506164ea565b6060614e5a6164ca565b614e6387614c32565b90506000805b614e7283614c7c565b15614f475780614e9d57614e8d614e8884614c9d565b615c23565b6001600160a01b03168552614f3f565b8060011415614ec557614eb2614e8884614c9d565b6001600160a01b03166020860152614f3f565b8060021415614eed57614eda614e8884614c9d565b6001600160a01b03166040860152614f3f565b8060031415614f1957614f0261321d84614c9d565b6001600160401b0316606086015260019150614f3f565b8060041415614f3a57614f33614f2e84614c9d565b615c3d565b9350614f3f565b614f47565b600101614e69565b50929791965091945092505050565b606061143c614f6483615cad565b615d93565b6060815160001415614f8a575060408051600081526020810190915261138c565b606082600081518110614f9957fe5b602002602001015190506000600190505b8351811015614fda57614fd082858381518110614fc357fe5b6020026020010151615de5565b9150600101614faa565b50610f23614fed825160c060ff16615e62565b82615de5565b6060806000808080806150046127db565b6001549091505b801561511257600181039250600b838154811061502457fe5b600091825260209091206001601690920201015460ff1661504457615109565b6001838154811061505157fe5b60009182526020909120600490910201546001600160a01b03169450615078858484612fe1565b935083158061508b575060018a51038610155b1561509557615109565b60005b8a5181101561510757856001600160a01b03168b82815181106150b757fe5b6020026020010151600001516001600160a01b031614156150ff5760018b82815181106150e057fe5b6020908102919091010151901515608090910152600190960195615107565b600101615098565b505b6000190161500b565b508489510360405190808252806020026020018201604052801561515057816020015b61513d6164ea565b8152602001906001900390816151355790505b5096508489510360405190808252806020026020018201604052801561518a57816020015b60608152602001906001900390816151755790505b5095506000915060005b895181101561521e578981815181106151a957fe5b602002602001015160800151615216578981815181106151c557fe5b60200260200101518884815181106151d957fe5b60200260200101819052508881815181106151f057fe5b602002602001015187848151811061520457fe5b60200260200101819052508260010192505b600101615194565b5050505050505b9250929050565b600154825160005b828110156153495760016152466164ea565b6001838154811061525357fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b8481101561531d578781815181106152e357fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615315576000925061531d565b6001016152cf565b50811561533f5780516001600160a01b03166000908152600460205260408120555b5050600101615234565b508082111561540857805b8281101561540657600180548061536757fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806153ba57fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906153ec60028301826165be565b6153fa600383016000616602565b50509055600101615354565b505b60008183106154175781615419565b825b905060005b81811015615788576154cb86828151811061543557fe5b60200260200101516001838154811061544a57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152615f34565b61567f5780600101600460008884815181106154e357fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061551f57fe5b60200260200101516001828154811061553457fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106155ef57fe5b6020026020010151600b828154811061560457fe5b906000526020600020906016020160020190805190602001906156289291906163ff565b506000600b828154811061563857fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061566957fe5b6000918252602090912060169091020155615780565b61571085828151811061568e57fe5b6020026020010151600b83815481106156a357fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612ad35780601f10612aa857610100808354040283529160200191612ad3565b61575b5784818151811061572057fe5b6020026020010151600b828154811061573557fe5b906000526020600020906016020160020190805190602001906157599291906163ff565b505b60006001828154811061576a57fe5b9060005260206000209060040201600301819055505b60010161541e565b5082821115615960576157996163d0565b835b8381101561595d578581815181106157af57fe5b6020026020010151826040018190525060018782815181106157cd57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020617647833981519152810191825585830151600080516020617c768339815191528201805491151560ff199092169190911790559285015180518694929361590393600080516020617667833981519152019201906163ff565b5060608201516159199060038301906013616479565b505050806001016004600089848151811061593057fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161579b565b50505b615968615fb5565b615970616197565b6000600981905560015493505b838110156159de576000600b828154811061599457fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106159c557fe5b600091825260209091206016909102015560010161597d565b505050505050565b60008183615a075760405162461bcd60e51b8152600401610cbc9190616b12565b506000838581615a1357fe5b0495945050505050565b60008184841115615a415760405162461bcd60e51b8152600401610cbc9190616b12565b505050900390565b8051600090615a5a5750600061138c565b6020820151805160001a9060c0821015615a795760009250505061138c565b5060019392505050565b8051600090811a6080811015615a9d57600091505061138c565b60b8811080615ab8575060c08110801590615ab8575060f881105b15615ac757600191505061138c565b60c0811015615adb5760b51901905061138c565b60f51901905061138c565b80516000908190811a6080811015615b015760019150615bc0565b60b8811015615b1657607e1981019150615bc0565b60c0811015615b6757600060b78203600186019550806020036101000a865104915060018101820193505080831015615b615760405162461bcd60e51b8152600401610cbc906170b6565b50615bc0565b60f8811015615b7c5760be1981019150615bc0565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615bbe5760405162461bcd60e51b8152600401610cbc906170b6565b505b5092915050565b8051600090615bd85750600061138c565b60008090506000615bec8460200151615a83565b602085015185519181019250015b80821015615c1a57615c0b82615ae6565b82019150826001019250615bfa565b50909392505050565b8051600090601514615c3457600080fd5b61143c82614ceb565b8051606090615c4b57600080fd5b6000615c5a8360200151615a83565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615c91576020820181803683370190505b50905060008160200190506147b0848760200151018285616385565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615cf157506018615d15565b6fffffffffffffffffffffffffffffffff198416615d1157506010615d15565b5060005b6020811015615d4b57818181518110615d2a57fe5b01602001516001600160f81b03191615615d4357615d4b565b600101615d15565b60008160200390506060816040519080825280601f01601f191660200182016040528015615d80576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015615dc55750607f60f81b82600081518110615db357fe5b01602001516001600160f81b03191611155b15615dd157508061138c565b61143c615de38351608060ff16615e62565b835b6060806040519050835180825260208201818101602087015b81831015615e16578051835260209283019201615dfe565b50855184518101855292509050808201602086015b81831015615e43578051835260209283019201615e2b565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310615e8c5760405162461bcd60e51b8152600401610cbc90616eba565b60408051600180825281830190925260609160208201818036833701905050905060378411615ee65782840160f81b81600081518110615ec857fe5b60200101906001600160f81b031916908160001a905350905061143c565b6060615ef185615cad565b90508381510160370160f81b82600081518110615f0a57fe5b60200101906001600160f81b031916908160001a905350615f2b8282615de5565b95945050505050565b805182516000916001600160a01b039182169116148015615f6e575081602001516001600160a01b031683602001516001600160a01b0316145b8015615f93575081604001516001600160a01b031683604001516001600160a01b0316145b8015610f235750506060908101519101516001600160401b0390811691161490565b6012546013548082111561600057805b82811015615ffe576012805480615fd857fe5b600190038181906000526020600020016000615ff491906165be565b9055600101615fc5565b505b600081831061600f5781616011565b825b905060005b81811015616129576160ce6012828154811061602e57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156160bc5780601f10616091576101008083540402835291602001916160bc565b820191906000526020600020905b81548152906001019060200180831161609f57829003601f168201915b505050505060138381548110612a4557fe5b61612157601381815481106160df57fe5b90600052602060002001601282815481106160f657fe5b90600052602060002001908054600181600116156101000203166002900461611f92919061651f565b505b600101616016565b5082821115610cdc57825b82811015612f015760126013828154811061614b57fe5b600091825260208083208454600181810187559585529190932092909101805461618e94939092019290916002610100928216159290920260001901160461651f565b50600101616134565b601354600b54808211156161e257805b828110156161e05760138054806161ba57fe5b6001900381819060005260206000200160006161d691906165be565b90556001016161a7565b505b60008183106161f157816161f3565b825b905060005b81811015616312576162b06013828154811061621057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561629e5780601f106162735761010080835404028352916020019161629e565b820191906000526020600020905b81548152906001019060200180831161628157829003601f168201915b5050505050600b83815481106156a357fe5b61630a57600b81815481106162c157fe5b9060005260206000209060160201600201601382815481106162df57fe5b90600052602060002001908054600181600116156101000203166002900461630892919061651f565b505b6001016161f8565b5082821115610cdc57825b82811015612f01576013600b828154811061633457fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461637c9593909401939092600019908216156101000201160461651f565b5060010161631d565b8061638f57610cdc565b5b602081106163af578251825260209283019290910190601f1901616390565b915181516020939093036101000a6000190180199091169216919091179052565b604051806080016040528060008152602001600015158152602001606081526020016163fa61662b565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061644057805160ff191683800117855561646d565b8280016001018555821561646d579182015b8281111561646d578251825591602001919060010190616452565b5061281692915061664a565b826013810192821561646d579160200282018281111561646d578251825591602001919060010190616452565b6040518060600160405280600060ff16815260200160608152602001606081525090565b60405180604001604052806164dd616611565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10616558578054855561646d565b8280016001018555821561646d57600052602060002091601f016020900482015b8281111561646d578254825591600101919060010190616579565b826013810192821561646d579182018281111561646d578254825591600101919060010190616579565b50805460018160011615610100020316600290046000825580601f106165e45750611598565b601f016020900490600052602060002090810190611598919061664a565b5061159890601381019061664a565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b6127bb91905b808211156128165760008155600101616650565b60008083601f840112616675578182fd5b5081356001600160401b0381111561668b578182fd5b602083019150836020808302850101111561522557600080fd5b60008083601f8401126166b6578182fd5b5081356001600160401b038111156166cc578182fd5b60208301915083602082850101111561522557600080fd5b6000602082840312156166f5578081fd5b81356001600160a01b0381168114610f23578182fd5b60008060008060408587031215616720578283fd5b84356001600160401b0380821115616736578485fd5b61674288838901616664565b9096509450602087013591508082111561675a578384fd5b5061676787828801616664565b95989497509550505050565b600060208284031215616784578081fd5b81518015158114610f23578182fd5b600080602083850312156167a5578182fd5b82356001600160401b038111156167ba578283fd5b6167c6858286016166a5565b90969095509350505050565b600080600080604085870312156167e7578384fd5b84356001600160401b03808211156167fd578586fd5b616809888389016166a5565b90965094506020870135915080821115616821578384fd5b50616767878288016166a5565b60006020828403121561683f578081fd5b5035919050565b600060208284031215616857578081fd5b5051919050565b60008060408385031215616870578182fd5b505080516020909101519092909150565b600080600060408486031215616895578283fd5b833560ff811681146168a5578384fd5b925060208401356001600160401b038111156168bf578283fd5b6168cb868287016166a5565b9497909650939450505050565b6000815180845260208085019450808401835b838110156169105781516001600160a01b0316875295820195908201906001016168eb565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000815180845261695d8160208601602086016175fa565b601f01601f19169290920160200192915050565b600082516169838184602087016175fa565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b600060208252610f2360208301846168d8565b600060408252616a3060408301856168d8565b602083820381850152818551808452828401915082838202850101838801865b83811015616a7e57601f19878403018552616a6c838351616945565b94860194925090850190600101616a50565b50909998505050505050505050565b600060808252616aa060808301876168d8565b828103602084810191909152865180835287820192820190845b81811015616ad657845183529383019391830191600101616aba565b50508481036040860152616aea81886168d8565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b600060208252610f236020830184616945565b600060408252616b3960408301868861691b565b8281036020840152616b4c81858761691b565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252602b908201527f746865206275726e526174696f206d757374206265206e6f206772656174657260408201526a0207468616e2031303030360ac1b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b60208082526027908201527f7468652066696e616c697479526577617264526174696f206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662066696e616c697479526577617264526174696f206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152615f2b6060830184616945565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152615f2b60408301848661691b565b60005b838110156176155781810151838201526020016175fd565b83811115612f01575050600091015256fe70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbbf905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a20000175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa2646970667358221220f34958dbcda05e6d94770a38da790183bc12f970a53f415eb7a8e4ba99cbf89e64736f6c63430006040033", + }, + { + ContractAddr: common.HexToAddress(SlashContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/ff8df0741e8f7e9b2c85c2a3b7b2426ad2ba1fad", + Code: "608060405234801561001057600080fd5b506004361061027f5760003560e01c80637942fd051161015c578063c80d4b8f116100ce578063dc927faf11610087578063dc927faf146104ad578063e1c7392a146104b5578063f9a2bbc7146104bd578063fc3e5908146104c5578063fc4333cd146104cd578063fd6a6879146104d55761027f565b8063c80d4b8f1461045c578063c81b166214610464578063c8509d811461046c578063c96be4cb1461047f578063cc844b7314610492578063d2a42e4b146104a55761027f565b80639dc09262116101205780639dc0926214610421578063a1a11bf514610429578063a78abc1614610431578063ab51bb9614610439578063ac0af62914610441578063ac431751146104495761027f565b80637942fd05146103ee5780638256ace6146103f6578063831d65d1146103fe57806396713da9146104115780639bc8e4f2146104195761027f565b8063493279b1116101f557806362b72cf5116101b957806362b72cf5146103be5780636e47b482146103c657806370fd5bad146103ce578063718a8aa8146103d657806375d47a0a146103de5780637912a65d146103e65761027f565b8063493279b11461037c5780634bf6c8821461039157806351e8067214610399578063567a372d146103a15780635bfb4990146103a95761027f565b806335aa2e441161024757806335aa2e441461030e57806337c8dab914610321578063389f4f71146103425780633a63f4b1146103575780633dffc3871461035f57806343756e5c146103745761027f565b80630bee7a67146102845780630e2374a5146102a25780631182b875146102b757806322d1e80b146102d757806323bac5a2146102ec575b600080fd5b61028c6104dd565b6040516102999190613368565b60405180910390f35b6102aa6104e2565b6040516102999190612c17565b6102ca6102c5366004612b4d565b6104e8565b6040516102999190612c4f565b6102df61054e565b6040516102999190612c44565b6102ff6102fa3660046128fb565b610557565b60405161029993929190613350565b6102aa61031c366004612b1d565b61057a565b61033461032f3660046128fb565b6105a1565b604051610299929190613342565b61034a6105f8565b6040516102999190613318565b61034a6105fe565b610367610604565b6040516102999190613379565b6102aa610609565b61038461060f565b6040516102999190613309565b610367610614565b6102aa610619565b61034a61061f565b6103bc6103b73660046128fb565b610625565b005b61034a6106d0565b6102aa6106d6565b6103676106dc565b6103676106e1565b6102aa6106e6565b61034a6106ec565b6103676106f1565b6103346106f6565b6103bc61040c366004612b4d565b610700565b610367610812565b61034a610817565b6102aa610822565b6102aa610828565b6102df61082e565b61028c610837565b61034a61083c565b6103bc610457366004612a01565b610841565b61034a610ce0565b6102aa610ce5565b6103bc61047a366004612b4d565b610ceb565b6103bc61048d3660046128fb565b610d5c565b6103bc6104a0366004612a6a565b61114d565b61034a61172f565b6102aa611734565b6103bc61173a565b6102aa611776565b61036761177c565b6103bc611781565b6102aa611bca565b606481565b61200181565b606033612000146105145760405162461bcd60e51b815260040161050b9061318f565b60405180910390fd5b60005460ff166105365760405162461bcd60e51b815260040161050b90612d30565b60405162461bcd60e51b815260040161050b90613252565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061058757fe5b6000918252602090912001546001600160a01b0316905081565b6000806105ac6126e2565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b60065481565b600181565b61100181565b603881565b600881565b61200081565b60045481565b33611000146106465760405162461bcd60e51b815260040161050b90612f74565b60005460ff166106685760405162461bcd60e51b815260040161050b90612d30565b61200063f7a251d7600b61067b84611bd0565b60006040518463ffffffff1660e01b815260040161069b93929190613387565b600060405180830381600087803b1580156106b557600080fd5b505af11580156106c9573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b6004546005549091565b33612000146107215760405162461bcd60e51b815260040161050b9061318f565b60005460ff166107435760405162461bcd60e51b815260040161050b90612d30565b61074b612705565b600061078c84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ca292505050565b9150915080156107d35781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e629967916107c691613368565b60405180910390a16106c9565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79161080391613368565b60405180910390a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff166108635760405162461bcd60e51b815260040161050b90612d30565b33611007146108845760405162461bcd60e51b815260040161050b9061304c565b6108ef84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611d229050565b1561098a57602081146109145760405162461bcd60e51b815260040161050b90612f00565b604080516020601f840181900481028201810190925282815260009161095291858580838501838280828437600092019190915250611d7c92505050565b905060018110158015610966575060055481105b6109825760405162461bcd60e51b815260040161050b9061314a565b600455610c9d565b6109f084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611d229050565b15610a8c5760208114610a155760405162461bcd60e51b815260040161050b9061309a565b604080516020601f8401819004810282018101909252828152600091610a5391858580838501838280828437600092019190915250611d7c92505050565b90506103e88111158015610a68575060045481115b610a845760405162461bcd60e51b815260040161050b90612d9e565b600555610c9d565b610b0084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f66696e616c697479536c617368526577617264526174696f000000000000000060208201529150611d229050565b15610b9a5760208114610b255760405162461bcd60e51b815260040161050b90613289565b604080516020601f8401819004810282018101909252828152600091610b6391858580838501838280828437600092019190915250611d7c92505050565b9050600a8110158015610b765750606481105b610b925760405162461bcd60e51b815260040161050b90612eb4565b600655610c9d565b610c0e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c617368000000000000000060208201529150611d229050565b15610c855760208114610c335760405162461bcd60e51b815260040161050b90612dd3565b604080516020601f8401819004810282018101909252828152610c6f9190848480838501838280828437600092019190915250611d8192505050565b6007805460ff1916911515919091179055610c9d565b60405162461bcd60e51b815260040161050b9061322b565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051610cd29493929190612c62565b60405180910390a150505050565b609681565b61100281565b3361200014610d0c5760405162461bcd60e51b815260040161050b9061318f565b60005460ff16610d2e5760405162461bcd60e51b815260040161050b90612d30565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610d7b5760405162461bcd60e51b815260040161050b906131de565b60005460ff16610d9d5760405162461bcd60e51b815260040161050b90612d30565b6003544311610dbe5760405162461bcd60e51b815260040161050b906132d4565b3a15610ddc5760405162461bcd60e51b815260040161050b90612fef565b60405163155853f360e21b8152611000906355614fcc90610e01908490600401612c17565b60206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5191906129e1565b610e5a57611146565b610e626126e2565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610ebd576020810180516001019052610f16565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b438152600554602082015181610f2857fe5b0661107457600060208201526040516335409f7f60e01b8152611000906335409f7f90610f59908590600401612c17565b600060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610fa785611bd0565b60006040518463ffffffff1660e01b8152600401610fc793929190613387565b600060405180830381600087803b158015610fe157600080fd5b505af1925050508015610ff2575060015b61106f573d808015611020576040519150601f19603f3d011682016040523d82523d6000602084013e611025565b606091505b50826001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c836020015183604051611065929190613321565b60405180910390a2505b6110e0565b60045481602001518161108357fe5b066110e0576040516375abf10160e11b81526110009063eb57e202906110ad908590600401612c17565b600060405180830381600087803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff1661116f5760405162461bcd60e51b815260040161050b90612d30565b604051630a83aaa960e31b81526110069063541d554890611194903390600401612c17565b60206040518083038186803b1580156111ac57600080fd5b505afa1580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906129e1565b6112005760405162461bcd60e51b815260040161050b90612c94565b60075460ff166112225760405162461bcd60e51b815260040161050b90612cfb565b60065461122f5760146006555b8051514361010090910111801561125157504381602001516000015161010001115b61126d5760405162461bcd60e51b815260040161050b90612ccb565b80602001516020015181600001516020015114801561129b5750806020015160600151816000015160600151145b156112b85760405162461bcd60e51b815260040161050b90612f47565b8051604081015190511080156112d75750602081015160408101519051105b6112f35760405162461bcd60e51b815260040161050b90612e7d565b6020810151518151511080156113185750806000015160400151816020015160400151105b8061134357508051516020820151511080156113435750806020015160400151816000015160400151105b8061135d5750806020015160400151816000015160400151145b6113795760405162461bcd60e51b815260040161050b90612d67565b604080820151905163ea321e4960e01b81526110009163ea321e49916113a29190600401612c4f565b60206040518083038186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f291906129e1565b61140e5760405162461bcd60e51b815260040161050b9061301d565b61142081600001518260400151611da9565b8015611439575061143981602001518260400151611da9565b6114555760405162461bcd60e51b815260040161050b90612e1e565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561149357600080fd5b505afa1580156114a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114cf919081019061291e565b9150915060005b815181101561160c576115008282815181106114ee57fe5b60200260200101518560400151611f81565b15611604576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906115389033908590600401612c2b565b602060405180830381600087803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190612b35565b506110006001600160a01b03166335409f7f8584815181106115a857fe5b60200260200101516040518263ffffffff1660e01b81526004016115cc9190612c17565b600060405180830381600087803b1580156115e657600080fd5b505af11580156115fa573d6000803e3d6000fd5b505050505061160c565b6001016114d6565b50600061161e84604001516000611fe5565b90506120006001600160a01b031663f7a251d7600b6116408760400151612001565b60006040518463ffffffff1660e01b815260040161166093929190613387565b600060405180830381600087803b15801561167a57600080fd5b505af192505050801561168b575060015b6116fd573d8080156116b9576040519150601f19603f3d011682016040523d82523d6000602084013e6116be565b606091505b50817fd58d1183100bd0932c0588f31c4205d6bc6168909765a96c41adbed3115f3628826040516116ef9190612c4f565b60405180910390a250611729565b60405181907f7b78aadacff901d8b63d0dba4f86283d4db8aef27f9ed70413dd860f1c9532b690600090a25b50505050565b601481565b61100381565b60005460ff161561175d5760405162461bcd60e51b815260040161050b906130dc565b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146117a25760405162461bcd60e51b815260040161050b90612f74565b60005460ff166117c45760405162461bcd60e51b815260040161050b90612d30565b6001546117d057611bc8565b600154600090600019015b808211611b9c576000805b828410156118ff576117f66126e2565b600260006001878154811061180757fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156118e95760046005548161187457fe5b0481602001510381602001818152505080600260006001888154811061189657fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff19169115159190911790556118f3565b60019250506118ff565b508360010193506117e6565b828411611a965761190e6126e2565b600260006001868154811061191f57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611a075760046005548161198c57fe5b048160200151038160200181815250508060026000600187815481106119ae57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611a969050565b6002600060018681548110611a1857fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611a5c57fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611a895750611a96565b50600019909201916118ff565b818015611aa05750805b15611b7f576002600060018681548110611ab657fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611afd57fe5b600091825260209091200154600180546001600160a01b039092169186908110611b2357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611b5c57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611b8b575050611b9c565b5050600190910190600019016117db565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611beb579050509050611c14836001600160a01b031661203c565b81600081518110611c2157fe5b6020026020010181905250611c354361205f565b81600181518110611c4257fe5b6020908102919091010152611c57603861205f565b81600281518110611c6457fe5b6020026020010181905250611c784261205f565b81600381518110611c8557fe5b6020026020010181905250611c9981612072565b9150505b919050565b611caa612705565b6000611cb4612705565b611cbc612717565b611ccd611cc8866120fc565b612121565b90506000805b611cdc8361216b565b15611d155780611d0857611cf7611cf28461218c565b6121da565b63ffffffff16845260019150611d0d565b611d15565b600101611cd3565b5091935090915050915091565b600081604051602001611d359190612bfb565b6040516020818303038152906040528051906020012083604051602001611d5c9190612bfb565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615611d9b576001915081611da1565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b6060815260200190600190039081611dc5575050604080516020808252818301909252919250606091908082018180368337019050509050611e0a856000015161205f565b82600081518110611e1757fe5b6020026020010181905250611e32602086602001518361225c565b611e3b8161226c565b82600181518110611e4857fe5b6020026020010181905250611e60856040015161205f565b82600281518110611e6d57fe5b6020026020010181905250611e88602086606001518361225c565b611e918161226c565b82600381518110611e9e57fe5b6020026020010181905250611ec46020611eb784612072565b805190602001208361225c565b6040805160b080825260e08201909252606091602082018180368337019050509050611ef48183600060206122c2565b611f06818760800151602060606122c2565b611f148186608060306122c2565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa611f5157600080fd5b506001611f5f826000612315565b60ff1614611f74576000945050505050611d76565b5060019695505050505050565b815181516000916001918114808314611f9d5760009250611fdb565b600160208701838101602088015b600284838510011415611fd6578051835114611fca5760009650600093505b60209283019201611fab565b505050505b5090949350505050565b60008160200183511015611ff857600080fd5b50016020015190565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161201c579050509050611c148361226c565b60408051600560a21b8318601482015260348101909152606090611c998161226c565b6060611d7661206d83612331565b61226c565b60608151600014156120935750604080516000815260208101909152611c9d565b6060826000815181106120a257fe5b602002602001015190506000600190505b83518110156120e3576120d9828583815181106120cc57fe5b6020026020010151612417565b91506001016120b3565b50611c996120f6825160c060ff16612494565b82612417565b612104612737565b506040805180820190915281518152602082810190820152919050565b612129612717565b61213282612566565b61213b57600080fd5b600061214a83602001516125a0565b60208085015160408051808201909152868152920190820152915050919050565b6000612175612737565b505080518051602091820151919092015191011190565b612194612737565b61219d8261216b565b6121a657600080fd5b602082015160006121b682612603565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906121ef57508151602110155b6121f857600080fd5b600061220783602001516125a0565b9050808360000151101561222d5760405162461bcd60e51b815260040161050b90613113565b82516020808501518301805192849003929183101561225357826020036101000a820491505b50949350505050565b9091018181526020918201910152565b60608151600114801561229e5750607f60f81b8260008151811061228c57fe5b01602001516001600160f81b03191611155b156122aa575080611c9d565b611d766122bc8351608060ff16612494565b83612417565b60005b818110156106c9578381815181106122d957fe5b602001015160f81c60f81b8584806001019550815181106122f657fe5b60200101906001600160f81b031916908160001a9053506001016122c5565b6000816001018351101561232857600080fd5b50016001015190565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661237557506018612399565b6fffffffffffffffffffffffffffffffff19841661239557506010612399565b5060005b60208110156123cf578181815181106123ae57fe5b01602001516001600160f81b031916156123c7576123cf565b600101612399565b60008160200390506060816040519080825280601f01601f191660200182016040528015612404576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612448578051835260209283019201612430565b50855184518101855292509050808201602086015b8183101561247557805183526020928301920161245d565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106124be5760405162461bcd60e51b815260040161050b90612e55565b604080516001808252818301909252606091602082018180368337019050509050603784116125185782840160f81b816000815181106124fa57fe5b60200101906001600160f81b031916908160001a9053509050611d76565b606061252385612331565b90508381510160370160f81b8260008151811061253c57fe5b60200101906001600160f81b031916908160001a90535061255d8282612417565b95945050505050565b805160009061257757506000611c9d565b6020820151805160001a9060c082101561259657600092505050611c9d565b5060019392505050565b8051600090811a60808110156125ba576000915050611c9d565b60b88110806125d5575060c081108015906125d5575060f881105b156125e4576001915050611c9d565b60c08110156125f85760b519019050611c9d565b60f519019050611c9d565b80516000908190811a608081101561261e57600191506126db565b60b881101561263357607e19810191506126db565b60c081101561268457600060b78203600186019550806020036101000a86510491506001810182019350508083101561267e5760405162461bcd60e51b815260040161050b90612fc4565b506126db565b60f88110156126995760be19810191506126db565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611da15760405162461bcd60e51b815260040161050b90612fc4565b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061272a612737565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f830112612761578081fd5b815161277461276f826133da565b6133b3565b818152915060208083019084810160005b848110156127ea578151870188603f8201126127a057600080fd5b838101516127b061276f826133fa565b81815260408b818486010111156127c657600080fd5b6127d58388840183870161341e565b50865250509282019290820190600101612785565b505050505092915050565b60008083601f840112612806578182fd5b50813567ffffffffffffffff81111561281d578182fd5b60208301915083602082850101111561283557600080fd5b9250929050565b600082601f83011261284c578081fd5b813561285a61276f826133fa565b915080825283602082850101111561287157600080fd5b8060208401602084013760009082016020015292915050565b600060a0828403121561289b578081fd5b6128a560a06133b3565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156128e357600080fd5b6128ef8482850161283c565b60808301525092915050565b60006020828403121561290c578081fd5b81356129178161344a565b9392505050565b60008060408385031215612930578081fd5b825167ffffffffffffffff80821115612947578283fd5b81850186601f820112612958578384fd5b8051925061296861276f846133da565b80848252602080830192508084018a828389028701011115612988578788fd5b8794505b868510156129b357805161299f8161344a565b84526001949094019392810192810161298c565b5088015190965093505050808211156129ca578283fd5b506129d785828601612751565b9150509250929050565b6000602082840312156129f2578081fd5b81518015158114612917578182fd5b60008060008060408587031215612a16578182fd5b843567ffffffffffffffff80821115612a2d578384fd5b612a39888389016127f5565b90965094506020870135915080821115612a51578384fd5b50612a5e878288016127f5565b95989497509550505050565b600060208284031215612a7b578081fd5b813567ffffffffffffffff80821115612a92578283fd5b81840160608187031215612aa4578384fd5b612aae60606133b3565b9250803582811115612abe578485fd5b612aca8782840161288a565b845250602081013582811115612ade578485fd5b612aea8782840161288a565b602085015250604081013582811115612b01578485fd5b612b0d8782840161283c565b6040850152509195945050505050565b600060208284031215612b2e578081fd5b5035919050565b600060208284031215612b46578081fd5b5051919050565b600080600060408486031215612b61578283fd5b833560ff81168114612b71578384fd5b9250602084013567ffffffffffffffff811115612b8c578283fd5b612b98868287016127f5565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612be781602086016020860161341e565b601f01601f19169290920160200192915050565b60008251612c0d81846020870161341e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526129176020830184612bcf565b600060408252612c76604083018688612ba5565b8281036020840152612c89818587612ba5565b979650505050505050565b6020808252601f908201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604082015260600190565b6020808252601690820152751d1bdbc81bdb1908189b1bd8dac81a5b9d9bdb1d995960521b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b6020808252602c908201527f7468652066696e616c69747920736c6173682072657761726420726174696f2060408201526b6f7574206f662072616e676560a01b606082015260800190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252602b908201527f6c656e677468206f662066696e616c697479536c61736852657761726452617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b60008382526040602083015261333a6040830184612bcf565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff85168252606060208301526133a36060830185612bcf565b9050826040830152949350505050565b60405181810167ffffffffffffffff811182821017156133d257600080fd5b604052919050565b600067ffffffffffffffff8211156133f0578081fd5b5060209081020190565b600067ffffffffffffffff821115613410578081fd5b50601f01601f191660200190565b60005b83811015613439578181015183820152602001613421565b838111156117295750506000910152565b6001600160a01b038116811461345f57600080fd5b5056fea26469706673582212203ff44ea8476527808295b83e64ac3046b95b3fcdc4679c323a3dcf9b0c6e5aac64736f6c63430006040033", + }, + }, + } + + platoUpgrade[chapelNet] = &Upgrade{ + UpgradeName: "plato", + Configs: []*UpgradeConfig{ + { + ContractAddr: common.HexToAddress(ValidatorContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/ff8df0741e8f7e9b2c85c2a3b7b2426ad2ba1fad", + Code: "60806040526004361061048d5760003560e01c806388b32f1111610255578063c81b166211610144578063e40716a1116100c1578063f92eb86b11610085578063f92eb86b14610bd7578063f9a2bbc714610bec578063fc3e590814610c01578063fccc281314610c16578063fd4ad81f14610c2b578063fd6a687914610c5a57610494565b8063e40716a114610b5a578063ea321e4914610b6f578063eb57e20214610b8f578063eda5868c14610baf578063f340fa0114610bc457610494565b8063d86222d511610108578063d86222d514610af1578063daacdb6614610b06578063dc927faf14610b1b578063e086c7b114610b30578063e1c7392a14610b4557610494565b8063c81b166214610a92578063c8509d81146108a0578063ce910b0c14610aa7578063d04aa99614610ac7578063d68fb56a14610adc57610494565b8063a78abc16116101d2578063aef198a911610196578063aef198a914610a31578063b7ab4db514610a46578063b8cf4ef114610a68578063bf9f499514610650578063c6d3394514610a7d57610494565b8063a78abc16146109b2578063aaf5eb68146109c7578063ab51bb96146109dc578063ac431751146109f1578063ad3c9da614610a1157610494565b80639dc09262116102195780639dc09262146109495780639fe0f8161461095e578063a0dc275814610973578063a1a11bf514610988578063a5422d5c1461099d57610494565b806388b32f11146108d55780638b5ad0c9146108ea5780638d19a410146108ff5780639369d7de1461091f57806396713da91461093457610494565b80635192c82c1161037c5780636e47b482116102f95780637942fd05116102bd5780637942fd05146108615780637a84ca2a1461087657806381650b621461088b578063831d65d1146108a0578063853230aa1461084c57806386249882146108c057610494565b80636e47b482146107f857806370fd5bad1461080d578063718a8aa81461082257806375d47a0a1461083757806378dfed4a1461084c57610494565b80635667515a116103405780635667515a146107675780635d77156c1461077c57806360eba4fe1461079157806362b72cf5146107b15780636969a25c146107c657610494565b80635192c82c146106e857806351e80672146106fd578063549b03f21461071257806355614fcc14610727578063565c56b31461074757610494565b80633365af3a1161040a57806343756e5c116103ce57806343756e5c1461067257806345cf9daf14610687578063493279b11461069c5780634bf6c882146106be5780634df6e0c3146106d357610494565b80633365af3a146105d857806335409f7f146105f85780633b071dcc146106185780633de0f0d81461063b5780633dffc3871461065057610494565b8063152ad3b811610451578063152ad3b81461054c5780631ff180691461056e578063219f22d514610583578063300c356714610598578063321d398a146105b857610494565b806304c4fec61461049957806307a56847146104b05780630bee7a67146104db5780630e2374a5146104fd5780631182b8751461051f57610494565b3661049457005b600080fd5b3480156104a557600080fd5b506104ae610c6f565b005b3480156104bc57600080fd5b506104c5610ce1565b6040516104d29190617594565b60405180910390f35b3480156104e757600080fd5b506104f0610ce7565b6040516104d291906175be565b34801561050957600080fd5b50610512610cec565b6040516104d2919061699b565b34801561052b57600080fd5b5061053f61053a366004616881565b610cf2565b6040516104d29190616b12565b34801561055857600080fd5b50610561610f2a565b6040516104d29190616b07565b34801561057a57600080fd5b506104c5610f33565b34801561058f57600080fd5b506104f0610f39565b3480156105a457600080fd5b506104ae6105b336600461670b565b610f3e565b3480156105c457600080fd5b506105616105d336600461682e565b6112c2565b3480156105e457600080fd5b506105616105f336600461682e565b611391565b34801561060457600080fd5b506104ae6106133660046166e4565b611442565b34801561062457600080fd5b5061062d61159b565b6040516104d2929190616a1d565b34801561064757600080fd5b506104c5611877565b34801561065c57600080fd5b5061066561187d565b6040516104d291906175cf565b34801561067e57600080fd5b50610512611882565b34801561069357600080fd5b506104c5611888565b3480156106a857600080fd5b506106b161188e565b6040516104d29190617585565b3480156106ca57600080fd5b50610665611893565b3480156106df57600080fd5b5061062d611898565b3480156106f457600080fd5b506104c5611a16565b34801561070957600080fd5b50610512611a1c565b34801561071e57600080fd5b506104c5611a22565b34801561073357600080fd5b506105616107423660046166e4565b611a28565b34801561075357600080fd5b506104c56107623660046166e4565b611a5d565b34801561077357600080fd5b50610665611aae565b34801561078857600080fd5b506104f0611ab3565b34801561079d57600080fd5b5061053f6107ac36600461682e565b611ab8565b3480156107bd57600080fd5b506104c5611b5e565b3480156107d257600080fd5b506107e66107e136600461682e565b611b64565b6040516104d2969594939291906169c8565b34801561080457600080fd5b50610512611bc8565b34801561081957600080fd5b50610665611bce565b34801561082e57600080fd5b50610665611bd3565b34801561084357600080fd5b50610512611bd8565b34801561085857600080fd5b506104c5611bde565b34801561086d57600080fd5b50610665611be4565b34801561088257600080fd5b506104c5611be9565b34801561089757600080fd5b506104f0611bef565b3480156108ac57600080fd5b506104ae6108bb366004616881565b611bf4565b3480156108cc57600080fd5b506104c5611c55565b3480156108e157600080fd5b506104c5611c5b565b3480156108f657600080fd5b506104c5611c61565b34801561090b57600080fd5b506104c561091a3660046166e4565b611c67565b34801561092b57600080fd5b506104ae611ca7565b34801561094057600080fd5b50610665611dbb565b34801561095557600080fd5b50610512611dc0565b34801561096a57600080fd5b506104c5611dc6565b34801561097f57600080fd5b506104c5611dcb565b34801561099457600080fd5b50610512611dd0565b3480156109a957600080fd5b5061053f611dd6565b3480156109be57600080fd5b50610561611df5565b3480156109d357600080fd5b506104c5611dfe565b3480156109e857600080fd5b506104f0611aae565b3480156109fd57600080fd5b506104ae610a0c3660046167d2565b611e07565b348015610a1d57600080fd5b506104c5610a2c3660046166e4565b6126b3565b348015610a3d57600080fd5b506104c56126c5565b348015610a5257600080fd5b50610a5b6126d2565b6040516104d29190616a0a565b348015610a7457600080fd5b506104c56127be565b348015610a8957600080fd5b506104c5611bce565b348015610a9e57600080fd5b506105126127c3565b348015610ab357600080fd5b5061053f610ac236600461682e565b6127c9565b348015610ad357600080fd5b506104c56127d6565b348015610ae857600080fd5b506104c56127db565b348015610afd57600080fd5b506104c561281a565b348015610b1257600080fd5b506104c5612826565b348015610b2757600080fd5b5061051261282c565b348015610b3c57600080fd5b506104c5612832565b348015610b5157600080fd5b506104ae612837565b348015610b6657600080fd5b506104c56129e6565b348015610b7b57600080fd5b50610561610b8a366004616793565b6129ec565b348015610b9b57600080fd5b506104ae610baa3660046166e4565b612b72565b348015610bbb57600080fd5b506104f0612c7a565b6104ae610bd23660046166e4565b612c7f565b348015610be357600080fd5b506104c5612f07565b348015610bf857600080fd5b50610512612f0d565b348015610c0d57600080fd5b50610665611dc6565b348015610c2257600080fd5b50610512612f13565b348015610c3757600080fd5b50610c4b610c4636600461682e565b612f19565b6040516104d29392919061759d565b348015610c6657600080fd5b50610512612fdb565b6000610c7a33611c67565b9050600b8181548110610c8957fe5b600091825260209091206001601690920201015460ff16610cc55760405162461bcd60e51b8152600401610cbc9061723d565b60405180910390fd5b6000610ccf6127db565b9050610cdc338383612fe1565b505050565b60095481565b606481565b61200181565b60005460609060ff16610d175760405162461bcd60e51b8152600401610cbc90616cd1565b3361200014610d385760405162461bcd60e51b8152600401610cbc9061741c565b600b54610df657610d476163d0565b60015460005b81811015610df257600b805460018101825560009190915283516000805160206177f283398151915260169092029182019081556020808601516000805160206178328339815191528401805460ff1916911515919091179055604086015180518794610dce936000805160206178128339815191529091019201906163ff565b506060820151610de49060038301906013616479565b505050806001019050610d4d565b5050505b610dfe6164a6565b6000610e3f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506131cd92505050565b9150915080610e5b57610e526064613389565b92505050610f23565b815160009060ff16610e8057610e79836020015184604001516133ea565b9050610eef565b825160ff1660011415610eeb57826020015151600114610ec5576000805160206177d2833981519152604051610eb590617124565b60405180910390a1506067610ee6565b610e798360200151600081518110610ed957fe5b602002602001015161403e565b610eef565b5060655b63ffffffff8116610f145750506040805160008152602081019091529150610f239050565b610f1d81613389565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b334114610f5d5760405162461bcd60e51b8152600401610cbc9061746b565b6010544311610f7e5760405162461bcd60e51b8152600401610cbc90616e2d565b60005460ff16610fa05760405162461bcd60e51b8152600401610cbc90616cd1565b600f54610fb8576032600f55611002316011556112b8565b60006110023168056bc75e2d63100000811115610fe757610fe081606463ffffffff6141b516565b9150611030565b60115481111561102957610fe0606461101d600f54611011601154866141f790919063ffffffff16565b9063ffffffff61423916565b9063ffffffff6141b516565b50506112b8565b6040516309a99b4f60e41b815261100290639a99b4f09061105790309086906004016169af565b602060405180830381600087803b15801561107157600080fd5b505af1158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190616846565b611002316011559150816110be5750506112b8565b6000805b848110156110ec578585828181106110d657fe5b90506020020135820191508060010190506110c2565b50806110fa575050506112b8565b6000806000805b898110156112b0578489898381811061111657fe5b9050602002013588028161112657fe5b0493508a8a8281811061113557fe5b905060200201602081019061114a91906166e4565b6001600160a01b0381166000908152600460205260409020549093509150811561126657600060018084038154811061117f57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156111ec57836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516111df9190617594565b60405180910390a2611260565b6003546111ff908663ffffffff61427316565b6003908155810154611217908663ffffffff61427316565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611257908890617594565b60405180910390a25b506112a8565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d858560405161129f9190617594565b60405180910390a25b600101611101565b505050505050505b5050436010555050565b60015460009082106112d65750600061138c565b60006001600160a01b0316600183815481106112ee57fe5b60009182526020909120600490910201546001600160a01b0316148061131e5750600854158061131e5750600a54155b8061132d575060085460095410155b8061133e575061133c82611391565b155b8061136757506000600b838154811061135357fe5b906000526020600020906016020160000154115b8061137b575060016113776126d2565b5111155b156113885750600061138c565b5060015b919050565b60015460009082106113a55750600061138c565b600b5482106113e257600182815481106113bb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615905061138c565b600182815481106113ef57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615801561143c5750600b828154811061142357fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146114635760405162461bcd60e51b8152600401610cbc9061753c565b600b54611521576114726163d0565b60015460005b8181101561151d57600b805460018101825560009190915283516000805160206177f283398151915260169092029182019081556020808601516000805160206178328339815191528401805460ff19169115159190911790556040860151805187946114f9936000805160206178128339815191529091019201906163ff565b50606082015161150f9060038301906013616479565b505050806001019050611478565b5050505b6001600160a01b038116600090815260046020526040902054806115455750611598565b6001810390506000600b828154811061155a57fe5b600091825260209091206001601690920201015460ff16905061157d8383614298565b80156115865750805b15610cdc576009805460001901905550505b50565b60015460609081906000805b828110156115ee57600181815481106115bc57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166115e6576001909101905b6001016115a7565b5060608160405190808252806020026020018201604052801561161b578160200160208202803683370190505b50905060608260405190808252806020026020018201604052801561165457816020015b606081526020019060019003908161163f5790505b50600b54600094509091508414156117cf5760005b848110156117c9576001818154811061167e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166117c157600181815481106116ae57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106116d957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061170657fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561179e5780601f106117735761010080835404028352916020019161179e565b820191906000526020600020905b81548152906001019060200180831161178157829003601f168201915b50505050508285815181106117af57fe5b60209081029190910101526001909301925b600101611669565b5061186b565b60005b8481101561186957600181815481106117e757fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611861576001818154811061181757fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061184257fe5b6001600160a01b03909216602092830291909101909101526001909301925b6001016117d2565b505b909450925050505b9091565b61271081565b600181565b61100181565b60085481565b606181565b600881565b600e54600c546060918291806118ac575060155b60606118b66126d2565b905060606118c38261464b565b9050828251116118da579094509250611873915050565b838383510310156118ec578282510393505b83156119225760c8430461190883838388880360008a8a6147b9565b6119208383838888038989038a8b8b8b5103016147b9565b505b60608360405190808252806020026020018201604052801561194e578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561198757816020015b60608152602001906001900390816119725790505b50905060005b85811015611a08578481815181106119a157fe5b60200260200101518382815181106119b557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106119e157fe5b60200260200101518282815181106119f557fe5b602090810291909101015260010161198d565b509096509450505050509091565b60065481565b61200081565b600f5481565b6001600160a01b03811660009081526004602052604081205480611a5057600091505061138c565b60001901610f2381611391565b6001600160a01b03811660009081526004602052604081205480611a8557600091505061138c565b600180820381548110611a9457fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611ac557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611b565780601f10611b2b57610100808354040283529160200191611b56565b820191906000526020600020905b815481529060010190602001808311611b3957829003601f168201915b505050505081565b60105481565b60018181548110611b7157fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b606681565b3361200014611c155760405162461bcd60e51b8152600401610cbc9061741c565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051611c48939291906175dd565b60405180910390a1505050565b60025481565b60115481565b600a5481565b6001600160a01b03811660009081526004602052604081205480611c9d5760405162461bcd60e51b8152600401610cbc906173a4565b6000190192915050565b600b54611d6557611cb66163d0565b60015460005b81811015611d6157600b805460018101825560009190915283516000805160206177f283398151915260169092029182019081556020808601516000805160206178328339815191528401805460ff1916911515919091179055604086015180518794611d3d936000805160206178128339815191529091019201906163ff565b506060820151611d539060038301906013616479565b505050806001019050611cbc565b5050505b600854611d725760036008555b600a54611d7f576002600a555b6000611d8a33611c67565b9050611d95816112c2565b611db15760405162461bcd60e51b8152600401610cbc906170e1565b6115983382614910565b600981565b61100781565b600381565b60c881565b61100681565b604051806101e001604052806101ab81526020016176276101ab913981565b60005460ff1681565b6402540be40081565b60005460ff16611e295760405162461bcd60e51b8152600401610cbc90616cd1565b3361100714611e4a5760405162461bcd60e51b8152600401610cbc906171aa565b611eb484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506149a89050565b15611f515760208114611ed95760405162461bcd60e51b8152600401610cbc9061735e565b604080516020601f8401819004810282018101909252828152600091611f1791858580838501838280828437600092019190915250614a0192505050565b905060648110158015611f2d5750620186a08111155b611f495760405162461bcd60e51b8152600401610cbc90616f8a565b600255612670565b611fb184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506149a89050565b1561204d5760208114611fd65760405162461bcd60e51b8152600401610cbc90616b57565b604080516020601f840181900481028201810190925282815260009161201491858580838501838280828437600092019190915250614a0192505050565b90506127108111156120385760405162461bcd60e51b8152600401610cbc90616e6f565b6006556007805460ff19166001179055612670565b6120b784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506149a89050565b1561215157602081146120dc5760405162461bcd60e51b8152600401610cbc90616b8e565b604080516020601f840181900481028201810190925282815260009161211a91858580838501838280828437600092019190915250614a0192505050565b600c5490915080612129575060155b8082106121485760405162461bcd60e51b8152600401610cbc90616ee2565b50600855612670565b6121ba84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506149a89050565b1561225357602081146121df5760405162461bcd60e51b8152600401610cbc90616c57565b604080516020601f840181900481028201810190925282815260009161221d91858580838501838280828437600092019190915250614a0192505050565b905060008111801561222f5750600a81105b61224b5760405162461bcd60e51b8152600401610cbc906174b8565b600a55612670565b6122c784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506149a89050565b1561235657602081146122ec5760405162461bcd60e51b8152600401610cbc90616c0b565b604080516020601f840181900481028201810190925282815260009161232a91858580838501838280828437600092019190915250614a0192505050565b9050600d5481111561234e5760405162461bcd60e51b8152600401610cbc90617000565b600e55612670565b6123bf84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506149a89050565b1561244157602081146123e45760405162461bcd60e51b8152600401610cbc906171f8565b604080516020601f840181900481028201810190925282815260009161242291858580838501838280828437600092019190915250614a0192505050565b600d819055600e5490915081101561243b57600d54600e555b50612670565b6124a584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506149a89050565b1561255357602081146124ca5760405162461bcd60e51b8152600401610cbc90616c9c565b604080516020601f840181900481028201810190925282815260009161250891858580838501838280828437600092019190915250614a0192505050565b90506000811161252a5760405162461bcd60e51b8152600401610cbc90616d3f565b602981111561254b5760405162461bcd60e51b8152600401610cbc90616d87565b600c55612670565b6125bd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527266696e616c697479526577617264526174696f60681b602082015291506149a89050565b1561265857602081146125e25760405162461bcd60e51b8152600401610cbc906172e1565b604080516020601f840181900481028201810190925282815260009161262091858580838501838280828437600092019190915250614a0192505050565b905060018110158015612634575060648111155b6126505760405162461bcd60e51b8152600401610cbc9061706f565b600f55612670565b60405162461bcd60e51b8152600401610cbc90617515565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516126a59493929190616b25565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b82811015612701576126ed81611391565b156126f9578160010191505b6001016126dc565b5060608160405190808252806020026020018201604052801561272e578160200160208202803683370190505b5090506000915060005b838110156127b55761274981611391565b156127ad576001818154811061275b57fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061278657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612738565b50925050505b90565b601581565b61100281565b60138181548110611ac557fe5b603281565b60006127e56126d2565b519050600080600c54116127fa5760156127fe565b600c545b90508082111561280c578091505b8161281657600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561285a5760405162461bcd60e51b8152600401610cbc906172aa565b6128626164a6565b6000612888604051806101e001604052806101ab81526020016176276101ab91396131cd565b91509150806128a95760405162461bcd60e51b8152600401610cbc906173db565b60005b8260200151518110156129ce576001836020015182815181106128cb57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106129a157fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016128ac565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b81811015612af557612add85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612a4557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ad35780601f10612aa857610100808354040283529160200191612ad3565b820191906000526020600020905b815481529060010190602001808311612ab657829003601f168201915b5050505050614a06565b15612aed5760019250505061143c565b6001016129f4565b5060125460005b81811015612b6657612b4d86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612a4557fe5b15612b5e576001935050505061143c565b600101612afc565b50600095945050505050565b3361100114612b935760405162461bcd60e51b8152600401610cbc9061753c565b600b54612c5157612ba26163d0565b60015460005b81811015612c4d57600b805460018101825560009190915283516000805160206177f283398151915260169092029182019081556020808601516000805160206178328339815191528401805460ff1916911515919091179055604086015180518794612c29936000805160206178128339815191529091019201906163ff565b506060820151612c3f9060038301906013616479565b505050806001019050612ba8565b5050505b6000612c5c82614a6a565b9050612c67816112c2565b15612c7657612c768282614910565b5050565b606581565b334114612c9e5760405162461bcd60e51b8152600401610cbc9061746b565b60005460ff16612cc05760405162461bcd60e51b8152600401610cbc90616cd1565b60003411612ce05760405162461bcd60e51b8152600401610cbc90616fd1565b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615612d1057506006545b600083118015612d205750600081115b15612dc1576000612d3d61271061101d868563ffffffff61423916565b90508015612dbf5760405161dead9082156108fc029083906000818181858888f19350505050158015612d74573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee581604051612da49190617594565b60405180910390a1612dbc848263ffffffff6141f716565b93505b505b8115612ebf576000600180840381548110612dd857fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615612e4557846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051612e389190617594565b60405180910390a2612eb9565b600354612e58908563ffffffff61427316565b6003908155810154612e70908563ffffffff61427316565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590612eb0908790617594565b60405180910390a25b50612f01565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051612ef89190617594565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612f2657fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015612fd15780601f10612fa657610100808354040283529160200191612fd1565b820191906000526020600020905b815481529060010190602001808311612fb457829003601f168201915b5050505050905083565b61100481565b6000600a5460001480612ff2575081155b80612ffd5750600954155b1561300a57506000610f23565b60096000815460019003919050819055506000613055600a5461101d8561101d600b898154811061303757fe5b6000918252602090912060169091020154439063ffffffff6141f716565b90506000600b858154811061306657fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156130cb57600080fd5b505afa1580156130df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613103919061685e565b915091506000935080831061317d5761311c8787614298565b506040516305bfb49960e41b815261100190635bfb499090613142908a9060040161699b565b600060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050506001935061318f565b81831061318f5761318d87614a6a565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b6131d56164a6565b60006131df6164a6565b6131e76164ca565b6131f86131f386614c0d565b614c32565b90506000805b61320783614c7c565b1561337b578061322c5761322261321d84614c9d565b614ceb565b60ff168452613373565b806001141561336e57606061324861324385614c9d565b614d6b565b9050805160405190808252806020026020018201604052801561328557816020015b6132726164ea565b81526020019060019003908161326a5790505b50856020018190525080516040519080825280602002602001820160405280156132c357816020015b60608152602001906001900390816132ae5790505b50604086015260005b8151811015613363576132dd6164ea565b606060006132fd8585815181106132f057fe5b6020026020010151614e3c565b9250925092508061331d578860009a509a50505050505050505050613384565b828960200151858151811061332e57fe5b6020026020010181905250818960400151858151811061334a57fe5b60200260200101819052505050508060010190506132cc565b506001925050613373565b61337b565b6001016131fe565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816133a35790505090506133c98363ffffffff16614f56565b816000815181106133d657fe5b6020026020010181905250610f2381614f69565b6000602983511115613421576000805160206177d283398151915260405161341190616de4565b60405180910390a150606661143c565b60005b83518110156134bf5760005b818110156134b65784818151811061344457fe5b6020026020010151600001516001600160a01b031685838151811061346557fe5b6020026020010151600001516001600160a01b031614156134ae576000805160206177d283398151915260405161349b90616f3f565b60405180910390a160669250505061143c565b600101613430565b50600101613424565b506060806134cd8585614ff3565b60015491935091506000908190815b818110156135525767016345785d8a0000600182815481106134fa57fe5b9060005260206000209060040201600301541061351c5783600101935061354a565b60006001828154811061352b57fe5b906000526020600020906004020160030154111561354a578260010192505b6001016134dc565b5060608360405190808252806020026020018201604052801561357f578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156135ae578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156135dd578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561360c578160200160208202803683370190505b509050600060608760405190808252806020026020018201604052801561363d578160200160208202803683370190505b50905060608860405190808252806020026020018201604052801561366c578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156136b457600080fd5b505afa1580156136c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ec9190616846565b905067016345785d8a0000811115613737576000805160206177d283398151915260405161371990617269565b60405180910390a160689d505050505050505050505050505061143c565b60005b898110156139a85767016345785d8a00006001828154811061375857fe5b906000526020600020906004020160030154106138dd576001818154811061377c57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d815181106137ad57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106137e257fe5b906000526020600020906004020160030154816137fb57fe5b066001838154811061380957fe5b90600052602060002090600402016003015403905061383183826141f790919063ffffffff16565b898e8151811061383d57fe5b6020026020010181815250506001828154811061385657fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878e8151811061388757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e815181106138b457fe5b60209081029190910101526138cf868263ffffffff61427316565b95508c6001019c50506139a0565b6000600182815481106138ec57fe5b90600052602060002090600402016003015411156139a0576001818154811061391157fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c8151811061394257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061396f57fe5b906000526020600020906004020160030154838c8151811061398d57fe5b6020026020010181815250508a6001019a505b60010161373a565b5060008415613c1e576002546040516303702b2960e51b815261100491636e0565209188916139e2918e918e918d91420190600401616a8d565b6020604051808303818588803b1580156139fb57600080fd5b505af193505050508015613a2c575060408051601f3d908101601f19168201909252613a2991810190616773565b60015b613ba3576040516000815260443d1015613a4857506000613ae3565b60046000803e60005160e01c6308c379a08114613a69576000915050613ae3565b60043d036004833e81513d60248201116001600160401b0382111715613a9457600092505050613ae3565b80830180516001600160401b03811115613ab5576000945050505050613ae3565b8060208301013d8601811115613ad357600095505050505050613ae3565b601f01601f191660405250925050505b80613aee5750613b30565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051613b229190616b12565b60405180910390a250613b9e565b3d808015613b5a576040519150601f19603f3d011682016040523d82523d6000602084013e613b5f565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051613b949190616b12565b60405180910390a2505b613c1e565b8015613be5577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051613bd89190617594565b60405180910390a1613c1c565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051613c1390616bd4565b60405180910390a25b505b8015613dd45760005b8751811015613dd2576000888281518110613c3e57fe5b60200260200101519050600060018281548110613c5757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110613c8857fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015613d445760018281548110613cc957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110613d1857fe5b906000526020600020906004020160030154604051613d379190617594565b60405180910390a2613dc8565b60018281548110613d5157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110613da057fe5b906000526020600020906004020160030154604051613dbf9190617594565b60405180910390a25b5050600101613c27565b505b835115613f1e5760005b8451811015613f1c576000858281518110613df557fe5b60200260200101516001600160a01b03166108fc868481518110613e1557fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613eab57858281518110613e4b57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613e8957fe5b6020026020010151604051613e9e9190617594565b60405180910390a2613f13565b858281518110613eb757fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613ef557fe5b6020026020010151604051613f0a9190617594565b60405180910390a25b50600101613dde565b505b5050505050505050505050506000471115613f9a577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d47604051613f629190617594565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015613f98573d6000803e3d6000fd5b505b60006003819055600555815115613fb557613fb5828261522c565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613ff257600080fd5b505af1158015614006573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b80516001600160a01b031660009081526004602052604081205480158061408f575060018082038154811061406f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b156140d55782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a2600091505061138c565b60015460055460001982011180159061412b5784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000935050505061138c565b60058054600190810190915580548190600019860190811061414957fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000610f2383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506159e6565b6000610f2383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a1d565b6000826142485750600061143c565b8282028284828161425557fe5b0414610f235760405162461bcd60e51b8152600401610cbc90617169565b600082820183811015610f235760405162461bcd60e51b8152600401610cbc90616d08565b600080600183815481106142a857fe5b906000526020600020906004020160030154905060006001808054905003905060016142d26126d2565b5111614307576000600185815481106142e757fe5b90600052602060002090600402016003018190555060009250505061143c565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516143409190617594565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561452d576001816001018154811061438157fe5b90600052602060002090600402016001828154811061439c57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061445d57fe5b9060005260206000209060160201600b828154811061447857fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff19909216919091179055600280840180546144cf93838601939082161561010002600019019091160461651f565b506144e260038281019084016013616594565b509050508060010160046000600184815481106144fb57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101614363565b50600180548061453957fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061458c57fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906145be60028301826165be565b6145cc600383016000616602565b5050905560008183816145db57fe5b049050801561463f5760015460005b8181101561463c57826001828154811061460057fe5b906000526020600020906004020160030154016001828154811061462057fe5b60009182526020909120600360049092020101556001016145ea565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561468a57816020015b60608152602001906001900390816146755790505b50600b5490915083146146a157925061138c915050565b60005b828110156147b057600b6001600460008985815181106146c057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106146f457fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561478c5780601f106147615761010080835404028352916020019161478c565b820191906000526020600020905b81548152906001019060200180831161476f57829003601f168201915b505050505082828151811061479d57fe5b60209081029190910101526001016146a4565b50949350505050565b60005b8281101561490657600082878388016040516020016147dc92919061698d565b6040516020818303038152906040528051906020012060001c816147fc57fe5b069050808501828701146148fd576000898388018151811061481a57fe5b602002602001015190506060898489018151811061483457fe5b602002602001015190508a8388018151811061484c57fe5b60200260200101518b858a018151811061486257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061489157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505089838801815181106148bf57fe5b60200260200101518a858a01815181106148d557fe5b6020026020010181905250808a848901815181106148ef57fe5b602002602001018190525050505b506001016147bc565b5050505050505050565b600980546001908101909155600b80548390811061492a57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061496057fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016149bb9190616971565b60405160208183030381529060405280519060200120836040516020016149e29190616971565b6040516020818303038152906040528051906020012014905092915050565b015190565b815181516000916001918114808314614a225760009250614a60565b600160208701838101602088015b600284838510011415614a5b578051835114614a4f5760009650600093505b60209283019201614a30565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614a935750600019905061138c565b600181039050600060018281548110614aa857fe5b9060005260206000209060040201600301549050600060018381548110614acb57fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614b24908590617594565b60405180910390a280614b3c5782935050505061138c565b6000818381614b4757fe5b0490508015614c035760005b84811015614ba5578160018281548110614b6957fe5b9060005260206000209060040201600301540160018281548110614b8957fe5b6000918252602090912060036004909202010155600101614b53565b50600180549085015b81811015614c00578260018281548110614bc457fe5b9060005260206000209060040201600301540160018281548110614be457fe5b6000918252602090912060036004909202010155600101614bae565b50505b5091949350505050565b614c15616611565b506040805180820190915281518152602082810190820152919050565b614c3a6164ca565b614c4382615a49565b614c4c57600080fd5b6000614c5b8360200151615a83565b60208085015160408051808201909152868152920190820152915050919050565b6000614c86616611565b505080518051602091820151919092015191011190565b614ca5616611565b614cae82614c7c565b614cb757600080fd5b60208201516000614cc782615ae6565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590614d0057508151602110155b614d0957600080fd5b6000614d188360200151615a83565b90508083600001511015614d3e5760405162461bcd60e51b8152600401610cbc90617327565b8251602080850151830180519284900392918310156147b057506020919091036101000a90049392505050565b6060614d7682615a49565b614d7f57600080fd5b6000614d8a83615bc7565b9050606081604051908082528060200260200182016040528015614dc857816020015b614db5616611565b815260200190600190039081614dad5790505b5090506000614dda8560200151615a83565b60208601510190506000805b84811015614e3157614df783615ae6565b9150604051806040016040528083815260200184815250848281518110614e1a57fe5b602090810291909101015291810191600101614de6565b509195945050505050565b614e446164ea565b60606000614e506164ea565b6060614e5a6164ca565b614e6387614c32565b90506000805b614e7283614c7c565b15614f475780614e9d57614e8d614e8884614c9d565b615c23565b6001600160a01b03168552614f3f565b8060011415614ec557614eb2614e8884614c9d565b6001600160a01b03166020860152614f3f565b8060021415614eed57614eda614e8884614c9d565b6001600160a01b03166040860152614f3f565b8060031415614f1957614f0261321d84614c9d565b6001600160401b0316606086015260019150614f3f565b8060041415614f3a57614f33614f2e84614c9d565b615c3d565b9350614f3f565b614f47565b600101614e69565b50929791965091945092505050565b606061143c614f6483615cad565b615d93565b6060815160001415614f8a575060408051600081526020810190915261138c565b606082600081518110614f9957fe5b602002602001015190506000600190505b8351811015614fda57614fd082858381518110614fc357fe5b6020026020010151615de5565b9150600101614faa565b50610f23614fed825160c060ff16615e62565b82615de5565b6060806000808080806150046127db565b6001549091505b801561511257600181039250600b838154811061502457fe5b600091825260209091206001601690920201015460ff1661504457615109565b6001838154811061505157fe5b60009182526020909120600490910201546001600160a01b03169450615078858484612fe1565b935083158061508b575060018a51038610155b1561509557615109565b60005b8a5181101561510757856001600160a01b03168b82815181106150b757fe5b6020026020010151600001516001600160a01b031614156150ff5760018b82815181106150e057fe5b6020908102919091010151901515608090910152600190960195615107565b600101615098565b505b6000190161500b565b508489510360405190808252806020026020018201604052801561515057816020015b61513d6164ea565b8152602001906001900390816151355790505b5096508489510360405190808252806020026020018201604052801561518a57816020015b60608152602001906001900390816151755790505b5095506000915060005b895181101561521e578981815181106151a957fe5b602002602001015160800151615216578981815181106151c557fe5b60200260200101518884815181106151d957fe5b60200260200101819052508881815181106151f057fe5b602002602001015187848151811061520457fe5b60200260200101819052508260010192505b600101615194565b5050505050505b9250929050565b600154825160005b828110156153495760016152466164ea565b6001838154811061525357fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b8481101561531d578781815181106152e357fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615315576000925061531d565b6001016152cf565b50811561533f5780516001600160a01b03166000908152600460205260408120555b5050600101615234565b508082111561540857805b8281101561540657600180548061536757fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806153ba57fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906153ec60028301826165be565b6153fa600383016000616602565b50509055600101615354565b505b60008183106154175781615419565b825b905060005b81811015615788576154cb86828151811061543557fe5b60200260200101516001838154811061544a57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152615f34565b61567f5780600101600460008884815181106154e357fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061551f57fe5b60200260200101516001828154811061553457fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106155ef57fe5b6020026020010151600b828154811061560457fe5b906000526020600020906016020160020190805190602001906156289291906163ff565b506000600b828154811061563857fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061566957fe5b6000918252602090912060169091020155615780565b61571085828151811061568e57fe5b6020026020010151600b83815481106156a357fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612ad35780601f10612aa857610100808354040283529160200191612ad3565b61575b5784818151811061572057fe5b6020026020010151600b828154811061573557fe5b906000526020600020906016020160020190805190602001906157599291906163ff565b505b60006001828154811061576a57fe5b9060005260206000209060040201600301819055505b60010161541e565b5082821115615960576157996163d0565b835b8381101561595d578581815181106157af57fe5b6020026020010151826040018190525060018782815181106157cd57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b80549283018155909352845160169091026000805160206177f28339815191528101918255858301516000805160206178328339815191528201805491151560ff199092169190911790559285015180518694929361590393600080516020617812833981519152019201906163ff565b5060608201516159199060038301906013616479565b505050806001016004600089848151811061593057fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161579b565b50505b615968615fb5565b615970616197565b6000600981905560015493505b838110156159de576000600b828154811061599457fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106159c557fe5b600091825260209091206016909102015560010161597d565b505050505050565b60008183615a075760405162461bcd60e51b8152600401610cbc9190616b12565b506000838581615a1357fe5b0495945050505050565b60008184841115615a415760405162461bcd60e51b8152600401610cbc9190616b12565b505050900390565b8051600090615a5a5750600061138c565b6020820151805160001a9060c0821015615a795760009250505061138c565b5060019392505050565b8051600090811a6080811015615a9d57600091505061138c565b60b8811080615ab8575060c08110801590615ab8575060f881105b15615ac757600191505061138c565b60c0811015615adb5760b51901905061138c565b60f51901905061138c565b80516000908190811a6080811015615b015760019150615bc0565b60b8811015615b1657607e1981019150615bc0565b60c0811015615b6757600060b78203600186019550806020036101000a865104915060018101820193505080831015615b615760405162461bcd60e51b8152600401610cbc906170b6565b50615bc0565b60f8811015615b7c5760be1981019150615bc0565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615bbe5760405162461bcd60e51b8152600401610cbc906170b6565b505b5092915050565b8051600090615bd85750600061138c565b60008090506000615bec8460200151615a83565b602085015185519181019250015b80821015615c1a57615c0b82615ae6565b82019150826001019250615bfa565b50909392505050565b8051600090601514615c3457600080fd5b61143c82614ceb565b8051606090615c4b57600080fd5b6000615c5a8360200151615a83565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615c91576020820181803683370190505b50905060008160200190506147b0848760200151018285616385565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615cf157506018615d15565b6fffffffffffffffffffffffffffffffff198416615d1157506010615d15565b5060005b6020811015615d4b57818181518110615d2a57fe5b01602001516001600160f81b03191615615d4357615d4b565b600101615d15565b60008160200390506060816040519080825280601f01601f191660200182016040528015615d80576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015615dc55750607f60f81b82600081518110615db357fe5b01602001516001600160f81b03191611155b15615dd157508061138c565b61143c615de38351608060ff16615e62565b835b6060806040519050835180825260208201818101602087015b81831015615e16578051835260209283019201615dfe565b50855184518101855292509050808201602086015b81831015615e43578051835260209283019201615e2b565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310615e8c5760405162461bcd60e51b8152600401610cbc90616eba565b60408051600180825281830190925260609160208201818036833701905050905060378411615ee65782840160f81b81600081518110615ec857fe5b60200101906001600160f81b031916908160001a905350905061143c565b6060615ef185615cad565b90508381510160370160f81b82600081518110615f0a57fe5b60200101906001600160f81b031916908160001a905350615f2b8282615de5565b95945050505050565b805182516000916001600160a01b039182169116148015615f6e575081602001516001600160a01b031683602001516001600160a01b0316145b8015615f93575081604001516001600160a01b031683604001516001600160a01b0316145b8015610f235750506060908101519101516001600160401b0390811691161490565b6012546013548082111561600057805b82811015615ffe576012805480615fd857fe5b600190038181906000526020600020016000615ff491906165be565b9055600101615fc5565b505b600081831061600f5781616011565b825b905060005b81811015616129576160ce6012828154811061602e57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156160bc5780601f10616091576101008083540402835291602001916160bc565b820191906000526020600020905b81548152906001019060200180831161609f57829003601f168201915b505050505060138381548110612a4557fe5b61612157601381815481106160df57fe5b90600052602060002001601282815481106160f657fe5b90600052602060002001908054600181600116156101000203166002900461611f92919061651f565b505b600101616016565b5082821115610cdc57825b82811015612f015760126013828154811061614b57fe5b600091825260208083208454600181810187559585529190932092909101805461618e94939092019290916002610100928216159290920260001901160461651f565b50600101616134565b601354600b54808211156161e257805b828110156161e05760138054806161ba57fe5b6001900381819060005260206000200160006161d691906165be565b90556001016161a7565b505b60008183106161f157816161f3565b825b905060005b81811015616312576162b06013828154811061621057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561629e5780601f106162735761010080835404028352916020019161629e565b820191906000526020600020905b81548152906001019060200180831161628157829003601f168201915b5050505050600b83815481106156a357fe5b61630a57600b81815481106162c157fe5b9060005260206000209060160201600201601382815481106162df57fe5b90600052602060002001908054600181600116156101000203166002900461630892919061651f565b505b6001016161f8565b5082821115610cdc57825b82811015612f01576013600b828154811061633457fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461637c9593909401939092600019908216156101000201160461651f565b5060010161631d565b8061638f57610cdc565b5b602081106163af578251825260209283019290910190601f1901616390565b915181516020939093036101000a6000190180199091169216919091179052565b604051806080016040528060008152602001600015158152602001606081526020016163fa61662b565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061644057805160ff191683800117855561646d565b8280016001018555821561646d579182015b8281111561646d578251825591602001919060010190616452565b5061281692915061664a565b826013810192821561646d579160200282018281111561646d578251825591602001919060010190616452565b6040518060600160405280600060ff16815260200160608152602001606081525090565b60405180604001604052806164dd616611565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10616558578054855561646d565b8280016001018555821561646d57600052602060002091601f016020900482015b8281111561646d578254825591600101919060010190616579565b826013810192821561646d579182018281111561646d578254825591600101919060010190616579565b50805460018160011615610100020316600290046000825580601f106165e45750611598565b601f016020900490600052602060002090810190611598919061664a565b5061159890601381019061664a565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b6127bb91905b808211156128165760008155600101616650565b60008083601f840112616675578182fd5b5081356001600160401b0381111561668b578182fd5b602083019150836020808302850101111561522557600080fd5b60008083601f8401126166b6578182fd5b5081356001600160401b038111156166cc578182fd5b60208301915083602082850101111561522557600080fd5b6000602082840312156166f5578081fd5b81356001600160a01b0381168114610f23578182fd5b60008060008060408587031215616720578283fd5b84356001600160401b0380821115616736578485fd5b61674288838901616664565b9096509450602087013591508082111561675a578384fd5b5061676787828801616664565b95989497509550505050565b600060208284031215616784578081fd5b81518015158114610f23578182fd5b600080602083850312156167a5578182fd5b82356001600160401b038111156167ba578283fd5b6167c6858286016166a5565b90969095509350505050565b600080600080604085870312156167e7578384fd5b84356001600160401b03808211156167fd578586fd5b616809888389016166a5565b90965094506020870135915080821115616821578384fd5b50616767878288016166a5565b60006020828403121561683f578081fd5b5035919050565b600060208284031215616857578081fd5b5051919050565b60008060408385031215616870578182fd5b505080516020909101519092909150565b600080600060408486031215616895578283fd5b833560ff811681146168a5578384fd5b925060208401356001600160401b038111156168bf578283fd5b6168cb868287016166a5565b9497909650939450505050565b6000815180845260208085019450808401835b838110156169105781516001600160a01b0316875295820195908201906001016168eb565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000815180845261695d8160208601602086016175fa565b601f01601f19169290920160200192915050565b600082516169838184602087016175fa565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b600060208252610f2360208301846168d8565b600060408252616a3060408301856168d8565b602083820381850152818551808452828401915082838202850101838801865b83811015616a7e57601f19878403018552616a6c838351616945565b94860194925090850190600101616a50565b50909998505050505050505050565b600060808252616aa060808301876168d8565b828103602084810191909152865180835287820192820190845b81811015616ad657845183529383019391830191600101616aba565b50508481036040860152616aea81886168d8565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b600060208252610f236020830184616945565b600060408252616b3960408301868861691b565b8281036020840152616b4c81858761691b565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252602b908201527f746865206275726e526174696f206d757374206265206e6f206772656174657260408201526a0207468616e2031303030360ac1b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b60208082526027908201527f7468652066696e616c697479526577617264526174696f206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662066696e616c697479526577617264526174696f206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152615f2b6060830184616945565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152615f2b60408301848661691b565b60005b838110156176155781810151838201526020016175fd565b83811115612f01575050600091015256fef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a7841000000070e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa26469706673582212201bfbc326e63aa136a8685cddd241600b97b8502885f737aee34f1189c78be29b64736f6c63430006040033", + }, + { + ContractAddr: common.HexToAddress(SlashContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/ff8df0741e8f7e9b2c85c2a3b7b2426ad2ba1fad", + Code: "608060405234801561001057600080fd5b506004361061027f5760003560e01c80637942fd051161015c578063c80d4b8f116100ce578063dc927faf11610087578063dc927faf146104ad578063e1c7392a146104b5578063f9a2bbc7146104bd578063fc3e5908146104c5578063fc4333cd146104cd578063fd6a6879146104d55761027f565b8063c80d4b8f1461045c578063c81b166214610464578063c8509d811461046c578063c96be4cb1461047f578063cc844b7314610492578063d2a42e4b146104a55761027f565b80639dc09262116101205780639dc0926214610421578063a1a11bf514610429578063a78abc1614610431578063ab51bb9614610439578063ac0af62914610441578063ac431751146104495761027f565b80637942fd05146103ee5780638256ace6146103f6578063831d65d1146103fe57806396713da9146104115780639bc8e4f2146104195761027f565b8063493279b1116101f557806362b72cf5116101b957806362b72cf5146103be5780636e47b482146103c657806370fd5bad146103ce578063718a8aa8146103d657806375d47a0a146103de5780637912a65d146103e65761027f565b8063493279b11461037c5780634bf6c8821461039157806351e8067214610399578063567a372d146103a15780635bfb4990146103a95761027f565b806335aa2e441161024757806335aa2e441461030e57806337c8dab914610321578063389f4f71146103425780633a63f4b1146103575780633dffc3871461035f57806343756e5c146103745761027f565b80630bee7a67146102845780630e2374a5146102a25780631182b875146102b757806322d1e80b146102d757806323bac5a2146102ec575b600080fd5b61028c6104dd565b6040516102999190613368565b60405180910390f35b6102aa6104e2565b6040516102999190612c17565b6102ca6102c5366004612b4d565b6104e8565b6040516102999190612c4f565b6102df61054e565b6040516102999190612c44565b6102ff6102fa3660046128fb565b610557565b60405161029993929190613350565b6102aa61031c366004612b1d565b61057a565b61033461032f3660046128fb565b6105a1565b604051610299929190613342565b61034a6105f8565b6040516102999190613318565b61034a6105fe565b610367610604565b6040516102999190613379565b6102aa610609565b61038461060f565b6040516102999190613309565b610367610614565b6102aa610619565b61034a61061f565b6103bc6103b73660046128fb565b610625565b005b61034a6106d0565b6102aa6106d6565b6103676106dc565b6103676106e1565b6102aa6106e6565b61034a6106ec565b6103676106f1565b6103346106f6565b6103bc61040c366004612b4d565b610700565b610367610812565b61034a610817565b6102aa610822565b6102aa610828565b6102df61082e565b61028c610837565b61034a61083c565b6103bc610457366004612a01565b610841565b61034a610ce0565b6102aa610ce5565b6103bc61047a366004612b4d565b610ceb565b6103bc61048d3660046128fb565b610d5c565b6103bc6104a0366004612a6a565b61114d565b61034a61172f565b6102aa611734565b6103bc61173a565b6102aa611776565b61036761177c565b6103bc611781565b6102aa611bca565b606481565b61200181565b606033612000146105145760405162461bcd60e51b815260040161050b9061318f565b60405180910390fd5b60005460ff166105365760405162461bcd60e51b815260040161050b90612d30565b60405162461bcd60e51b815260040161050b90613252565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061058757fe5b6000918252602090912001546001600160a01b0316905081565b6000806105ac6126e2565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b60065481565b600181565b61100181565b606181565b600881565b61200081565b60045481565b33611000146106465760405162461bcd60e51b815260040161050b90612f74565b60005460ff166106685760405162461bcd60e51b815260040161050b90612d30565b61200063f7a251d7600b61067b84611bd0565b60006040518463ffffffff1660e01b815260040161069b93929190613387565b600060405180830381600087803b1580156106b557600080fd5b505af11580156106c9573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b6004546005549091565b33612000146107215760405162461bcd60e51b815260040161050b9061318f565b60005460ff166107435760405162461bcd60e51b815260040161050b90612d30565b61074b612705565b600061078c84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ca292505050565b9150915080156107d35781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e629967916107c691613368565b60405180910390a16106c9565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79161080391613368565b60405180910390a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff166108635760405162461bcd60e51b815260040161050b90612d30565b33611007146108845760405162461bcd60e51b815260040161050b9061304c565b6108ef84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611d229050565b1561098a57602081146109145760405162461bcd60e51b815260040161050b90612f00565b604080516020601f840181900481028201810190925282815260009161095291858580838501838280828437600092019190915250611d7c92505050565b905060018110158015610966575060055481105b6109825760405162461bcd60e51b815260040161050b9061314a565b600455610c9d565b6109f084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611d229050565b15610a8c5760208114610a155760405162461bcd60e51b815260040161050b9061309a565b604080516020601f8401819004810282018101909252828152600091610a5391858580838501838280828437600092019190915250611d7c92505050565b90506103e88111158015610a68575060045481115b610a845760405162461bcd60e51b815260040161050b90612d9e565b600555610c9d565b610b0084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f66696e616c697479536c617368526577617264526174696f000000000000000060208201529150611d229050565b15610b9a5760208114610b255760405162461bcd60e51b815260040161050b90613289565b604080516020601f8401819004810282018101909252828152600091610b6391858580838501838280828437600092019190915250611d7c92505050565b9050600a8110158015610b765750606481105b610b925760405162461bcd60e51b815260040161050b90612eb4565b600655610c9d565b610c0e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c617368000000000000000060208201529150611d229050565b15610c855760208114610c335760405162461bcd60e51b815260040161050b90612dd3565b604080516020601f8401819004810282018101909252828152610c6f9190848480838501838280828437600092019190915250611d8192505050565b6007805460ff1916911515919091179055610c9d565b60405162461bcd60e51b815260040161050b9061322b565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051610cd29493929190612c62565b60405180910390a150505050565b609681565b61100281565b3361200014610d0c5760405162461bcd60e51b815260040161050b9061318f565b60005460ff16610d2e5760405162461bcd60e51b815260040161050b90612d30565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610d7b5760405162461bcd60e51b815260040161050b906131de565b60005460ff16610d9d5760405162461bcd60e51b815260040161050b90612d30565b6003544311610dbe5760405162461bcd60e51b815260040161050b906132d4565b3a15610ddc5760405162461bcd60e51b815260040161050b90612fef565b60405163155853f360e21b8152611000906355614fcc90610e01908490600401612c17565b60206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5191906129e1565b610e5a57611146565b610e626126e2565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610ebd576020810180516001019052610f16565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b438152600554602082015181610f2857fe5b0661107457600060208201526040516335409f7f60e01b8152611000906335409f7f90610f59908590600401612c17565b600060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610fa785611bd0565b60006040518463ffffffff1660e01b8152600401610fc793929190613387565b600060405180830381600087803b158015610fe157600080fd5b505af1925050508015610ff2575060015b61106f573d808015611020576040519150601f19603f3d011682016040523d82523d6000602084013e611025565b606091505b50826001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c836020015183604051611065929190613321565b60405180910390a2505b6110e0565b60045481602001518161108357fe5b066110e0576040516375abf10160e11b81526110009063eb57e202906110ad908590600401612c17565b600060405180830381600087803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff1661116f5760405162461bcd60e51b815260040161050b90612d30565b604051630a83aaa960e31b81526110069063541d554890611194903390600401612c17565b60206040518083038186803b1580156111ac57600080fd5b505afa1580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906129e1565b6112005760405162461bcd60e51b815260040161050b90612c94565b60075460ff166112225760405162461bcd60e51b815260040161050b90612cfb565b60065461122f5760146006555b8051514361010090910111801561125157504381602001516000015161010001115b61126d5760405162461bcd60e51b815260040161050b90612ccb565b80602001516020015181600001516020015114801561129b5750806020015160600151816000015160600151145b156112b85760405162461bcd60e51b815260040161050b90612f47565b8051604081015190511080156112d75750602081015160408101519051105b6112f35760405162461bcd60e51b815260040161050b90612e7d565b6020810151518151511080156113185750806000015160400151816020015160400151105b8061134357508051516020820151511080156113435750806020015160400151816000015160400151105b8061135d5750806020015160400151816000015160400151145b6113795760405162461bcd60e51b815260040161050b90612d67565b604080820151905163ea321e4960e01b81526110009163ea321e49916113a29190600401612c4f565b60206040518083038186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f291906129e1565b61140e5760405162461bcd60e51b815260040161050b9061301d565b61142081600001518260400151611da9565b8015611439575061143981602001518260400151611da9565b6114555760405162461bcd60e51b815260040161050b90612e1e565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561149357600080fd5b505afa1580156114a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114cf919081019061291e565b9150915060005b815181101561160c576115008282815181106114ee57fe5b60200260200101518560400151611f81565b15611604576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906115389033908590600401612c2b565b602060405180830381600087803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190612b35565b506110006001600160a01b03166335409f7f8584815181106115a857fe5b60200260200101516040518263ffffffff1660e01b81526004016115cc9190612c17565b600060405180830381600087803b1580156115e657600080fd5b505af11580156115fa573d6000803e3d6000fd5b505050505061160c565b6001016114d6565b50600061161e84604001516000611fe5565b90506120006001600160a01b031663f7a251d7600b6116408760400151612001565b60006040518463ffffffff1660e01b815260040161166093929190613387565b600060405180830381600087803b15801561167a57600080fd5b505af192505050801561168b575060015b6116fd573d8080156116b9576040519150601f19603f3d011682016040523d82523d6000602084013e6116be565b606091505b50817fd58d1183100bd0932c0588f31c4205d6bc6168909765a96c41adbed3115f3628826040516116ef9190612c4f565b60405180910390a250611729565b60405181907f7b78aadacff901d8b63d0dba4f86283d4db8aef27f9ed70413dd860f1c9532b690600090a25b50505050565b601481565b61100381565b60005460ff161561175d5760405162461bcd60e51b815260040161050b906130dc565b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146117a25760405162461bcd60e51b815260040161050b90612f74565b60005460ff166117c45760405162461bcd60e51b815260040161050b90612d30565b6001546117d057611bc8565b600154600090600019015b808211611b9c576000805b828410156118ff576117f66126e2565b600260006001878154811061180757fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156118e95760046005548161187457fe5b0481602001510381602001818152505080600260006001888154811061189657fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff19169115159190911790556118f3565b60019250506118ff565b508360010193506117e6565b828411611a965761190e6126e2565b600260006001868154811061191f57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611a075760046005548161198c57fe5b048160200151038160200181815250508060026000600187815481106119ae57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611a969050565b6002600060018681548110611a1857fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611a5c57fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611a895750611a96565b50600019909201916118ff565b818015611aa05750805b15611b7f576002600060018681548110611ab657fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611afd57fe5b600091825260209091200154600180546001600160a01b039092169186908110611b2357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611b5c57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611b8b575050611b9c565b5050600190910190600019016117db565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611beb579050509050611c14836001600160a01b031661203c565b81600081518110611c2157fe5b6020026020010181905250611c354361205f565b81600181518110611c4257fe5b6020908102919091010152611c57606161205f565b81600281518110611c6457fe5b6020026020010181905250611c784261205f565b81600381518110611c8557fe5b6020026020010181905250611c9981612072565b9150505b919050565b611caa612705565b6000611cb4612705565b611cbc612717565b611ccd611cc8866120fc565b612121565b90506000805b611cdc8361216b565b15611d155780611d0857611cf7611cf28461218c565b6121da565b63ffffffff16845260019150611d0d565b611d15565b600101611cd3565b5091935090915050915091565b600081604051602001611d359190612bfb565b6040516020818303038152906040528051906020012083604051602001611d5c9190612bfb565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615611d9b576001915081611da1565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b6060815260200190600190039081611dc5575050604080516020808252818301909252919250606091908082018180368337019050509050611e0a856000015161205f565b82600081518110611e1757fe5b6020026020010181905250611e32602086602001518361225c565b611e3b8161226c565b82600181518110611e4857fe5b6020026020010181905250611e60856040015161205f565b82600281518110611e6d57fe5b6020026020010181905250611e88602086606001518361225c565b611e918161226c565b82600381518110611e9e57fe5b6020026020010181905250611ec46020611eb784612072565b805190602001208361225c565b6040805160b080825260e08201909252606091602082018180368337019050509050611ef48183600060206122c2565b611f06818760800151602060606122c2565b611f148186608060306122c2565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa611f5157600080fd5b506001611f5f826000612315565b60ff1614611f74576000945050505050611d76565b5060019695505050505050565b815181516000916001918114808314611f9d5760009250611fdb565b600160208701838101602088015b600284838510011415611fd6578051835114611fca5760009650600093505b60209283019201611fab565b505050505b5090949350505050565b60008160200183511015611ff857600080fd5b50016020015190565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161201c579050509050611c148361226c565b60408051600560a21b8318601482015260348101909152606090611c998161226c565b6060611d7661206d83612331565b61226c565b60608151600014156120935750604080516000815260208101909152611c9d565b6060826000815181106120a257fe5b602002602001015190506000600190505b83518110156120e3576120d9828583815181106120cc57fe5b6020026020010151612417565b91506001016120b3565b50611c996120f6825160c060ff16612494565b82612417565b612104612737565b506040805180820190915281518152602082810190820152919050565b612129612717565b61213282612566565b61213b57600080fd5b600061214a83602001516125a0565b60208085015160408051808201909152868152920190820152915050919050565b6000612175612737565b505080518051602091820151919092015191011190565b612194612737565b61219d8261216b565b6121a657600080fd5b602082015160006121b682612603565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906121ef57508151602110155b6121f857600080fd5b600061220783602001516125a0565b9050808360000151101561222d5760405162461bcd60e51b815260040161050b90613113565b82516020808501518301805192849003929183101561225357826020036101000a820491505b50949350505050565b9091018181526020918201910152565b60608151600114801561229e5750607f60f81b8260008151811061228c57fe5b01602001516001600160f81b03191611155b156122aa575080611c9d565b611d766122bc8351608060ff16612494565b83612417565b60005b818110156106c9578381815181106122d957fe5b602001015160f81c60f81b8584806001019550815181106122f657fe5b60200101906001600160f81b031916908160001a9053506001016122c5565b6000816001018351101561232857600080fd5b50016001015190565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661237557506018612399565b6fffffffffffffffffffffffffffffffff19841661239557506010612399565b5060005b60208110156123cf578181815181106123ae57fe5b01602001516001600160f81b031916156123c7576123cf565b600101612399565b60008160200390506060816040519080825280601f01601f191660200182016040528015612404576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612448578051835260209283019201612430565b50855184518101855292509050808201602086015b8183101561247557805183526020928301920161245d565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106124be5760405162461bcd60e51b815260040161050b90612e55565b604080516001808252818301909252606091602082018180368337019050509050603784116125185782840160f81b816000815181106124fa57fe5b60200101906001600160f81b031916908160001a9053509050611d76565b606061252385612331565b90508381510160370160f81b8260008151811061253c57fe5b60200101906001600160f81b031916908160001a90535061255d8282612417565b95945050505050565b805160009061257757506000611c9d565b6020820151805160001a9060c082101561259657600092505050611c9d565b5060019392505050565b8051600090811a60808110156125ba576000915050611c9d565b60b88110806125d5575060c081108015906125d5575060f881105b156125e4576001915050611c9d565b60c08110156125f85760b519019050611c9d565b60f519019050611c9d565b80516000908190811a608081101561261e57600191506126db565b60b881101561263357607e19810191506126db565b60c081101561268457600060b78203600186019550806020036101000a86510491506001810182019350508083101561267e5760405162461bcd60e51b815260040161050b90612fc4565b506126db565b60f88110156126995760be19810191506126db565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611da15760405162461bcd60e51b815260040161050b90612fc4565b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061272a612737565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f830112612761578081fd5b815161277461276f826133da565b6133b3565b818152915060208083019084810160005b848110156127ea578151870188603f8201126127a057600080fd5b838101516127b061276f826133fa565b81815260408b818486010111156127c657600080fd5b6127d58388840183870161341e565b50865250509282019290820190600101612785565b505050505092915050565b60008083601f840112612806578182fd5b50813567ffffffffffffffff81111561281d578182fd5b60208301915083602082850101111561283557600080fd5b9250929050565b600082601f83011261284c578081fd5b813561285a61276f826133fa565b915080825283602082850101111561287157600080fd5b8060208401602084013760009082016020015292915050565b600060a0828403121561289b578081fd5b6128a560a06133b3565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156128e357600080fd5b6128ef8482850161283c565b60808301525092915050565b60006020828403121561290c578081fd5b81356129178161344a565b9392505050565b60008060408385031215612930578081fd5b825167ffffffffffffffff80821115612947578283fd5b81850186601f820112612958578384fd5b8051925061296861276f846133da565b80848252602080830192508084018a828389028701011115612988578788fd5b8794505b868510156129b357805161299f8161344a565b84526001949094019392810192810161298c565b5088015190965093505050808211156129ca578283fd5b506129d785828601612751565b9150509250929050565b6000602082840312156129f2578081fd5b81518015158114612917578182fd5b60008060008060408587031215612a16578182fd5b843567ffffffffffffffff80821115612a2d578384fd5b612a39888389016127f5565b90965094506020870135915080821115612a51578384fd5b50612a5e878288016127f5565b95989497509550505050565b600060208284031215612a7b578081fd5b813567ffffffffffffffff80821115612a92578283fd5b81840160608187031215612aa4578384fd5b612aae60606133b3565b9250803582811115612abe578485fd5b612aca8782840161288a565b845250602081013582811115612ade578485fd5b612aea8782840161288a565b602085015250604081013582811115612b01578485fd5b612b0d8782840161283c565b6040850152509195945050505050565b600060208284031215612b2e578081fd5b5035919050565b600060208284031215612b46578081fd5b5051919050565b600080600060408486031215612b61578283fd5b833560ff81168114612b71578384fd5b9250602084013567ffffffffffffffff811115612b8c578283fd5b612b98868287016127f5565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612be781602086016020860161341e565b601f01601f19169290920160200192915050565b60008251612c0d81846020870161341e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526129176020830184612bcf565b600060408252612c76604083018688612ba5565b8281036020840152612c89818587612ba5565b979650505050505050565b6020808252601f908201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604082015260600190565b6020808252601690820152751d1bdbc81bdb1908189b1bd8dac81a5b9d9bdb1d995960521b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b6020808252602c908201527f7468652066696e616c69747920736c6173682072657761726420726174696f2060408201526b6f7574206f662072616e676560a01b606082015260800190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252602b908201527f6c656e677468206f662066696e616c697479536c61736852657761726452617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b60008382526040602083015261333a6040830184612bcf565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff85168252606060208301526133a36060830185612bcf565b9050826040830152949350505050565b60405181810167ffffffffffffffff811182821017156133d257600080fd5b604052919050565b600067ffffffffffffffff8211156133f0578081fd5b5060209081020190565b600067ffffffffffffffff821115613410578081fd5b50601f01601f191660200190565b60005b83811015613439578181015183820152602001613421565b838111156117295750506000910152565b6001600160a01b038116811461345f57600080fd5b5056fea26469706673582212203a9ca09f5159164ba93c08e6c82b9ec349e3c2c79d7defcc0d20427ff56c775364736f6c63430006040033", + }, + }, + } + + platoUpgrade[rialtoNet] = &Upgrade{ + UpgradeName: "plato", + Configs: []*UpgradeConfig{ + { + ContractAddr: common.HexToAddress(ValidatorContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/ff8df0741e8f7e9b2c85c2a3b7b2426ad2ba1fad", + Code: "60806040526004361061048d5760003560e01c806388b32f1111610255578063c81b166211610144578063e40716a1116100c1578063f92eb86b11610085578063f92eb86b14610bd7578063f9a2bbc714610bec578063fc3e590814610c01578063fccc281314610c16578063fd4ad81f14610c2b578063fd6a687914610c5a57610494565b8063e40716a114610b5a578063ea321e4914610b6f578063eb57e20214610b8f578063eda5868c14610baf578063f340fa0114610bc457610494565b8063d86222d511610108578063d86222d514610af1578063daacdb6614610b06578063dc927faf14610b1b578063e086c7b114610b30578063e1c7392a14610b4557610494565b8063c81b166214610a92578063c8509d81146108a0578063ce910b0c14610aa7578063d04aa99614610ac7578063d68fb56a14610adc57610494565b8063a78abc16116101d2578063aef198a911610196578063aef198a914610a31578063b7ab4db514610a46578063b8cf4ef114610a68578063bf9f499514610650578063c6d3394514610a7d57610494565b8063a78abc16146109b2578063aaf5eb68146109c7578063ab51bb96146109dc578063ac431751146109f1578063ad3c9da614610a1157610494565b80639dc09262116102195780639dc09262146109495780639fe0f8161461095e578063a0dc275814610973578063a1a11bf514610988578063a5422d5c1461099d57610494565b806388b32f11146108d55780638b5ad0c9146108ea5780638d19a410146108ff5780639369d7de1461091f57806396713da91461093457610494565b80635192c82c1161037c5780636e47b482116102f95780637942fd05116102bd5780637942fd05146108615780637a84ca2a1461087657806381650b621461088b578063831d65d1146108a0578063853230aa1461084c57806386249882146108c057610494565b80636e47b482146107f857806370fd5bad1461080d578063718a8aa81461082257806375d47a0a1461083757806378dfed4a1461084c57610494565b80635667515a116103405780635667515a146107675780635d77156c1461077c57806360eba4fe1461079157806362b72cf5146107b15780636969a25c146107c657610494565b80635192c82c146106e857806351e80672146106fd578063549b03f21461071257806355614fcc14610727578063565c56b31461074757610494565b80633365af3a1161040a57806343756e5c116103ce57806343756e5c1461067257806345cf9daf14610687578063493279b11461069c5780634bf6c882146106be5780634df6e0c3146106d357610494565b80633365af3a146105d857806335409f7f146105f85780633b071dcc146106185780633de0f0d81461063b5780633dffc3871461065057610494565b8063152ad3b811610451578063152ad3b81461054c5780631ff180691461056e578063219f22d514610583578063300c356714610598578063321d398a146105b857610494565b806304c4fec61461049957806307a56847146104b05780630bee7a67146104db5780630e2374a5146104fd5780631182b8751461051f57610494565b3661049457005b600080fd5b3480156104a557600080fd5b506104ae610c6f565b005b3480156104bc57600080fd5b506104c5610ce1565b6040516104d29190617595565b60405180910390f35b3480156104e757600080fd5b506104f0610ce7565b6040516104d291906175bf565b34801561050957600080fd5b50610512610cec565b6040516104d2919061699c565b34801561052b57600080fd5b5061053f61053a366004616882565b610cf2565b6040516104d29190616b13565b34801561055857600080fd5b50610561610f2a565b6040516104d29190616b08565b34801561057a57600080fd5b506104c5610f33565b34801561058f57600080fd5b506104f0610f39565b3480156105a457600080fd5b506104ae6105b336600461670c565b610f3e565b3480156105c457600080fd5b506105616105d336600461682f565b6112c2565b3480156105e457600080fd5b506105616105f336600461682f565b611391565b34801561060457600080fd5b506104ae6106133660046166e5565b611442565b34801561062457600080fd5b5061062d61159b565b6040516104d2929190616a1e565b34801561064757600080fd5b506104c5611877565b34801561065c57600080fd5b5061066561187d565b6040516104d291906175d0565b34801561067e57600080fd5b50610512611882565b34801561069357600080fd5b506104c5611888565b3480156106a857600080fd5b506106b161188e565b6040516104d29190617586565b3480156106ca57600080fd5b50610665611894565b3480156106df57600080fd5b5061062d611899565b3480156106f457600080fd5b506104c5611a17565b34801561070957600080fd5b50610512611a1d565b34801561071e57600080fd5b506104c5611a23565b34801561073357600080fd5b506105616107423660046166e5565b611a29565b34801561075357600080fd5b506104c56107623660046166e5565b611a5e565b34801561077357600080fd5b50610665611aaf565b34801561078857600080fd5b506104f0611ab4565b34801561079d57600080fd5b5061053f6107ac36600461682f565b611ab9565b3480156107bd57600080fd5b506104c5611b5f565b3480156107d257600080fd5b506107e66107e136600461682f565b611b65565b6040516104d2969594939291906169c9565b34801561080457600080fd5b50610512611bc9565b34801561081957600080fd5b50610665611bcf565b34801561082e57600080fd5b50610665611bd4565b34801561084357600080fd5b50610512611bd9565b34801561085857600080fd5b506104c5611bdf565b34801561086d57600080fd5b50610665611be5565b34801561088257600080fd5b506104c5611bea565b34801561089757600080fd5b506104f0611bf0565b3480156108ac57600080fd5b506104ae6108bb366004616882565b611bf5565b3480156108cc57600080fd5b506104c5611c56565b3480156108e157600080fd5b506104c5611c5c565b3480156108f657600080fd5b506104c5611c62565b34801561090b57600080fd5b506104c561091a3660046166e5565b611c68565b34801561092b57600080fd5b506104ae611ca8565b34801561094057600080fd5b50610665611dbc565b34801561095557600080fd5b50610512611dc1565b34801561096a57600080fd5b506104c5611dc7565b34801561097f57600080fd5b506104c5611dcc565b34801561099457600080fd5b50610512611dd1565b3480156109a957600080fd5b5061053f611dd7565b3480156109be57600080fd5b50610561611df6565b3480156109d357600080fd5b506104c5611dff565b3480156109e857600080fd5b506104f0611aaf565b3480156109fd57600080fd5b506104ae610a0c3660046167d3565b611e08565b348015610a1d57600080fd5b506104c5610a2c3660046166e5565b6126b4565b348015610a3d57600080fd5b506104c56126c6565b348015610a5257600080fd5b50610a5b6126d3565b6040516104d29190616a0b565b348015610a7457600080fd5b506104c56127bf565b348015610a8957600080fd5b506104c5611bcf565b348015610a9e57600080fd5b506105126127c4565b348015610ab357600080fd5b5061053f610ac236600461682f565b6127ca565b348015610ad357600080fd5b506104c56127d7565b348015610ae857600080fd5b506104c56127dc565b348015610afd57600080fd5b506104c561281b565b348015610b1257600080fd5b506104c5612827565b348015610b2757600080fd5b5061051261282d565b348015610b3c57600080fd5b506104c5612833565b348015610b5157600080fd5b506104ae612838565b348015610b6657600080fd5b506104c56129e7565b348015610b7b57600080fd5b50610561610b8a366004616794565b6129ed565b348015610b9b57600080fd5b506104ae610baa3660046166e5565b612b73565b348015610bbb57600080fd5b506104f0612c7b565b6104ae610bd23660046166e5565b612c80565b348015610be357600080fd5b506104c5612f08565b348015610bf857600080fd5b50610512612f0e565b348015610c0d57600080fd5b50610665611dc7565b348015610c2257600080fd5b50610512612f14565b348015610c3757600080fd5b50610c4b610c4636600461682f565b612f1a565b6040516104d29392919061759e565b348015610c6657600080fd5b50610512612fdc565b6000610c7a33611c68565b9050600b8181548110610c8957fe5b600091825260209091206001601690920201015460ff16610cc55760405162461bcd60e51b8152600401610cbc9061723e565b60405180910390fd5b6000610ccf6127dc565b9050610cdc338383612fe2565b505050565b60095481565b606481565b61200181565b60005460609060ff16610d175760405162461bcd60e51b8152600401610cbc90616cd2565b3361200014610d385760405162461bcd60e51b8152600401610cbc9061741d565b600b54610df657610d476163d1565b60015460005b81811015610df257600b805460018101825560009190915283516000805160206177f383398151915260169092029182019081556020808601516000805160206178338339815191528401805460ff1916911515919091179055604086015180518794610dce93600080516020617813833981519152909101920190616400565b506060820151610de4906003830190601361647a565b505050806001019050610d4d565b5050505b610dfe6164a7565b6000610e3f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506131ce92505050565b9150915080610e5b57610e52606461338a565b92505050610f23565b815160009060ff16610e8057610e79836020015184604001516133eb565b9050610eef565b825160ff1660011415610eeb57826020015151600114610ec5576000805160206177d3833981519152604051610eb590617125565b60405180910390a1506067610ee6565b610e798360200151600081518110610ed957fe5b602002602001015161403f565b610eef565b5060655b63ffffffff8116610f145750506040805160008152602081019091529150610f239050565b610f1d8161338a565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b334114610f5d5760405162461bcd60e51b8152600401610cbc9061746c565b6010544311610f7e5760405162461bcd60e51b8152600401610cbc90616e2e565b60005460ff16610fa05760405162461bcd60e51b8152600401610cbc90616cd2565b600f54610fb8576032600f55611002316011556112b8565b60006110023168056bc75e2d63100000811115610fe757610fe081606463ffffffff6141b616565b9150611030565b60115481111561102957610fe0606461101d600f54611011601154866141f890919063ffffffff16565b9063ffffffff61423a16565b9063ffffffff6141b616565b50506112b8565b6040516309a99b4f60e41b815261100290639a99b4f09061105790309086906004016169b0565b602060405180830381600087803b15801561107157600080fd5b505af1158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190616847565b611002316011559150816110be5750506112b8565b6000805b848110156110ec578585828181106110d657fe5b90506020020135820191508060010190506110c2565b50806110fa575050506112b8565b6000806000805b898110156112b0578489898381811061111657fe5b9050602002013588028161112657fe5b0493508a8a8281811061113557fe5b905060200201602081019061114a91906166e5565b6001600160a01b0381166000908152600460205260409020549093509150811561126657600060018084038154811061117f57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff16156111ec57836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516111df9190617595565b60405180910390a2611260565b6003546111ff908663ffffffff61427416565b6003908155810154611217908663ffffffff61427416565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b290611257908890617595565b60405180910390a25b506112a8565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d858560405161129f9190617595565b60405180910390a25b600101611101565b505050505050505b5050436010555050565b60015460009082106112d65750600061138c565b60006001600160a01b0316600183815481106112ee57fe5b60009182526020909120600490910201546001600160a01b0316148061131e5750600854158061131e5750600a54155b8061132d575060085460095410155b8061133e575061133c82611391565b155b8061136757506000600b838154811061135357fe5b906000526020600020906016020160000154115b8061137b575060016113776126d3565b5111155b156113885750600061138c565b5060015b919050565b60015460009082106113a55750600061138c565b600b5482106113e257600182815481106113bb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615905061138c565b600182815481106113ef57fe5b9060005260206000209060040201600201601c9054906101000a900460ff1615801561143c5750600b828154811061142357fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146114635760405162461bcd60e51b8152600401610cbc9061753d565b600b54611521576114726163d1565b60015460005b8181101561151d57600b805460018101825560009190915283516000805160206177f383398151915260169092029182019081556020808601516000805160206178338339815191528401805460ff19169115159190911790556040860151805187946114f993600080516020617813833981519152909101920190616400565b50606082015161150f906003830190601361647a565b505050806001019050611478565b5050505b6001600160a01b038116600090815260046020526040902054806115455750611598565b6001810390506000600b828154811061155a57fe5b600091825260209091206001601690920201015460ff16905061157d8383614299565b80156115865750805b15610cdc576009805460001901905550505b50565b60015460609081906000805b828110156115ee57600181815481106115bc57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166115e6576001909101905b6001016115a7565b5060608160405190808252806020026020018201604052801561161b578160200160208202803683370190505b50905060608260405190808252806020026020018201604052801561165457816020015b606081526020019060019003908161163f5790505b50600b54600094509091508414156117cf5760005b848110156117c9576001818154811061167e57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166117c157600181815481106116ae57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106116d957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061170657fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561179e5780601f106117735761010080835404028352916020019161179e565b820191906000526020600020905b81548152906001019060200180831161178157829003601f168201915b50505050508285815181106117af57fe5b60209081029190910101526001909301925b600101611669565b5061186b565b60005b8481101561186957600181815481106117e757fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611861576001818154811061181757fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061184257fe5b6001600160a01b03909216602092830291909101909101526001909301925b6001016117d2565b505b909450925050505b9091565b61271081565b600181565b61100181565b60085481565b6102ca81565b600881565b600e54600c546060918291806118ad575060155b60606118b76126d3565b905060606118c48261464c565b9050828251116118db579094509250611873915050565b838383510310156118ed578282510393505b83156119235760c8430461190983838388880360008a8a6147ba565b6119218383838888038989038a8b8b8b5103016147ba565b505b60608360405190808252806020026020018201604052801561194f578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561198857816020015b60608152602001906001900390816119735790505b50905060005b85811015611a09578481815181106119a257fe5b60200260200101518382815181106119b657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106119e257fe5b60200260200101518282815181106119f657fe5b602090810291909101015260010161198e565b509096509450505050509091565b60065481565b61200081565b600f5481565b6001600160a01b03811660009081526004602052604081205480611a5157600091505061138c565b60001901610f2381611391565b6001600160a01b03811660009081526004602052604081205480611a8657600091505061138c565b600180820381548110611a9557fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611ac657fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611b575780601f10611b2c57610100808354040283529160200191611b57565b820191906000526020600020905b815481529060010190602001808311611b3a57829003601f168201915b505050505081565b60105481565b60018181548110611b7257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b6103e881565b600b81565b600c5481565b606681565b3361200014611c165760405162461bcd60e51b8152600401610cbc9061741d565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051611c49939291906175de565b60405180910390a1505050565b60025481565b60115481565b600a5481565b6001600160a01b03811660009081526004602052604081205480611c9e5760405162461bcd60e51b8152600401610cbc906173a5565b6000190192915050565b600b54611d6657611cb76163d1565b60015460005b81811015611d6257600b805460018101825560009190915283516000805160206177f383398151915260169092029182019081556020808601516000805160206178338339815191528401805460ff1916911515919091179055604086015180518794611d3e93600080516020617813833981519152909101920190616400565b506060820151611d54906003830190601361647a565b505050806001019050611cbd565b5050505b600854611d735760036008555b600a54611d80576002600a555b6000611d8b33611c68565b9050611d96816112c2565b611db25760405162461bcd60e51b8152600401610cbc906170e2565b6115983382614911565b600981565b61100781565b600381565b60c881565b61100681565b604051806101e001604052806101ab81526020016176286101ab913981565b60005460ff1681565b6402540be40081565b60005460ff16611e2a5760405162461bcd60e51b8152600401610cbc90616cd2565b3361100714611e4b5760405162461bcd60e51b8152600401610cbc906171ab565b611eb584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506149a99050565b15611f525760208114611eda5760405162461bcd60e51b8152600401610cbc9061735f565b604080516020601f8401819004810282018101909252828152600091611f1891858580838501838280828437600092019190915250614a0292505050565b905060648110158015611f2e5750620186a08111155b611f4a5760405162461bcd60e51b8152600401610cbc90616f8b565b600255612671565b611fb284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506149a99050565b1561204e5760208114611fd75760405162461bcd60e51b8152600401610cbc90616b58565b604080516020601f840181900481028201810190925282815260009161201591858580838501838280828437600092019190915250614a0292505050565b90506127108111156120395760405162461bcd60e51b8152600401610cbc90616e70565b6006556007805460ff19166001179055612671565b6120b884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506149a99050565b1561215257602081146120dd5760405162461bcd60e51b8152600401610cbc90616b8f565b604080516020601f840181900481028201810190925282815260009161211b91858580838501838280828437600092019190915250614a0292505050565b600c549091508061212a575060155b8082106121495760405162461bcd60e51b8152600401610cbc90616ee3565b50600855612671565b6121bb84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506149a99050565b1561225457602081146121e05760405162461bcd60e51b8152600401610cbc90616c58565b604080516020601f840181900481028201810190925282815260009161221e91858580838501838280828437600092019190915250614a0292505050565b90506000811180156122305750600a81105b61224c5760405162461bcd60e51b8152600401610cbc906174b9565b600a55612671565b6122c884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506149a99050565b1561235757602081146122ed5760405162461bcd60e51b8152600401610cbc90616c0c565b604080516020601f840181900481028201810190925282815260009161232b91858580838501838280828437600092019190915250614a0292505050565b9050600d5481111561234f5760405162461bcd60e51b8152600401610cbc90617001565b600e55612671565b6123c084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506149a99050565b1561244257602081146123e55760405162461bcd60e51b8152600401610cbc906171f9565b604080516020601f840181900481028201810190925282815260009161242391858580838501838280828437600092019190915250614a0292505050565b600d819055600e5490915081101561243c57600d54600e555b50612671565b6124a684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506149a99050565b1561255457602081146124cb5760405162461bcd60e51b8152600401610cbc90616c9d565b604080516020601f840181900481028201810190925282815260009161250991858580838501838280828437600092019190915250614a0292505050565b90506000811161252b5760405162461bcd60e51b8152600401610cbc90616d40565b602981111561254c5760405162461bcd60e51b8152600401610cbc90616d88565b600c55612671565b6125be84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527266696e616c697479526577617264526174696f60681b602082015291506149a99050565b1561265957602081146125e35760405162461bcd60e51b8152600401610cbc906172e2565b604080516020601f840181900481028201810190925282815260009161262191858580838501838280828437600092019190915250614a0292505050565b905060018110158015612635575060648111155b6126515760405162461bcd60e51b8152600401610cbc90617070565b600f55612671565b60405162461bcd60e51b8152600401610cbc90617516565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516126a69493929190616b26565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b82811015612702576126ee81611391565b156126fa578160010191505b6001016126dd565b5060608160405190808252806020026020018201604052801561272f578160200160208202803683370190505b5090506000915060005b838110156127b65761274a81611391565b156127ae576001818154811061275c57fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061278757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612739565b50925050505b90565b601581565b61100281565b60138181548110611ac657fe5b603281565b60006127e66126d3565b519050600080600c54116127fb5760156127ff565b600c545b90508082111561280d578091505b8161281757600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561285b5760405162461bcd60e51b8152600401610cbc906172ab565b6128636164a7565b6000612889604051806101e001604052806101ab81526020016176286101ab91396131ce565b91509150806128aa5760405162461bcd60e51b8152600401610cbc906173dc565b60005b8260200151518110156129cf576001836020015182815181106128cc57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106129a257fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016128ad565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b81811015612af657612ade85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612a4657fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ad45780601f10612aa957610100808354040283529160200191612ad4565b820191906000526020600020905b815481529060010190602001808311612ab757829003601f168201915b5050505050614a07565b15612aee5760019250505061143c565b6001016129f5565b5060125460005b81811015612b6757612b4e86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612a4657fe5b15612b5f576001935050505061143c565b600101612afd565b50600095945050505050565b3361100114612b945760405162461bcd60e51b8152600401610cbc9061753d565b600b54612c5257612ba36163d1565b60015460005b81811015612c4e57600b805460018101825560009190915283516000805160206177f383398151915260169092029182019081556020808601516000805160206178338339815191528401805460ff1916911515919091179055604086015180518794612c2a93600080516020617813833981519152909101920190616400565b506060820151612c40906003830190601361647a565b505050806001019050612ba9565b5050505b6000612c5d82614a6b565b9050612c68816112c2565b15612c7757612c778282614911565b5050565b606581565b334114612c9f5760405162461bcd60e51b8152600401610cbc9061746c565b60005460ff16612cc15760405162461bcd60e51b8152600401610cbc90616cd2565b60003411612ce15760405162461bcd60e51b8152600401610cbc90616fd2565b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615612d1157506006545b600083118015612d215750600081115b15612dc2576000612d3e61271061101d868563ffffffff61423a16565b90508015612dc05760405161dead9082156108fc029083906000818181858888f19350505050158015612d75573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee581604051612da59190617595565b60405180910390a1612dbd848263ffffffff6141f816565b93505b505b8115612ec0576000600180840381548110612dd957fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615612e4657846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051612e399190617595565b60405180910390a2612eba565b600354612e59908563ffffffff61427416565b6003908155810154612e71908563ffffffff61427416565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590612eb1908790617595565b60405180910390a25b50612f02565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051612ef99190617595565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612f2757fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015612fd25780601f10612fa757610100808354040283529160200191612fd2565b820191906000526020600020905b815481529060010190602001808311612fb557829003601f168201915b5050505050905083565b61100481565b6000600a5460001480612ff3575081155b80612ffe5750600954155b1561300b57506000610f23565b60096000815460019003919050819055506000613056600a5461101d8561101d600b898154811061303857fe5b6000918252602090912060169091020154439063ffffffff6141f816565b90506000600b858154811061306757fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156130cc57600080fd5b505afa1580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613104919061685f565b915091506000935080831061317e5761311d8787614299565b506040516305bfb49960e41b815261100190635bfb499090613143908a9060040161699c565b600060405180830381600087803b15801561315d57600080fd5b505af1158015613171573d6000803e3d6000fd5b5050505060019350613190565b8183106131905761318e87614a6b565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b6131d66164a7565b60006131e06164a7565b6131e86164cb565b6131f96131f486614c0e565b614c33565b90506000805b61320883614c7d565b1561337c578061322d5761322361321e84614c9e565b614cec565b60ff168452613374565b806001141561336f57606061324961324485614c9e565b614d6c565b9050805160405190808252806020026020018201604052801561328657816020015b6132736164eb565b81526020019060019003908161326b5790505b50856020018190525080516040519080825280602002602001820160405280156132c457816020015b60608152602001906001900390816132af5790505b50604086015260005b8151811015613364576132de6164eb565b606060006132fe8585815181106132f157fe5b6020026020010151614e3d565b9250925092508061331e578860009a509a50505050505050505050613385565b828960200151858151811061332f57fe5b6020026020010181905250818960400151858151811061334b57fe5b60200260200101819052505050508060010190506132cd565b506001925050613374565b61337c565b6001016131ff565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816133a45790505090506133ca8363ffffffff16614f57565b816000815181106133d757fe5b6020026020010181905250610f2381614f6a565b6000602983511115613422576000805160206177d383398151915260405161341290616de5565b60405180910390a150606661143c565b60005b83518110156134c05760005b818110156134b75784818151811061344557fe5b6020026020010151600001516001600160a01b031685838151811061346657fe5b6020026020010151600001516001600160a01b031614156134af576000805160206177d383398151915260405161349c90616f40565b60405180910390a160669250505061143c565b600101613431565b50600101613425565b506060806134ce8585614ff4565b60015491935091506000908190815b818110156135535767016345785d8a0000600182815481106134fb57fe5b9060005260206000209060040201600301541061351d5783600101935061354b565b60006001828154811061352c57fe5b906000526020600020906004020160030154111561354b578260010192505b6001016134dd565b50606083604051908082528060200260200182016040528015613580578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156135af578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156135de578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561360d578160200160208202803683370190505b509050600060608760405190808252806020026020018201604052801561363e578160200160208202803683370190505b50905060608860405190808252806020026020018201604052801561366d578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156136b557600080fd5b505afa1580156136c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ed9190616847565b905067016345785d8a0000811115613738576000805160206177d383398151915260405161371a9061726a565b60405180910390a160689d505050505050505050505050505061143c565b60005b898110156139a95767016345785d8a00006001828154811061375957fe5b906000526020600020906004020160030154106138de576001818154811061377d57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d815181106137ae57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106137e357fe5b906000526020600020906004020160030154816137fc57fe5b066001838154811061380a57fe5b90600052602060002090600402016003015403905061383283826141f890919063ffffffff16565b898e8151811061383e57fe5b6020026020010181815250506001828154811061385757fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878e8151811061388857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e815181106138b557fe5b60209081029190910101526138d0868263ffffffff61427416565b95508c6001019c50506139a1565b6000600182815481106138ed57fe5b90600052602060002090600402016003015411156139a1576001818154811061391257fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c8151811061394357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061397057fe5b906000526020600020906004020160030154838c8151811061398e57fe5b6020026020010181815250508a6001019a505b60010161373b565b5060008415613c1f576002546040516303702b2960e51b815261100491636e0565209188916139e3918e918e918d91420190600401616a8e565b6020604051808303818588803b1580156139fc57600080fd5b505af193505050508015613a2d575060408051601f3d908101601f19168201909252613a2a91810190616774565b60015b613ba4576040516000815260443d1015613a4957506000613ae4565b60046000803e60005160e01c6308c379a08114613a6a576000915050613ae4565b60043d036004833e81513d60248201116001600160401b0382111715613a9557600092505050613ae4565b80830180516001600160401b03811115613ab6576000945050505050613ae4565b8060208301013d8601811115613ad457600095505050505050613ae4565b601f01601f191660405250925050505b80613aef5750613b31565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051613b239190616b13565b60405180910390a250613b9f565b3d808015613b5b576040519150601f19603f3d011682016040523d82523d6000602084013e613b60565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051613b959190616b13565b60405180910390a2505b613c1f565b8015613be6577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051613bd99190617595565b60405180910390a1613c1d565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051613c1490616bd5565b60405180910390a25b505b8015613dd55760005b8751811015613dd3576000888281518110613c3f57fe5b60200260200101519050600060018281548110613c5857fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110613c8957fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015613d455760018281548110613cca57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110613d1957fe5b906000526020600020906004020160030154604051613d389190617595565b60405180910390a2613dc9565b60018281548110613d5257fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110613da157fe5b906000526020600020906004020160030154604051613dc09190617595565b60405180910390a25b5050600101613c28565b505b835115613f1f5760005b8451811015613f1d576000858281518110613df657fe5b60200260200101516001600160a01b03166108fc868481518110613e1657fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613eac57858281518110613e4c57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613e8a57fe5b6020026020010151604051613e9f9190617595565b60405180910390a2613f14565b858281518110613eb857fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613ef657fe5b6020026020010151604051613f0b9190617595565b60405180910390a25b50600101613ddf565b505b5050505050505050505050506000471115613f9b577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d47604051613f639190617595565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015613f99573d6000803e3d6000fd5b505b60006003819055600555815115613fb657613fb6828261522d565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613ff357600080fd5b505af1158015614007573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b80516001600160a01b0316600090815260046020526040812054801580614090575060018082038154811061407057fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b156140d65782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a2600091505061138c565b60015460055460001982011180159061412c5784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000935050505061138c565b60058054600190810190915580548190600019860190811061414a57fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000610f2383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506159e7565b6000610f2383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a1e565b6000826142495750600061143c565b8282028284828161425657fe5b0414610f235760405162461bcd60e51b8152600401610cbc9061716a565b600082820183811015610f235760405162461bcd60e51b8152600401610cbc90616d09565b600080600183815481106142a957fe5b906000526020600020906004020160030154905060006001808054905003905060016142d36126d3565b5111614308576000600185815481106142e857fe5b90600052602060002090600402016003018190555060009250505061143c565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516143419190617595565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561452e576001816001018154811061438257fe5b90600052602060002090600402016001828154811061439d57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061445e57fe5b9060005260206000209060160201600b828154811061447957fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff19909216919091179055600280840180546144d0938386019390821615610100026000190190911604616520565b506144e360038281019084016013616595565b509050508060010160046000600184815481106144fc57fe5b600091825260208083206004909202909101546001600160a01b03168352820192909252604001902055600101614364565b50600180548061453a57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061458d57fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906145bf60028301826165bf565b6145cd600383016000616603565b5050905560008183816145dc57fe5b04905080156146405760015460005b8181101561463d57826001828154811061460157fe5b906000526020600020906004020160030154016001828154811061462157fe5b60009182526020909120600360049092020101556001016145eb565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561468b57816020015b60608152602001906001900390816146765790505b50600b5490915083146146a257925061138c915050565b60005b828110156147b157600b6001600460008985815181106146c157fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403815481106146f557fe5b600091825260209182902060026016909202018101805460408051601f60001961010060018616150201909316949094049182018590048502840185019052808352919290919083018282801561478d5780601f106147625761010080835404028352916020019161478d565b820191906000526020600020905b81548152906001019060200180831161477057829003601f168201915b505050505082828151811061479e57fe5b60209081029190910101526001016146a5565b50949350505050565b60005b8281101561490757600082878388016040516020016147dd92919061698e565b6040516020818303038152906040528051906020012060001c816147fd57fe5b069050808501828701146148fe576000898388018151811061481b57fe5b602002602001015190506060898489018151811061483557fe5b602002602001015190508a8388018151811061484d57fe5b60200260200101518b858a018151811061486357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061489257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505089838801815181106148c057fe5b60200260200101518a858a01815181106148d657fe5b6020026020010181905250808a848901815181106148f057fe5b602002602001018190525050505b506001016147bd565b5050505050505050565b600980546001908101909155600b80548390811061492b57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061496157fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016149bc9190616972565b60405160208183030381529060405280519060200120836040516020016149e39190616972565b6040516020818303038152906040528051906020012014905092915050565b015190565b815181516000916001918114808314614a235760009250614a61565b600160208701838101602088015b600284838510011415614a5c578051835114614a505760009650600093505b60209283019201614a31565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614a945750600019905061138c565b600181039050600060018281548110614aa957fe5b9060005260206000209060040201600301549050600060018381548110614acc57fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614b25908590617595565b60405180910390a280614b3d5782935050505061138c565b6000818381614b4857fe5b0490508015614c045760005b84811015614ba6578160018281548110614b6a57fe5b9060005260206000209060040201600301540160018281548110614b8a57fe5b6000918252602090912060036004909202010155600101614b54565b50600180549085015b81811015614c01578260018281548110614bc557fe5b9060005260206000209060040201600301540160018281548110614be557fe5b6000918252602090912060036004909202010155600101614baf565b50505b5091949350505050565b614c16616612565b506040805180820190915281518152602082810190820152919050565b614c3b6164cb565b614c4482615a4a565b614c4d57600080fd5b6000614c5c8360200151615a84565b60208085015160408051808201909152868152920190820152915050919050565b6000614c87616612565b505080518051602091820151919092015191011190565b614ca6616612565b614caf82614c7d565b614cb857600080fd5b60208201516000614cc882615ae7565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590614d0157508151602110155b614d0a57600080fd5b6000614d198360200151615a84565b90508083600001511015614d3f5760405162461bcd60e51b8152600401610cbc90617328565b8251602080850151830180519284900392918310156147b157506020919091036101000a90049392505050565b6060614d7782615a4a565b614d8057600080fd5b6000614d8b83615bc8565b9050606081604051908082528060200260200182016040528015614dc957816020015b614db6616612565b815260200190600190039081614dae5790505b5090506000614ddb8560200151615a84565b60208601510190506000805b84811015614e3257614df883615ae7565b9150604051806040016040528083815260200184815250848281518110614e1b57fe5b602090810291909101015291810191600101614de7565b509195945050505050565b614e456164eb565b60606000614e516164eb565b6060614e5b6164cb565b614e6487614c33565b90506000805b614e7383614c7d565b15614f485780614e9e57614e8e614e8984614c9e565b615c24565b6001600160a01b03168552614f40565b8060011415614ec657614eb3614e8984614c9e565b6001600160a01b03166020860152614f40565b8060021415614eee57614edb614e8984614c9e565b6001600160a01b03166040860152614f40565b8060031415614f1a57614f0361321e84614c9e565b6001600160401b0316606086015260019150614f40565b8060041415614f3b57614f34614f2f84614c9e565b615c3e565b9350614f40565b614f48565b600101614e6a565b50929791965091945092505050565b606061143c614f6583615cae565b615d94565b6060815160001415614f8b575060408051600081526020810190915261138c565b606082600081518110614f9a57fe5b602002602001015190506000600190505b8351811015614fdb57614fd182858381518110614fc457fe5b6020026020010151615de6565b9150600101614fab565b50610f23614fee825160c060ff16615e63565b82615de6565b6060806000808080806150056127dc565b6001549091505b801561511357600181039250600b838154811061502557fe5b600091825260209091206001601690920201015460ff166150455761510a565b6001838154811061505257fe5b60009182526020909120600490910201546001600160a01b03169450615079858484612fe2565b935083158061508c575060018a51038610155b156150965761510a565b60005b8a5181101561510857856001600160a01b03168b82815181106150b857fe5b6020026020010151600001516001600160a01b031614156151005760018b82815181106150e157fe5b6020908102919091010151901515608090910152600190960195615108565b600101615099565b505b6000190161500c565b508489510360405190808252806020026020018201604052801561515157816020015b61513e6164eb565b8152602001906001900390816151365790505b5096508489510360405190808252806020026020018201604052801561518b57816020015b60608152602001906001900390816151765790505b5095506000915060005b895181101561521f578981815181106151aa57fe5b602002602001015160800151615217578981815181106151c657fe5b60200260200101518884815181106151da57fe5b60200260200101819052508881815181106151f157fe5b602002602001015187848151811061520557fe5b60200260200101819052508260010192505b600101615195565b5050505050505b9250929050565b600154825160005b8281101561534a5760016152476164eb565b6001838154811061525457fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b8481101561531e578781815181106152e457fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615316576000925061531e565b6001016152d0565b5081156153405780516001600160a01b03166000908152600460205260408120555b5050600101615235565b508082111561540957805b8281101561540757600180548061536857fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806153bb57fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906153ed60028301826165bf565b6153fb600383016000616603565b50509055600101615355565b505b6000818310615418578161541a565b825b905060005b81811015615789576154cc86828151811061543657fe5b60200260200101516001838154811061544b57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152615f35565b6156805780600101600460008884815181106154e457fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061552057fe5b60200260200101516001828154811061553557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106155f057fe5b6020026020010151600b828154811061560557fe5b90600052602060002090601602016002019080519060200190615629929190616400565b506000600b828154811061563957fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061566a57fe5b6000918252602090912060169091020155615781565b61571185828151811061568f57fe5b6020026020010151600b83815481106156a457fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612ad45780601f10612aa957610100808354040283529160200191612ad4565b61575c5784818151811061572157fe5b6020026020010151600b828154811061573657fe5b9060005260206000209060160201600201908051906020019061575a929190616400565b505b60006001828154811061576b57fe5b9060005260206000209060040201600301819055505b60010161541f565b50828211156159615761579a6163d1565b835b8381101561595e578581815181106157b057fe5b6020026020010151826040018190525060018782815181106157ce57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b80549283018155909352845160169091026000805160206177f38339815191528101918255858301516000805160206178338339815191528201805491151560ff19909216919091179055928501518051869492936159049360008051602061781383398151915201920190616400565b50606082015161591a906003830190601361647a565b505050806001016004600089848151811061593157fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161579c565b50505b615969615fb6565b615971616198565b6000600981905560015493505b838110156159df576000600b828154811061599557fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106159c657fe5b600091825260209091206016909102015560010161597e565b505050505050565b60008183615a085760405162461bcd60e51b8152600401610cbc9190616b13565b506000838581615a1457fe5b0495945050505050565b60008184841115615a425760405162461bcd60e51b8152600401610cbc9190616b13565b505050900390565b8051600090615a5b5750600061138c565b6020820151805160001a9060c0821015615a7a5760009250505061138c565b5060019392505050565b8051600090811a6080811015615a9e57600091505061138c565b60b8811080615ab9575060c08110801590615ab9575060f881105b15615ac857600191505061138c565b60c0811015615adc5760b51901905061138c565b60f51901905061138c565b80516000908190811a6080811015615b025760019150615bc1565b60b8811015615b1757607e1981019150615bc1565b60c0811015615b6857600060b78203600186019550806020036101000a865104915060018101820193505080831015615b625760405162461bcd60e51b8152600401610cbc906170b7565b50615bc1565b60f8811015615b7d5760be1981019150615bc1565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615bbf5760405162461bcd60e51b8152600401610cbc906170b7565b505b5092915050565b8051600090615bd95750600061138c565b60008090506000615bed8460200151615a84565b602085015185519181019250015b80821015615c1b57615c0c82615ae7565b82019150826001019250615bfb565b50909392505050565b8051600090601514615c3557600080fd5b61143c82614cec565b8051606090615c4c57600080fd5b6000615c5b8360200151615a84565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615c92576020820181803683370190505b50905060008160200190506147b1848760200151018285616386565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615cf257506018615d16565b6fffffffffffffffffffffffffffffffff198416615d1257506010615d16565b5060005b6020811015615d4c57818181518110615d2b57fe5b01602001516001600160f81b03191615615d4457615d4c565b600101615d16565b60008160200390506060816040519080825280601f01601f191660200182016040528015615d81576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015615dc65750607f60f81b82600081518110615db457fe5b01602001516001600160f81b03191611155b15615dd257508061138c565b61143c615de48351608060ff16615e63565b835b6060806040519050835180825260208201818101602087015b81831015615e17578051835260209283019201615dff565b50855184518101855292509050808201602086015b81831015615e44578051835260209283019201615e2c565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310615e8d5760405162461bcd60e51b8152600401610cbc90616ebb565b60408051600180825281830190925260609160208201818036833701905050905060378411615ee75782840160f81b81600081518110615ec957fe5b60200101906001600160f81b031916908160001a905350905061143c565b6060615ef285615cae565b90508381510160370160f81b82600081518110615f0b57fe5b60200101906001600160f81b031916908160001a905350615f2c8282615de6565b95945050505050565b805182516000916001600160a01b039182169116148015615f6f575081602001516001600160a01b031683602001516001600160a01b0316145b8015615f94575081604001516001600160a01b031683604001516001600160a01b0316145b8015610f235750506060908101519101516001600160401b0390811691161490565b6012546013548082111561600157805b82811015615fff576012805480615fd957fe5b600190038181906000526020600020016000615ff591906165bf565b9055600101615fc6565b505b60008183106160105781616012565b825b905060005b8181101561612a576160cf6012828154811061602f57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156160bd5780601f10616092576101008083540402835291602001916160bd565b820191906000526020600020905b8154815290600101906020018083116160a057829003601f168201915b505050505060138381548110612a4657fe5b61612257601381815481106160e057fe5b90600052602060002001601282815481106160f757fe5b906000526020600020019080546001816001161561010002031660029004616120929190616520565b505b600101616017565b5082821115610cdc57825b82811015612f025760126013828154811061614c57fe5b600091825260208083208454600181810187559585529190932092909101805461618f949390920192909160026101009282161592909202600019011604616520565b50600101616135565b601354600b54808211156161e357805b828110156161e15760138054806161bb57fe5b6001900381819060005260206000200160006161d791906165bf565b90556001016161a8565b505b60008183106161f257816161f4565b825b905060005b81811015616313576162b16013828154811061621157fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561629f5780601f106162745761010080835404028352916020019161629f565b820191906000526020600020905b81548152906001019060200180831161628257829003601f168201915b5050505050600b83815481106156a457fe5b61630b57600b81815481106162c257fe5b9060005260206000209060160201600201601382815481106162e057fe5b906000526020600020019080546001816001161561010002031660029004616309929190616520565b505b6001016161f9565b5082821115610cdc57825b82811015612f02576013600b828154811061633557fe5b60009182526020808320845460018082018755958552919093206016929092029092016002908101805461637d95939094019390926000199082161561010002011604616520565b5060010161631e565b8061639057610cdc565b5b602081106163b0578251825260209283019290910190601f1901616391565b915181516020939093036101000a6000190180199091169216919091179052565b604051806080016040528060008152602001600015158152602001606081526020016163fb61662c565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061644157805160ff191683800117855561646e565b8280016001018555821561646e579182015b8281111561646e578251825591602001919060010190616453565b5061281792915061664b565b826013810192821561646e579160200282018281111561646e578251825591602001919060010190616453565b6040518060600160405280600060ff16815260200160608152602001606081525090565b60405180604001604052806164de616612565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10616559578054855561646e565b8280016001018555821561646e57600052602060002091601f016020900482015b8281111561646e57825482559160010191906001019061657a565b826013810192821561646e579182018281111561646e57825482559160010191906001019061657a565b50805460018160011615610100020316600290046000825580601f106165e55750611598565b601f016020900490600052602060002090810190611598919061664b565b5061159890601381019061664b565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b6127bc91905b808211156128175760008155600101616651565b60008083601f840112616676578182fd5b5081356001600160401b0381111561668c578182fd5b602083019150836020808302850101111561522657600080fd5b60008083601f8401126166b7578182fd5b5081356001600160401b038111156166cd578182fd5b60208301915083602082850101111561522657600080fd5b6000602082840312156166f6578081fd5b81356001600160a01b0381168114610f23578182fd5b60008060008060408587031215616721578283fd5b84356001600160401b0380821115616737578485fd5b61674388838901616665565b9096509450602087013591508082111561675b578384fd5b5061676887828801616665565b95989497509550505050565b600060208284031215616785578081fd5b81518015158114610f23578182fd5b600080602083850312156167a6578182fd5b82356001600160401b038111156167bb578283fd5b6167c7858286016166a6565b90969095509350505050565b600080600080604085870312156167e8578384fd5b84356001600160401b03808211156167fe578586fd5b61680a888389016166a6565b90965094506020870135915080821115616822578384fd5b50616768878288016166a6565b600060208284031215616840578081fd5b5035919050565b600060208284031215616858578081fd5b5051919050565b60008060408385031215616871578182fd5b505080516020909101519092909150565b600080600060408486031215616896578283fd5b833560ff811681146168a6578384fd5b925060208401356001600160401b038111156168c0578283fd5b6168cc868287016166a6565b9497909650939450505050565b6000815180845260208085019450808401835b838110156169115781516001600160a01b0316875295820195908201906001016168ec565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000815180845261695e8160208601602086016175fb565b601f01601f19169290920160200192915050565b600082516169848184602087016175fb565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b600060208252610f2360208301846168d9565b600060408252616a3160408301856168d9565b602083820381850152818551808452828401915082838202850101838801865b83811015616a7f57601f19878403018552616a6d838351616946565b94860194925090850190600101616a51565b50909998505050505050505050565b600060808252616aa160808301876168d9565b828103602084810191909152865180835287820192820190845b81811015616ad757845183529383019391830191600101616abb565b50508481036040860152616aeb81886168d9565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b600060208252610f236020830184616946565b600060408252616b3a60408301868861691c565b8281036020840152616b4d81858761691c565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252602b908201527f746865206275726e526174696f206d757374206265206e6f206772656174657260408201526a0207468616e2031303030360ac1b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b60208082526027908201527f7468652066696e616c697479526577617264526174696f206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662066696e616c697479526577617264526174696f206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152615f2c6060830184616946565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152615f2c60408301848661691c565b60005b838110156176165781810151838201526020016175fe565b83811115612f02575050600091015256fef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a7841000000070e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaa26469706673582212206e1523e3ea49e964e21e7d6e66bb4cfe1d540a17ea2d2be68ff39a6a76e3e24b64736f6c63430006040033", + }, + { + ContractAddr: common.HexToAddress(SlashContract), + CommitUrl: "https://github.com/bnb-chain/bsc-genesis-contract/commit/ff8df0741e8f7e9b2c85c2a3b7b2426ad2ba1fad", + Code: "608060405234801561001057600080fd5b506004361061027f5760003560e01c80637942fd051161015c578063c80d4b8f116100ce578063dc927faf11610087578063dc927faf146104ad578063e1c7392a146104b5578063f9a2bbc7146104bd578063fc3e5908146104c5578063fc4333cd146104cd578063fd6a6879146104d55761027f565b8063c80d4b8f1461045c578063c81b166214610464578063c8509d811461046c578063c96be4cb1461047f578063cc844b7314610492578063d2a42e4b146104a55761027f565b80639dc09262116101205780639dc0926214610421578063a1a11bf514610429578063a78abc1614610431578063ab51bb9614610439578063ac0af62914610441578063ac431751146104495761027f565b80637942fd05146103ee5780638256ace6146103f6578063831d65d1146103fe57806396713da9146104115780639bc8e4f2146104195761027f565b8063493279b1116101f557806362b72cf5116101b957806362b72cf5146103be5780636e47b482146103c657806370fd5bad146103ce578063718a8aa8146103d657806375d47a0a146103de5780637912a65d146103e65761027f565b8063493279b11461037c5780634bf6c8821461039157806351e8067214610399578063567a372d146103a15780635bfb4990146103a95761027f565b806335aa2e441161024757806335aa2e441461030e57806337c8dab914610321578063389f4f71146103425780633a63f4b1146103575780633dffc3871461035f57806343756e5c146103745761027f565b80630bee7a67146102845780630e2374a5146102a25780631182b875146102b757806322d1e80b146102d757806323bac5a2146102ec575b600080fd5b61028c6104dd565b604051610299919061336a565b60405180910390f35b6102aa6104e2565b6040516102999190612c19565b6102ca6102c5366004612b4f565b6104e8565b6040516102999190612c51565b6102df61054e565b6040516102999190612c46565b6102ff6102fa3660046128fd565b610557565b60405161029993929190613352565b6102aa61031c366004612b1f565b61057a565b61033461032f3660046128fd565b6105a1565b604051610299929190613344565b61034a6105f8565b604051610299919061331a565b61034a6105fe565b610367610604565b604051610299919061337b565b6102aa610609565b61038461060f565b604051610299919061330b565b610367610615565b6102aa61061a565b61034a610620565b6103bc6103b73660046128fd565b610626565b005b61034a6106d1565b6102aa6106d7565b6103676106dd565b6103676106e2565b6102aa6106e7565b61034a6106ed565b6103676106f2565b6103346106f7565b6103bc61040c366004612b4f565b610701565b610367610813565b61034a610818565b6102aa610823565b6102aa610829565b6102df61082f565b61028c610838565b61034a61083d565b6103bc610457366004612a03565b610842565b61034a610ce1565b6102aa610ce6565b6103bc61047a366004612b4f565b610cec565b6103bc61048d3660046128fd565b610d5d565b6103bc6104a0366004612a6c565b61114e565b61034a611730565b6102aa611735565b6103bc61173b565b6102aa611777565b61036761177d565b6103bc611782565b6102aa611bcb565b606481565b61200181565b606033612000146105145760405162461bcd60e51b815260040161050b90613191565b60405180910390fd5b60005460ff166105365760405162461bcd60e51b815260040161050b90612d32565b60405162461bcd60e51b815260040161050b90613254565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061058757fe5b6000918252602090912001546001600160a01b0316905081565b6000806105ac6126e4565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b60065481565b600181565b61100181565b6102ca81565b600881565b61200081565b60045481565b33611000146106475760405162461bcd60e51b815260040161050b90612f76565b60005460ff166106695760405162461bcd60e51b815260040161050b90612d32565b61200063f7a251d7600b61067c84611bd1565b60006040518463ffffffff1660e01b815260040161069c93929190613389565b600060405180830381600087803b1580156106b657600080fd5b505af11580156106ca573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b6004546005549091565b33612000146107225760405162461bcd60e51b815260040161050b90613191565b60005460ff166107445760405162461bcd60e51b815260040161050b90612d32565b61074c612707565b600061078d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ca492505050565b9150915080156107d45781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e629967916107c79161336a565b60405180910390a16106ca565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e7916108049161336a565b60405180910390a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff166108645760405162461bcd60e51b815260040161050b90612d32565b33611007146108855760405162461bcd60e51b815260040161050b9061304e565b6108f084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611d249050565b1561098b57602081146109155760405162461bcd60e51b815260040161050b90612f02565b604080516020601f840181900481028201810190925282815260009161095391858580838501838280828437600092019190915250611d7e92505050565b905060018110158015610967575060055481105b6109835760405162461bcd60e51b815260040161050b9061314c565b600455610c9e565b6109f184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611d249050565b15610a8d5760208114610a165760405162461bcd60e51b815260040161050b9061309c565b604080516020601f8401819004810282018101909252828152600091610a5491858580838501838280828437600092019190915250611d7e92505050565b90506103e88111158015610a69575060045481115b610a855760405162461bcd60e51b815260040161050b90612da0565b600555610c9e565b610b0184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f66696e616c697479536c617368526577617264526174696f000000000000000060208201529150611d249050565b15610b9b5760208114610b265760405162461bcd60e51b815260040161050b9061328b565b604080516020601f8401819004810282018101909252828152600091610b6491858580838501838280828437600092019190915250611d7e92505050565b9050600a8110158015610b775750606481105b610b935760405162461bcd60e51b815260040161050b90612eb6565b600655610c9e565b610c0f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c617368000000000000000060208201529150611d249050565b15610c865760208114610c345760405162461bcd60e51b815260040161050b90612dd5565b604080516020601f8401819004810282018101909252828152610c709190848480838501838280828437600092019190915250611d8392505050565b6007805460ff1916911515919091179055610c9e565b60405162461bcd60e51b815260040161050b9061322d565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051610cd39493929190612c64565b60405180910390a150505050565b609681565b61100281565b3361200014610d0d5760405162461bcd60e51b815260040161050b90613191565b60005460ff16610d2f5760405162461bcd60e51b815260040161050b90612d32565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610d7c5760405162461bcd60e51b815260040161050b906131e0565b60005460ff16610d9e5760405162461bcd60e51b815260040161050b90612d32565b6003544311610dbf5760405162461bcd60e51b815260040161050b906132d6565b3a15610ddd5760405162461bcd60e51b815260040161050b90612ff1565b60405163155853f360e21b8152611000906355614fcc90610e02908490600401612c19565b60206040518083038186803b158015610e1a57600080fd5b505afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5291906129e3565b610e5b57611147565b610e636126e4565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610ebe576020810180516001019052610f17565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b438152600554602082015181610f2957fe5b0661107557600060208201526040516335409f7f60e01b8152611000906335409f7f90610f5a908590600401612c19565b600060405180830381600087803b158015610f7457600080fd5b505af1158015610f88573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610fa885611bd1565b60006040518463ffffffff1660e01b8152600401610fc893929190613389565b600060405180830381600087803b158015610fe257600080fd5b505af1925050508015610ff3575060015b611070573d808015611021576040519150601f19603f3d011682016040523d82523d6000602084013e611026565b606091505b50826001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c836020015183604051611066929190613323565b60405180910390a2505b6110e1565b60045481602001518161108457fe5b066110e1576040516375abf10160e11b81526110009063eb57e202906110ae908590600401612c19565b600060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166111705760405162461bcd60e51b815260040161050b90612d32565b604051630a83aaa960e31b81526110069063541d554890611195903390600401612c19565b60206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e591906129e3565b6112015760405162461bcd60e51b815260040161050b90612c96565b60075460ff166112235760405162461bcd60e51b815260040161050b90612cfd565b6006546112305760146006555b8051514361010090910111801561125257504381602001516000015161010001115b61126e5760405162461bcd60e51b815260040161050b90612ccd565b80602001516020015181600001516020015114801561129c5750806020015160600151816000015160600151145b156112b95760405162461bcd60e51b815260040161050b90612f49565b8051604081015190511080156112d85750602081015160408101519051105b6112f45760405162461bcd60e51b815260040161050b90612e7f565b6020810151518151511080156113195750806000015160400151816020015160400151105b8061134457508051516020820151511080156113445750806020015160400151816000015160400151105b8061135e5750806020015160400151816000015160400151145b61137a5760405162461bcd60e51b815260040161050b90612d69565b604080820151905163ea321e4960e01b81526110009163ea321e49916113a39190600401612c51565b60206040518083038186803b1580156113bb57600080fd5b505afa1580156113cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f391906129e3565b61140f5760405162461bcd60e51b815260040161050b9061301f565b61142181600001518260400151611dab565b801561143a575061143a81602001518260400151611dab565b6114565760405162461bcd60e51b815260040161050b90612e20565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561149457600080fd5b505afa1580156114a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114d09190810190612920565b9150915060005b815181101561160d576115018282815181106114ef57fe5b60200260200101518560400151611f83565b15611605576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906115399033908590600401612c2d565b602060405180830381600087803b15801561155357600080fd5b505af1158015611567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158b9190612b37565b506110006001600160a01b03166335409f7f8584815181106115a957fe5b60200260200101516040518263ffffffff1660e01b81526004016115cd9190612c19565b600060405180830381600087803b1580156115e757600080fd5b505af11580156115fb573d6000803e3d6000fd5b505050505061160d565b6001016114d7565b50600061161f84604001516000611fe7565b90506120006001600160a01b031663f7a251d7600b6116418760400151612003565b60006040518463ffffffff1660e01b815260040161166193929190613389565b600060405180830381600087803b15801561167b57600080fd5b505af192505050801561168c575060015b6116fe573d8080156116ba576040519150601f19603f3d011682016040523d82523d6000602084013e6116bf565b606091505b50817fd58d1183100bd0932c0588f31c4205d6bc6168909765a96c41adbed3115f3628826040516116f09190612c51565b60405180910390a25061172a565b60405181907f7b78aadacff901d8b63d0dba4f86283d4db8aef27f9ed70413dd860f1c9532b690600090a25b50505050565b601481565b61100381565b60005460ff161561175e5760405162461bcd60e51b815260040161050b906130de565b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146117a35760405162461bcd60e51b815260040161050b90612f76565b60005460ff166117c55760405162461bcd60e51b815260040161050b90612d32565b6001546117d157611bc9565b600154600090600019015b808211611b9d576000805b82841015611900576117f76126e4565b600260006001878154811061180857fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156118ea5760046005548161187557fe5b0481602001510381602001818152505080600260006001888154811061189757fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff19169115159190911790556118f4565b6001925050611900565b508360010193506117e7565b828411611a975761190f6126e4565b600260006001868154811061192057fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611a085760046005548161198d57fe5b048160200151038160200181815250508060026000600187815481106119af57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611a979050565b6002600060018681548110611a1957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611a5d57fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611a8a5750611a97565b5060001990920191611900565b818015611aa15750805b15611b80576002600060018681548110611ab757fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611afe57fe5b600091825260209091200154600180546001600160a01b039092169186908110611b2457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611b5d57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611b8c575050611b9d565b5050600190910190600019016117dc565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611bec579050509050611c15836001600160a01b031661203e565b81600081518110611c2257fe5b6020026020010181905250611c3643612061565b81600181518110611c4357fe5b6020908102919091010152611c596102ca612061565b81600281518110611c6657fe5b6020026020010181905250611c7a42612061565b81600381518110611c8757fe5b6020026020010181905250611c9b81612074565b9150505b919050565b611cac612707565b6000611cb6612707565b611cbe612719565b611ccf611cca866120fe565b612123565b90506000805b611cde8361216d565b15611d175780611d0a57611cf9611cf48461218e565b6121dc565b63ffffffff16845260019150611d0f565b611d17565b600101611cd5565b5091935090915050915091565b600081604051602001611d379190612bfd565b6040516020818303038152906040528051906020012083604051602001611d5e9190612bfd565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615611d9d576001915081611da3565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b6060815260200190600190039081611dc7575050604080516020808252818301909252919250606091908082018180368337019050509050611e0c8560000151612061565b82600081518110611e1957fe5b6020026020010181905250611e34602086602001518361225e565b611e3d8161226e565b82600181518110611e4a57fe5b6020026020010181905250611e628560400151612061565b82600281518110611e6f57fe5b6020026020010181905250611e8a602086606001518361225e565b611e938161226e565b82600381518110611ea057fe5b6020026020010181905250611ec66020611eb984612074565b805190602001208361225e565b6040805160b080825260e08201909252606091602082018180368337019050509050611ef68183600060206122c4565b611f08818760800151602060606122c4565b611f168186608060306122c4565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa611f5357600080fd5b506001611f61826000612317565b60ff1614611f76576000945050505050611d78565b5060019695505050505050565b815181516000916001918114808314611f9f5760009250611fdd565b600160208701838101602088015b600284838510011415611fd8578051835114611fcc5760009650600093505b60209283019201611fad565b505050505b5090949350505050565b60008160200183511015611ffa57600080fd5b50016020015190565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161201e579050509050611c158361226e565b60408051600560a21b8318601482015260348101909152606090611c9b8161226e565b6060611d7861206f83612333565b61226e565b60608151600014156120955750604080516000815260208101909152611c9f565b6060826000815181106120a457fe5b602002602001015190506000600190505b83518110156120e5576120db828583815181106120ce57fe5b6020026020010151612419565b91506001016120b5565b50611c9b6120f8825160c060ff16612496565b82612419565b612106612739565b506040805180820190915281518152602082810190820152919050565b61212b612719565b61213482612568565b61213d57600080fd5b600061214c83602001516125a2565b60208085015160408051808201909152868152920190820152915050919050565b6000612177612739565b505080518051602091820151919092015191011190565b612196612739565b61219f8261216d565b6121a857600080fd5b602082015160006121b882612605565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906121f157508151602110155b6121fa57600080fd5b600061220983602001516125a2565b9050808360000151101561222f5760405162461bcd60e51b815260040161050b90613115565b82516020808501518301805192849003929183101561225557826020036101000a820491505b50949350505050565b9091018181526020918201910152565b6060815160011480156122a05750607f60f81b8260008151811061228e57fe5b01602001516001600160f81b03191611155b156122ac575080611c9f565b611d786122be8351608060ff16612496565b83612419565b60005b818110156106ca578381815181106122db57fe5b602001015160f81c60f81b8584806001019550815181106122f857fe5b60200101906001600160f81b031916908160001a9053506001016122c7565b6000816001018351101561232a57600080fd5b50016001015190565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166123775750601861239b565b6fffffffffffffffffffffffffffffffff1984166123975750601061239b565b5060005b60208110156123d1578181815181106123b057fe5b01602001516001600160f81b031916156123c9576123d1565b60010161239b565b60008160200390506060816040519080825280601f01601f191660200182016040528015612406576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561244a578051835260209283019201612432565b50855184518101855292509050808201602086015b8183101561247757805183526020928301920161245f565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106124c05760405162461bcd60e51b815260040161050b90612e57565b6040805160018082528183019092526060916020820181803683370190505090506037841161251a5782840160f81b816000815181106124fc57fe5b60200101906001600160f81b031916908160001a9053509050611d78565b606061252585612333565b90508381510160370160f81b8260008151811061253e57fe5b60200101906001600160f81b031916908160001a90535061255f8282612419565b95945050505050565b805160009061257957506000611c9f565b6020820151805160001a9060c082101561259857600092505050611c9f565b5060019392505050565b8051600090811a60808110156125bc576000915050611c9f565b60b88110806125d7575060c081108015906125d7575060f881105b156125e6576001915050611c9f565b60c08110156125fa5760b519019050611c9f565b60f519019050611c9f565b80516000908190811a608081101561262057600191506126dd565b60b881101561263557607e19810191506126dd565b60c081101561268657600060b78203600186019550806020036101000a8651049150600181018201935050808310156126805760405162461bcd60e51b815260040161050b90612fc6565b506126dd565b60f881101561269b5760be19810191506126dd565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611da35760405162461bcd60e51b815260040161050b90612fc6565b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061272c612739565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f830112612763578081fd5b8151612776612771826133dc565b6133b5565b818152915060208083019084810160005b848110156127ec578151870188603f8201126127a257600080fd5b838101516127b2612771826133fc565b81815260408b818486010111156127c857600080fd5b6127d783888401838701613420565b50865250509282019290820190600101612787565b505050505092915050565b60008083601f840112612808578182fd5b50813567ffffffffffffffff81111561281f578182fd5b60208301915083602082850101111561283757600080fd5b9250929050565b600082601f83011261284e578081fd5b813561285c612771826133fc565b915080825283602082850101111561287357600080fd5b8060208401602084013760009082016020015292915050565b600060a0828403121561289d578081fd5b6128a760a06133b5565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156128e557600080fd5b6128f18482850161283e565b60808301525092915050565b60006020828403121561290e578081fd5b81356129198161344c565b9392505050565b60008060408385031215612932578081fd5b825167ffffffffffffffff80821115612949578283fd5b81850186601f82011261295a578384fd5b8051925061296a612771846133dc565b80848252602080830192508084018a82838902870101111561298a578788fd5b8794505b868510156129b55780516129a18161344c565b84526001949094019392810192810161298e565b5088015190965093505050808211156129cc578283fd5b506129d985828601612753565b9150509250929050565b6000602082840312156129f4578081fd5b81518015158114612919578182fd5b60008060008060408587031215612a18578182fd5b843567ffffffffffffffff80821115612a2f578384fd5b612a3b888389016127f7565b90965094506020870135915080821115612a53578384fd5b50612a60878288016127f7565b95989497509550505050565b600060208284031215612a7d578081fd5b813567ffffffffffffffff80821115612a94578283fd5b81840160608187031215612aa6578384fd5b612ab060606133b5565b9250803582811115612ac0578485fd5b612acc8782840161288c565b845250602081013582811115612ae0578485fd5b612aec8782840161288c565b602085015250604081013582811115612b03578485fd5b612b0f8782840161283e565b6040850152509195945050505050565b600060208284031215612b30578081fd5b5035919050565b600060208284031215612b48578081fd5b5051919050565b600080600060408486031215612b63578283fd5b833560ff81168114612b73578384fd5b9250602084013567ffffffffffffffff811115612b8e578283fd5b612b9a868287016127f7565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612be9816020860160208601613420565b601f01601f19169290920160200192915050565b60008251612c0f818460208701613420565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526129196020830184612bd1565b600060408252612c78604083018688612ba7565b8281036020840152612c8b818587612ba7565b979650505050505050565b6020808252601f908201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604082015260600190565b6020808252601690820152751d1bdbc81bdb1908189b1bd8dac81a5b9d9bdb1d995960521b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b6020808252602c908201527f7468652066696e616c69747920736c6173682072657761726420726174696f2060408201526b6f7574206f662072616e676560a01b606082015260800190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252602b908201527f6c656e677468206f662066696e616c697479536c61736852657761726452617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b60008382526040602083015261333c6040830184612bd1565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff85168252606060208301526133a56060830185612bd1565b9050826040830152949350505050565b60405181810167ffffffffffffffff811182821017156133d457600080fd5b604052919050565b600067ffffffffffffffff8211156133f2578081fd5b5060209081020190565b600067ffffffffffffffff821115613412578081fd5b50601f01601f191660200190565b60005b8381101561343b578181015183820152602001613423565b8381111561172a5750506000910152565b6001600160a01b038116811461346157600080fd5b5056fea2646970667358221220226652726efa038b3d2fe6d50705e0a212fdac1cf7c8e28661c6ab097ba0f90564736f6c63430006040033", + }, + }, + } } func UpgradeBuildInSystemContract(config *params.ChainConfig, blockNumber *big.Int, statedb *state.StateDB) { @@ -701,6 +751,10 @@ func UpgradeBuildInSystemContract(config *params.ChainConfig, blockNumber *big.I applySystemContractUpgrade(lubanUpgrade[network], blockNumber, statedb, logger) } + if config.IsOnPlato(blockNumber) { + applySystemContractUpgrade(platoUpgrade[network], blockNumber, statedb, logger) + } + /* apply other upgrades */ diff --git a/core/types/vote.go b/core/types/vote.go index e631b7294d..ce8ab9a0eb 100644 --- a/core/types/vote.go +++ b/core/types/vote.go @@ -4,7 +4,7 @@ import ( "sync/atomic" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/v3/crypto/bls" + "github.com/prysmaticlabs/prysm/v4/crypto/bls" "github.com/ethereum/go-ethereum/common" ) diff --git a/core/vm/contracts.go b/core/vm/contracts.go index acdf9e7cfb..3132fbd95f 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -22,7 +22,7 @@ import ( "errors" "math/big" - "github.com/prysmaticlabs/prysm/v3/crypto/bls" + "github.com/prysmaticlabs/prysm/v4/crypto/bls" "golang.org/x/crypto/ripemd160" "github.com/ethereum/go-ethereum/common" @@ -160,6 +160,25 @@ var PrecompiledContractsLuban = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{103}): &cometBFTLightBlockValidate{}, } +// PrecompiledContractsPlato contains the default set of pre-compiled Ethereum +// contracts used in the Plato release. +var PrecompiledContractsPlato = 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{}, + 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}): &cometBFTLightBlockValidate{}, +} + // PrecompiledContractsBLS contains the set of pre-compiled Ethereum // contracts specified in EIP-2537. These are exported for testing purposes. var PrecompiledContractsBLS = map[common.Address]PrecompiledContract{ @@ -175,6 +194,7 @@ var PrecompiledContractsBLS = map[common.Address]PrecompiledContract{ } var ( + PrecompiledAddressesPlato []common.Address PrecompiledAddressesLuban []common.Address PrecompiledAddressesPlanck []common.Address PrecompiledAddressesMoran []common.Address @@ -210,11 +230,16 @@ func init() { for k := range PrecompiledContractsLuban { PrecompiledAddressesLuban = append(PrecompiledAddressesLuban, k) } + for k := range PrecompiledContractsPlato { + PrecompiledAddressesPlato = append(PrecompiledAddressesPlato, k) + } } // ActivePrecompiles returns the precompiles enabled with the current configuration. func ActivePrecompiles(rules params.Rules) []common.Address { switch { + case rules.IsPlato: + return PrecompiledAddressesPlato case rules.IsLuban: return PrecompiledAddressesLuban case rules.IsPlanck: diff --git a/core/vm/contracts_lightclient.go b/core/vm/contracts_lightclient.go index 693dffbd39..5781569be8 100644 --- a/core/vm/contracts_lightclient.go +++ b/core/vm/contracts_lightclient.go @@ -183,6 +183,27 @@ func (c *iavlMerkleProofValidatePlanck) Run(input []byte) (result []byte, err er return c.basicIavlMerkleProofValidate.Run(input) } +type iavlMerkleProofValidatePlato struct { + basicIavlMerkleProofValidate +} + +func (c *iavlMerkleProofValidatePlato) RequiredGas(_ []byte) uint64 { + return params.IAVLMerkleProofValidateGas +} + +func (c *iavlMerkleProofValidatePlato) Run(input []byte) (result []byte, err error) { + c.basicIavlMerkleProofValidate.proofRuntime = v1.Ics23ProofRuntime() + c.basicIavlMerkleProofValidate.verifiers = []merkle.ProofOpVerifier{ + forbiddenAbsenceOpVerifier, + singleValueOpVerifier, + multiStoreOpVerifier, + forbiddenSimpleValueOpVerifier, + } + c.basicIavlMerkleProofValidate.keyVerifier = keyVerifier + c.basicIavlMerkleProofValidate.opsVerifier = proofOpsVerifier + return c.basicIavlMerkleProofValidate.Run(input) +} + func successfulMerkleResult() []byte { result := make([]byte, merkleProofValidateResultLength) binary.BigEndian.PutUint64(result[merkleProofValidateResultLength-uint64TypeLength:], 0x01) diff --git a/core/vm/contracts_lightclient_test.go b/core/vm/contracts_lightclient_test.go index 59cec725e9..b5c7749efd 100644 --- a/core/vm/contracts_lightclient_test.go +++ b/core/vm/contracts_lightclient_test.go @@ -153,6 +153,43 @@ func TestIcs23Proof(t *testing.T) { require.Equal(t, expectedResult, success) } +func TestIcs23ProofPlato(t *testing.T) { + appHash, err := hex.DecodeString("ae6d1123fc362b3297bfb19c9f9fabbcbd1e2555b923dead261905b8a2ff6db6") + require.NoError(t, err) + key, err := hex.DecodeString("77696e64") + require.NoError(t, err) + value, err := hex.DecodeString("626c6f7773") + require.NoError(t, err) + proofBytes, err := hex.DecodeString("0a300a0a69637332333a6961766c120477696e641a1c0a1a0a0477696e641205626c6f77731a0b0801180120012a030002040a9d010a0c69637332333a73696d706c6512036962631a87010a84010a036962631220141acb8632cfb808f293f2649cb9aabaca74fc18640900ffd0d48e2994b2a1521a090801180120012a0100222708011201011a205f0ba08283de309300409486e978a3ea59d82bccc838b07c7d39bd87c16a5034222708011201011a20455b81ef5591150bd24d3e57a769f65518b16de93487f0fab02271b3d69e2852") + require.NoError(t, err) + + merkleProofInput := make([]byte, 32+32+len(key)+32+len(value)+32+len(proofBytes)) + copy(merkleProofInput[:32], "ibc") + binary.BigEndian.PutUint64(merkleProofInput[32+24:32+32], uint64(len(key))) + copy(merkleProofInput[32+32:32+32+len(key)], key) + + binary.BigEndian.PutUint64(merkleProofInput[32+32+len(key)+24:32+32+len(key)+32], uint64(len(value))) + copy(merkleProofInput[32+32+len(key)+32:32+32+len(key)+32+len(value)], value) + + copy(merkleProofInput[32+32+len(key)+32+len(value):32+32+len(key)+32+len(value)+32], appHash) + copy(merkleProofInput[32+32+len(key)+32+len(value)+32:], proofBytes) + + totalLengthPrefix := make([]byte, 32) + binary.BigEndian.PutUint64(totalLengthPrefix[0:8], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[8:16], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[16:24], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[24:], uint64(len(merkleProofInput))) + + input := append(totalLengthPrefix, merkleProofInput...) + + validator := iavlMerkleProofValidatePlato{} + success, err := validator.Run(input) + require.NoError(t, err) + expectedResult := make([]byte, 32) + binary.BigEndian.PutUint64(expectedResult[24:], 0x01) + require.Equal(t, expectedResult, success) +} + func TestMerkleProofValidateMoran(t *testing.T) { // Bytest1 is the inputs of exploit tx 0x05356fd06ce56a9ec5b4eaf9c075abd740cae4c21eab1676440ab5cd2fe5c57a bytest1, _ := hex.DecodeString("00000000000000000000000000000000000000000000000000000000000005086962630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000100380200000000010dd9ac0000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000000000f870a0424e4200000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000008ad3c21bcecceda100000094489a8756c18c0b8b24ec2a2b9ff3d4d447f79bec94489a8756c18c0b8b24ec2a2b9ff3d4d447f79bec846553f10072cda827a83531ca0fd7ac917a6b65649719aab0836722caafe0603147a523180a8d020a066961766c3a76120e00000100380200000000010dd9ac1af201f0010aed010a2b0802100318b091c73422200c10f902d266c238a4ca9e26fa9bc36483cd3ebee4e263012f5e7f40c22ee4d20a4d0801100218b091c7342220e4fd47bffd1c06e67edad92b2bf9ca63631978676288a2aa99f95c459436ef632a20121a1f9c4eca726c725796c5375fc4158986ced08e498dc8268ef94d8ed1891612001a370a0e0000010038020000000000000002122011056c6919f02d966991c10721684a8d1542e44003f9ffb47032c18995d4ac7f18b091c7341a340a0e00000100380200000000010dd9ac12202c3a561458f8527b002b5ec3cab2d308662798d6245d4588a4e6a80ebdfe30ac18010ad4050a0a6d756c746973746f726512036962631ac005be050abb050a110a066f7261636c6512070a0508b891c7340a0f0a046d61696e12070a0508b891c7340a350a08736c617368696e6712290a2708b891c7341220c8ccf341e6e695e7e1cb0ce4bf347eea0cc16947d8b4e934ec400b57c59d6f860a380a0b61746f6d69635f7377617012290a2708b891c734122042d4ecc9468f71a70288a95d46564bfcaf2c9f811051dcc5593dbef152976b010a110a0662726964676512070a0508b891c7340a300a0364657812290a2708b891c73412201773be443c27f61075cecdc050ce22eb4990c54679089e90afdc4e0e88182a230a2f0a02736312290a2708b891c7341220df7a0484b7244f76861b1642cfb7a61d923794bd2e076c8dbd05fc4ee29f3a670a330a06746f6b656e7312290a2708b891c734122064958c2f76fec1fa5d1828296e51264c259fa264f499724795a740f48fc4731b0a320a057374616b6512290a2708b891c734122015d2c302143bdf029d58fe381cc3b54cedf77ecb8834dfc5dc3e1555d68f19ab0a330a06706172616d7312290a2708b891c734122050abddcb7c115123a5a4247613ab39e6ba935a3d4f4b9123c4fedfa0895c040a0a300a0361636312290a2708b891c734122079fb5aecc4a9b87e56231103affa5e515a1bdf3d0366490a73e087980b7f1f260a0e0a0376616c12070a0508b891c7340a300a0369626312290a2708b891c7341220e09159530585455058cf1785f411ea44230f39334e6e0f6a3c54dbf069df2b620a300a03676f7612290a2708b891c7341220db85ddd37470983b14186e975a175dfb0bf301b43de685ced0aef18d28b4e0420a320a05706169727312290a2708b891c7341220a78b556bc9e73d86b4c63ceaf146db71b12ac80e4c10dd0ce6eb09c99b0c7cfe0a360a0974696d655f6c6f636b12290a2708b891c73412204775dbe01d41cab018c21ba5c2af94720e4d7119baf693670e70a40ba2a52143") diff --git a/core/vm/evm.go b/core/vm/evm.go index 440c47fab0..ae33238105 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -20,7 +20,6 @@ import ( "math/big" "sync" "sync/atomic" - "time" "github.com/holiman/uint256" @@ -52,6 +51,8 @@ type ( func (evm *EVM) precompile(addr common.Address) (PrecompiledContract, bool) { var precompiles map[common.Address]PrecompiledContract switch { + case evm.chainRules.IsPlato: + precompiles = PrecompiledContractsPlato case evm.chainRules.IsLuban: precompiles = PrecompiledContractsLuban case evm.chainRules.IsPlanck: @@ -203,7 +204,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas if evm.Config.Debug { if evm.depth == 0 { evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value) - evm.Config.Tracer.CaptureEnd(ret, 0, 0, nil) + evm.Config.Tracer.CaptureEnd(ret, 0, nil) } else { evm.Config.Tracer.CaptureEnter(CALL, caller.Address(), addr, input, gas, value) evm.Config.Tracer.CaptureExit(ret, 0, nil) @@ -219,9 +220,9 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas if evm.Config.Debug { if evm.depth == 0 { evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value) - defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters - evm.Config.Tracer.CaptureEnd(ret, startGas-gas, time.Since(startTime), err) - }(gas, time.Now()) + defer func(startGas uint64) { // Lazy evaluation of the parameters + evm.Config.Tracer.CaptureEnd(ret, startGas-gas, err) + }(gas) } else { // Handle tracer events for entering and exiting a call frame evm.Config.Tracer.CaptureEnter(CALL, caller.Address(), addr, input, gas, value) @@ -468,8 +469,6 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, } } - start := time.Now() - ret, err := evm.interpreter.Run(contract, nil, false) // Check whether the max code size has been exceeded, assign err if the case. @@ -507,7 +506,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, if evm.Config.Debug { if evm.depth == 0 { - evm.Config.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err) + evm.Config.Tracer.CaptureEnd(ret, gas-contract.Gas, err) } else { evm.Config.Tracer.CaptureExit(ret, gas-contract.Gas, err) } diff --git a/core/vm/lightclient/v1/multistoreproof.go b/core/vm/lightclient/v1/multistoreproof.go index d071979655..742e8bcdb7 100644 --- a/core/vm/lightclient/v1/multistoreproof.go +++ b/core/vm/lightclient/v1/multistoreproof.go @@ -143,3 +143,10 @@ func Ics23CompatibleProofRuntime() (prt *merkle.ProofRuntime) { prt.RegisterOpDecoder(ProofOpSimpleMerkleCommitment, CommitmentOpDecoder) return } + +func Ics23ProofRuntime() (prt *merkle.ProofRuntime) { + prt = merkle.NewProofRuntime() + prt.RegisterOpDecoder(ProofOpIAVLCommitment, CommitmentOpDecoder) + prt.RegisterOpDecoder(ProofOpSimpleMerkleCommitment, CommitmentOpDecoder) + return +} diff --git a/core/vm/logger.go b/core/vm/logger.go index 1067947d47..8b5b81d60d 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -18,7 +18,6 @@ package vm import ( "math/big" - "time" "github.com/ethereum/go-ethereum/common" ) @@ -34,7 +33,7 @@ type EVMLogger interface { CaptureTxEnd(restGas uint64) // Top call frame CaptureStart(env *EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) - CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) + CaptureEnd(output []byte, gasUsed uint64, err error) // Rest of call frames CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) CaptureExit(output []byte, gasUsed uint64, err error) diff --git a/core/vote/vote_journal.go b/core/vote/vote_journal.go index c11c754e36..2b8cc19218 100644 --- a/core/vote/vote_journal.go +++ b/core/vote/vote_journal.go @@ -24,7 +24,7 @@ type VoteJournal struct { voteDataBuffer *lru.Cache } -var voteJournalError = metrics.NewRegisteredGauge("voteJournal/local", nil) +var voteJournalErrorCounter = metrics.NewRegisteredCounter("voteJournal/error", nil) func NewVoteJournal(filePath string) (*VoteJournal, error) { walLog, err := wal.Open(filePath, &wal.Options{ diff --git a/core/vote/vote_manager.go b/core/vote/vote_manager.go index fe99418e90..d7a36cac62 100644 --- a/core/vote/vote_manager.go +++ b/core/vote/vote_manager.go @@ -14,6 +14,8 @@ import ( "github.com/ethereum/go-ethereum/params" ) +var votesManagerCounter = metrics.NewRegisteredCounter("votesManager/local", nil) + // VoteManager will handle the vote produced by self. type VoteManager struct { mux *event.TypeMux @@ -138,19 +140,19 @@ func (voteManager *VoteManager) loop() { voteMessage.Data.SourceHash = sourceHash if err := voteManager.signer.SignVote(voteMessage); err != nil { - log.Error("Failed to sign vote", "err", err) - votesSigningErrorMetric(vote.TargetNumber, vote.TargetHash).Inc(1) + log.Error("Failed to sign vote", "err", err, "votedBlockNumber", voteMessage.Data.TargetNumber, "votedBlockHash", voteMessage.Data.TargetHash, "voteMessageHash", voteMessage.Hash()) + votesSigningErrorCounter.Inc(1) continue } if err := voteManager.journal.WriteVote(voteMessage); err != nil { log.Error("Failed to write vote into journal", "err", err) - voteJournalError.Inc(1) + voteJournalErrorCounter.Inc(1) continue } log.Debug("vote manager produced vote", "votedBlockNumber", voteMessage.Data.TargetNumber, "votedBlockHash", voteMessage.Data.TargetHash, "voteMessageHash", voteMessage.Hash()) voteManager.pool.PutVote(voteMessage) - votesManagerMetric(vote.TargetNumber, vote.TargetHash).Inc(1) + votesManagerCounter.Inc(1) } case <-voteManager.chainHeadSub.Err(): log.Debug("voteManager subscribed chainHead failed") @@ -217,8 +219,3 @@ func (voteManager *VoteManager) UnderRules(header *types.Header) (bool, uint64, log.Debug("All three rules check passed") return true, sourceNumber, sourceHash } - -// Metrics to monitor if voteManager worked in the expetected logic. -func votesManagerMetric(blockNumber uint64, blockHash common.Hash) metrics.Gauge { - return metrics.GetOrRegisterGauge(fmt.Sprintf("voteManager/blockNumber/%d/blockHash/%s", blockNumber, blockHash), nil) -} diff --git a/core/vote/vote_pool.go b/core/vote/vote_pool.go index 664f12f76b..28369ed07c 100644 --- a/core/vote/vote_pool.go +++ b/core/vote/vote_pool.go @@ -29,8 +29,8 @@ const ( ) var ( - localCurVotesGauge = metrics.NewRegisteredGauge("curVotes/local", nil) - localFutureVotesGauge = metrics.NewRegisteredGauge("futureVotes/local", nil) + localCurVotesCounter = metrics.NewRegisteredCounter("curVotes/local", nil) + localFutureVotesCounter = metrics.NewRegisteredCounter("futureVotes/local", nil) localReceivedVotesGauge = metrics.NewRegisteredGauge("receivedVotes/local", nil) @@ -203,9 +203,9 @@ func (pool *VotePool) putVote(m map[common.Hash]*VoteBox, votesPq *votesPriority log.Debug("VoteHash put into votepool is:", "voteHash", voteHash) if isFutureVote { - localFutureVotesGauge.Inc(1) + localFutureVotesCounter.Inc(1) } else { - localCurVotesGauge.Inc(1) + localCurVotesCounter.Inc(1) } localReceivedVotesGauge.Update(int64(pool.receivedVotes.Cardinality())) } @@ -278,8 +278,8 @@ func (pool *VotePool) transfer(blockHash common.Hash) { delete(futureVotes, blockHash) - localCurVotesGauge.Inc(int64(len(validVotes))) - localFutureVotesGauge.Dec(int64(len(voteBox.voteMessages))) + localCurVotesCounter.Inc(int64(len(validVotes))) + localFutureVotesCounter.Dec(int64(len(voteBox.voteMessages))) } // Prune old data of duplicationSet, curVotePq and curVotesMap. @@ -304,7 +304,7 @@ func (pool *VotePool) prune(latestBlockNumber uint64) { // Prune curVotes Map. delete(curVotes, blockHash) - localCurVotesGauge.Dec(int64(len(voteMessages))) + localCurVotesCounter.Dec(int64(len(voteMessages))) localReceivedVotesGauge.Update(int64(pool.receivedVotes.Cardinality())) } } diff --git a/core/vote/vote_pool_test.go b/core/vote/vote_pool_test.go index a1bcd8d232..e9daa4ef29 100644 --- a/core/vote/vote_pool_test.go +++ b/core/vote/vote_pool_test.go @@ -29,10 +29,10 @@ import ( "time" "github.com/google/uuid" - "github.com/prysmaticlabs/prysm/v3/crypto/bls" - "github.com/prysmaticlabs/prysm/v3/validator/accounts" - "github.com/prysmaticlabs/prysm/v3/validator/accounts/iface" - "github.com/prysmaticlabs/prysm/v3/validator/keymanager" + "github.com/prysmaticlabs/prysm/v4/crypto/bls" + "github.com/prysmaticlabs/prysm/v4/validator/accounts" + "github.com/prysmaticlabs/prysm/v4/validator/accounts/iface" + "github.com/prysmaticlabs/prysm/v4/validator/keymanager" keystorev4 "github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4" "github.com/ethereum/go-ethereum/common" diff --git a/core/vote/vote_signer.go b/core/vote/vote_signer.go index 1ea7c95f14..e6c8010b0b 100644 --- a/core/vote/vote_signer.go +++ b/core/vote/vote_signer.go @@ -8,13 +8,12 @@ import ( "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/v3/crypto/bls" - validatorpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1/validator-client" - "github.com/prysmaticlabs/prysm/v3/validator/accounts/iface" - "github.com/prysmaticlabs/prysm/v3/validator/accounts/wallet" - "github.com/prysmaticlabs/prysm/v3/validator/keymanager" + "github.com/prysmaticlabs/prysm/v4/crypto/bls" + validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client" + "github.com/prysmaticlabs/prysm/v4/validator/accounts/iface" + "github.com/prysmaticlabs/prysm/v4/validator/accounts/wallet" + "github.com/prysmaticlabs/prysm/v4/validator/keymanager" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" @@ -24,6 +23,8 @@ const ( voteSignerTimeout = time.Second * 5 ) +var votesSigningErrorCounter = metrics.NewRegisteredCounter("votesSigner/error", nil) + type VoteSigner struct { km *keymanager.IKeymanager pubKey [48]byte @@ -103,8 +104,3 @@ func (signer *VoteSigner) SignVote(vote *types.VoteEnvelope) error { copy(vote.Signature[:], signature.Marshal()[:]) return nil } - -// Metrics to indicate if there's any failed signing. -func votesSigningErrorMetric(blockNumber uint64, blockHash common.Hash) metrics.Gauge { - return metrics.GetOrRegisterGauge(fmt.Sprintf("voteSigning/blockNumber/%d/blockHash/%s", blockNumber, blockHash), nil) -} diff --git a/eth/backend.go b/eth/backend.go index 3dccb96f3f..a8e9aa2037 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -633,6 +633,7 @@ func (s *Ethereum) Protocols() []p2p.Protocol { // Start implements node.Lifecycle, starting all internal goroutines needed by the // Ethereum protocol implementation. func (s *Ethereum) Start() error { + eth.StartENRFilter(s.blockchain, s.p2pServer) eth.StartENRUpdater(s.blockchain, s.p2pServer.LocalNode()) // Start the bloom bits servicing goroutines diff --git a/eth/handler_bsc.go b/eth/handler_bsc.go index fcb39ed1ab..195691989b 100644 --- a/eth/handler_bsc.go +++ b/eth/handler_bsc.go @@ -27,6 +27,7 @@ func (h *bscHandler) RunPeer(peer *bsc.Peer, hand bsc.Handler) error { ps.lock.Lock() if wait, ok := ps.bscWait[id]; ok { delete(ps.bscWait, id) + peer.Log().Error("Bsc extension Handshake failed", "err", err) wait <- nil } ps.lock.Unlock() diff --git a/eth/protocols/eth/discovery.go b/eth/protocols/eth/discovery.go index 025479b423..e8aeb2e1cd 100644 --- a/eth/protocols/eth/discovery.go +++ b/eth/protocols/eth/discovery.go @@ -19,6 +19,7 @@ package eth import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/rlp" ) @@ -57,6 +58,11 @@ func StartENRUpdater(chain *core.BlockChain, ln *enode.LocalNode) { }() } +func StartENRFilter(chain *core.BlockChain, p2p *p2p.Server) { + forkFilter := forkid.NewFilter(chain) + p2p.SetFilter(forkFilter) +} + // currentENREntry constructs an `eth` ENR entry based on the current state of the chain. func currentENREntry(chain *core.BlockChain) *enrEntry { return &enrEntry{ diff --git a/eth/protocols/snap/handler.go b/eth/protocols/snap/handler.go index 314776dffe..23638ef888 100644 --- a/eth/protocols/snap/handler.go +++ b/eth/protocols/snap/handler.go @@ -404,13 +404,15 @@ func ServiceGetStorageRangesQuery(chain *core.BlockChain, req *GetStorageRangesP break } } - slots = append(slots, storage) + if len(storage) > 0 { + slots = append(slots, storage) + } it.Release() // Generate the Merkle proofs for the first and last storage slot, but // only if the response was capped. If the entire storage trie included // in the response, no need for any proofs. - if origin != (common.Hash{}) || abort { + if origin != (common.Hash{}) || (abort && len(storage) > 0) { // Request started at a non-zero hash or was capped prematurely, add // the endpoint Merkle proofs accTrie, err := trie.New(req.Root, chain.StateCache().TrieDB()) diff --git a/eth/protocols/snap/sync_test.go b/eth/protocols/snap/sync_test.go index 1dfba03c86..8e33364c33 100644 --- a/eth/protocols/snap/sync_test.go +++ b/eth/protocols/snap/sync_test.go @@ -334,13 +334,14 @@ func createStorageRequestResponse(t *testPeer, root common.Hash, accounts []comm break } } - hashes = append(hashes, keys) - slots = append(slots, vals) - + if len(keys) > 0 { + hashes = append(hashes, keys) + slots = append(slots, vals) + } // Generate the Merkle proofs for the first and last storage slot, but // only if the response was capped. If the entire storage trie included // in the response, no need for any proofs. - if originHash != (common.Hash{}) || abort { + if originHash != (common.Hash{}) || (abort && len(keys) > 0) { // If we're aborting, we need to prove the first and last item // This terminates the response (and thus the loop) proof := light.NewNodeSet() diff --git a/eth/tracers/js/goja.go b/eth/tracers/js/goja.go index e91e222a67..2af81a83c8 100644 --- a/eth/tracers/js/goja.go +++ b/eth/tracers/js/goja.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "math/big" - "time" "github.com/dop251/goja" @@ -278,9 +277,8 @@ func (t *jsTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope } // CaptureEnd is called after the call finishes to finalize the tracing. -func (t *jsTracer) CaptureEnd(output []byte, gasUsed uint64, duration time.Duration, err error) { +func (t *jsTracer) CaptureEnd(output []byte, gasUsed uint64, err error) { t.ctx["output"] = t.vm.ToValue(output) - t.ctx["time"] = t.vm.ToValue(duration.String()) t.ctx["gasUsed"] = t.vm.ToValue(gasUsed) if err != nil { t.ctx["error"] = t.vm.ToValue(err.Error()) diff --git a/eth/tracers/js/internal/tracers/call_tracer_legacy.js b/eth/tracers/js/internal/tracers/call_tracer_legacy.js index 3ca7377738..05f72042c9 100644 --- a/eth/tracers/js/internal/tracers/call_tracer_legacy.js +++ b/eth/tracers/js/internal/tracers/call_tracer_legacy.js @@ -234,7 +234,6 @@ input: call.input, output: call.output, error: call.error, - time: call.time, calls: call.calls, } for (var key in sorted) { diff --git a/eth/tracers/js/tracer_test.go b/eth/tracers/js/tracer_test.go index b58b5ae94a..1d42dc319c 100644 --- a/eth/tracers/js/tracer_test.go +++ b/eth/tracers/js/tracer_test.go @@ -73,7 +73,7 @@ func runTrace(tracer tracers.Tracer, vmctx *vmContext, chaincfg *params.ChainCon tracer.CaptureTxStart(gasLimit) tracer.CaptureStart(env, contract.Caller(), contract.Address(), false, []byte{}, startGas, value) ret, err := env.Interpreter().Run(contract, []byte{}, false) - tracer.CaptureEnd(ret, startGas-contract.Gas, 1, err) + tracer.CaptureEnd(ret, startGas-contract.Gas, err) // Rest gas assumes no refund tracer.CaptureTxEnd(startGas - contract.Gas) if err != nil { @@ -193,7 +193,7 @@ func TestNoStepExec(t *testing.T) { } env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{GasPrice: big.NewInt(100)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) tracer.CaptureStart(env, common.Address{}, common.Address{}, false, []byte{}, 1000, big.NewInt(0)) - tracer.CaptureEnd(nil, 0, 1, nil) + tracer.CaptureEnd(nil, 0, nil) ret, err := tracer.GetResult() if err != nil { t.Fatal(err) diff --git a/eth/tracers/logger/access_list_tracer.go b/eth/tracers/logger/access_list_tracer.go index a8908094eb..766ee4e4b9 100644 --- a/eth/tracers/logger/access_list_tracer.go +++ b/eth/tracers/logger/access_list_tracer.go @@ -18,7 +18,6 @@ package logger import ( "math/big" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -162,7 +161,7 @@ func (a *AccessListTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint6 func (*AccessListTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { } -func (*AccessListTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {} +func (*AccessListTracer) CaptureEnd(output []byte, gasUsed uint64, err error) {} func (*AccessListTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { } diff --git a/eth/tracers/logger/logger.go b/eth/tracers/logger/logger.go index aea44801d8..48d03b6df0 100644 --- a/eth/tracers/logger/logger.go +++ b/eth/tracers/logger/logger.go @@ -24,7 +24,6 @@ import ( "math/big" "strings" "sync/atomic" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -220,7 +219,7 @@ func (l *StructLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, s } // CaptureEnd is called after the call finishes to finalize the tracing. -func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { +func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, err error) { l.output = output l.err = err if l.cfg.Debug { @@ -386,7 +385,7 @@ func (t *mdLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err) } -func (t *mdLogger) CaptureEnd(output []byte, gasUsed uint64, tm time.Duration, err error) { +func (t *mdLogger) CaptureEnd(output []byte, gasUsed uint64, err error) { fmt.Fprintf(t.out, "\nOutput: `0x%x`\nConsumed gas: `%d`\nError: `%v`\n", output, gasUsed, err) } diff --git a/eth/tracers/logger/logger_json.go b/eth/tracers/logger/logger_json.go index 72ad0199c9..37f1371d05 100644 --- a/eth/tracers/logger/logger_json.go +++ b/eth/tracers/logger/logger_json.go @@ -20,7 +20,6 @@ import ( "encoding/json" "io" "math/big" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -80,18 +79,17 @@ func (l *JSONLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, sco } // CaptureEnd is triggered at end of execution. -func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { +func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, err error) { type endLog struct { Output string `json:"output"` GasUsed math.HexOrDecimal64 `json:"gasUsed"` - Time time.Duration `json:"time"` Err string `json:"error,omitempty"` } var errMsg string if err != nil { errMsg = err.Error() } - l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, errMsg}) + l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), errMsg}) } func (l *JSONLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { diff --git a/eth/tracers/native/4byte.go b/eth/tracers/native/4byte.go index 7fb1c5e6c6..e6d1a6728c 100644 --- a/eth/tracers/native/4byte.go +++ b/eth/tracers/native/4byte.go @@ -21,7 +21,6 @@ import ( "math/big" "strconv" "sync/atomic" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -129,7 +128,7 @@ func (t *fourByteTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, } // CaptureEnd is called after the call finishes to finalize the tracing. -func (t *fourByteTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { +func (t *fourByteTracer) CaptureEnd(output []byte, gasUsed uint64, err error) { } func (*fourByteTracer) CaptureTxStart(gasLimit uint64) {} diff --git a/eth/tracers/native/call.go b/eth/tracers/native/call.go index 0ac4029bca..ed26a79c80 100644 --- a/eth/tracers/native/call.go +++ b/eth/tracers/native/call.go @@ -21,7 +21,6 @@ import ( "errors" "math/big" "sync/atomic" - "time" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -142,7 +141,7 @@ func (t *callTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Ad } // CaptureEnd is called after the call finishes to finalize the tracing. -func (t *callTracer) CaptureEnd(output []byte, gasUsed uint64, d time.Duration, err error) { +func (t *callTracer) CaptureEnd(output []byte, gasUsed uint64, err error) { t.callstack[0].processOutput(output, err) } diff --git a/eth/tracers/native/noop.go b/eth/tracers/native/noop.go index c252b2408f..c1035bd1b7 100644 --- a/eth/tracers/native/noop.go +++ b/eth/tracers/native/noop.go @@ -19,7 +19,6 @@ package native import ( "encoding/json" "math/big" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -44,7 +43,7 @@ func (t *noopTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Ad } // CaptureEnd is called after the call finishes to finalize the tracing. -func (t *noopTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { +func (t *noopTracer) CaptureEnd(output []byte, gasUsed uint64, err error) { } // CaptureState implements the EVMLogger interface to trace a single step of VM execution. diff --git a/eth/tracers/native/prestate.go b/eth/tracers/native/prestate.go index b513f383b9..6f32af09a9 100644 --- a/eth/tracers/native/prestate.go +++ b/eth/tracers/native/prestate.go @@ -20,7 +20,6 @@ import ( "encoding/json" "math/big" "sync/atomic" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -82,7 +81,7 @@ func (t *prestateTracer) CaptureStart(env *vm.EVM, from common.Address, to commo } // CaptureEnd is called after the call finishes to finalize the tracing. -func (t *prestateTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { +func (t *prestateTracer) CaptureEnd(output []byte, gasUsed uint64, err error) { if t.create { // Exclude created contract. delete(t.prestate, t.to) diff --git a/go.mod b/go.mod index 8de86c0b9f..c4551a3c07 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,8 @@ require ( github.com/peterh/liner v1.2.0 github.com/pkg/errors v0.9.1 github.com/prometheus/tsdb v0.10.0 - github.com/prysmaticlabs/prysm/v3 v3.2.1 + github.com/prysmaticlabs/gohashtree v0.0.3-alpha // indirect + github.com/prysmaticlabs/prysm/v4 v4.0.2 github.com/rjeczalik/notify v0.9.1 github.com/rs/cors v1.8.2 github.com/shirou/gopsutil v3.21.11+incompatible @@ -132,10 +133,10 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 // indirect github.com/gtank/merlin v0.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e // indirect github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/ipfs/go-cid v0.3.2 // indirect - github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -150,24 +151,19 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.24.0 // indirect + github.com/libp2p/go-libp2p v0.26.2 // indirect github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.8.0 // indirect + github.com/libp2p/go-libp2p-pubsub v0.9.3 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect - github.com/libp2p/go-msgio v0.2.0 // indirect + github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.1.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-openssl v0.1.0 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.0 // indirect - github.com/lucas-clemente/quic-go v0.31.0 // indirect github.com/lunixbochs/vtclean v1.0.0 // indirect github.com/manifoldco/promptui v0.7.0 // indirect - github.com/marten-seemann/qtls-go1-18 v0.1.3 // indirect - github.com/marten-seemann/qtls-go1-19 v0.1.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d // indirect - github.com/mattn/go-pointer v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/miekg/dns v1.1.50 // indirect @@ -191,7 +187,7 @@ require ( github.com/multiformats/go-multibase v0.1.1 // indirect github.com/multiformats/go-multicodec v0.7.0 // indirect github.com/multiformats/go-multihash v0.2.1 // indirect - github.com/multiformats/go-multistream v0.3.3 // indirect + github.com/multiformats/go-multistream v0.4.1 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/onsi/ginkgo/v2 v2.5.1 // indirect @@ -209,9 +205,13 @@ require ( github.com/prysmaticlabs/eth2-types v0.0.0-20210303084904-c9735a06829d // indirect github.com/prysmaticlabs/fastssz v0.0.0-20220628121656-93dfe28febab // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect - github.com/prysmaticlabs/gohashtree v0.0.2-alpha // indirect github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c // indirect github.com/prysmaticlabs/prysm v0.0.0-20220124113610-e26cde5e091b // indirect + github.com/quic-go/qpack v0.4.0 // indirect + github.com/quic-go/qtls-go1-19 v0.2.1 // indirect + github.com/quic-go/qtls-go1-20 v0.1.1 // indirect + github.com/quic-go/quic-go v0.33.0 // indirect + github.com/quic-go/webtransport-go v0.5.2 // indirect github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect @@ -221,7 +221,6 @@ require ( github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/schollz/progressbar/v3 v3.3.4 // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344 // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect @@ -237,7 +236,6 @@ require ( github.com/wealdtech/go-bytesutil v1.1.1 // indirect github.com/wealdtech/go-eth2-types/v2 v2.5.2 // indirect github.com/wealdtech/go-eth2-util v1.6.3 // indirect - github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.etcd.io/bbolt v1.3.7 // indirect @@ -267,6 +265,7 @@ require ( k8s.io/klog/v2 v2.80.0 // indirect k8s.io/utils v0.0.0-20200520001619-278ece378a50 // indirect lukechampine.com/blake3 v1.1.7 // indirect + nhooyr.io/websocket v1.8.7 // indirect sigs.k8s.io/structured-merge-diff/v3 v3.0.0 // indirect sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/go.sum b/go.sum index a0e0bf66e5..7708b5199b 100644 --- a/go.sum +++ b/go.sum @@ -368,6 +368,10 @@ github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= @@ -407,10 +411,13 @@ github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dp github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= @@ -425,6 +432,12 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= @@ -555,6 +568,7 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -603,6 +617,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= +github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -668,7 +684,6 @@ github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9 github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= @@ -738,6 +753,7 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= @@ -776,6 +792,7 @@ github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4F github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -797,8 +814,8 @@ github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= -github.com/libp2p/go-libp2p v0.24.0 h1:DQk/5bBon+yUVIGTeRVBmOYpZzoBHx/VTC0xoLgJGG4= -github.com/libp2p/go-libp2p v0.24.0/go.mod h1:28t24CYDlnBs23rIs1OclU89YbhgibrBq2LFbMe+cFw= +github.com/libp2p/go-libp2p v0.26.2 h1:eHEoW/696FP7/6DxOvcrKfTD6Bi0DExxiMSZUJxswA0= +github.com/libp2p/go-libp2p v0.26.2/go.mod h1:x75BN32YbwuY0Awm2Uix4d4KOz+/4piInkp4Wr3yOo8= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= @@ -840,8 +857,8 @@ github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDH github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub v0.8.0 h1:KygfDpaa9AeUPGCVcpVenpXNFauDn+5kBYu3EjcL3Tg= -github.com/libp2p/go-libp2p-pubsub v0.8.0/go.mod h1:e4kT+DYjzPUYGZeWk4I+oxCSYTXizzXii5LDRRhjKSw= +github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= +github.com/libp2p/go-libp2p-pubsub v0.9.3/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= @@ -876,8 +893,8 @@ github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= -github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU= -github.com/libp2p/go-msgio v0.2.0/go.mod h1:dBVM1gW3Jk9XqHkU4eKdGvVHdLa51hoGfll6jMJMSlY= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= @@ -889,8 +906,6 @@ github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDT github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= -github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= @@ -916,8 +931,6 @@ github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczG github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.31.0 h1:MfNp3fk0wjWRajw6quMFA3ap1AVtlU+2mtwmbVogB2M= -github.com/lucas-clemente/quic-go v0.31.0/go.mod h1:0wFbizLgYzqHqtlyxyCaJKlE7bYgE6JQ+54TLd/Dq2g= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -933,17 +946,11 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/manifoldco/promptui v0.7.0 h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW4+z4= github.com/manifoldco/promptui v0.7.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qpack v0.3.0 h1:UiWstOgT8+znlkDPOg2+3rIuYXJ2CnGDkGUXN6ki6hE= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/qtls-go1-18 v0.1.3 h1:R4H2Ks8P6pAtUagjFty2p7BVHn3XiwDAl7TTQf5h7TI= -github.com/marten-seemann/qtls-go1-18 v0.1.3/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-19 v0.1.1 h1:mnbxeq3oEyQxQXwI4ReCgW9DPoPR94sNlqWoDZnjRIE= -github.com/marten-seemann/qtls-go1-19 v0.1.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/marten-seemann/webtransport-go v0.4.1 h1:8Ir7OoAvtp79yxQpa3foTKIPuoH+0eKpisHObJyu9Sk= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.0.10-0.20170816031813-ad5389df28cd/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -970,8 +977,6 @@ github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= -github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1088,8 +1093,8 @@ github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o= -github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= +github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= +github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -1262,18 +1267,28 @@ github.com/prysmaticlabs/fastssz v0.0.0-20220628121656-93dfe28febab/go.mod h1:MA github.com/prysmaticlabs/go-bitfield v0.0.0-20210108222456-8e92c3709aa0/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= -github.com/prysmaticlabs/gohashtree v0.0.2-alpha h1:hk5ZsDQuSkyUMhTd55qB396P1+dtyIKiSwMmYE/hyEU= -github.com/prysmaticlabs/gohashtree v0.0.2-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= +github.com/prysmaticlabs/gohashtree v0.0.3-alpha h1:1EVinCWdb3Lorq7xn8DYQHf48nCcdAM3Vb18KsFlRWY= +github.com/prysmaticlabs/gohashtree v0.0.3-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/prysmaticlabs/grpc-gateway/v2 v2.3.1-0.20210702154020-550e1cd83ec1 h1:xcu59yYL6AWWTl6jtejBfE0y8uF35fArCBeZjRlvJss= github.com/prysmaticlabs/grpc-gateway/v2 v2.3.1-0.20210702154020-550e1cd83ec1/go.mod h1:IOyTYjcIO0rkmnGBfJTL0NJ11exy/Tc2QEuv7hCXp24= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= -github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20211014160335-757fae4f38c6 h1:+jhXLjEYVW4qU2z5SOxlxN+Hv/A9FDf0HpfDurfMEz0= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20211014160335-757fae4f38c6/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= +github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h1:q9wE0ZZRdTUAAeyFP/w0SwBEnCqlVy2+on6X2/e+eAU= github.com/prysmaticlabs/prysm v0.0.0-20220124113610-e26cde5e091b h1:XULhE6PdzCYSe5OEVFhuixNqL3mYVOq/3M+SUGnKr1Y= github.com/prysmaticlabs/prysm v0.0.0-20220124113610-e26cde5e091b/go.mod h1:bFzDfaj4xtisRey9RPkMJOhOJVwmtH3FChV7NPKV1Nk= -github.com/prysmaticlabs/prysm/v3 v3.2.1 h1:K1cuIIh3tK/Z8943Xn1q1RU/4epnHcfwOJpNiue0Qcs= -github.com/prysmaticlabs/prysm/v3 v3.2.1/go.mod h1:W6h2+OurbfMNqWE2e3r+Uiit4plAW3W7ncDx1LIe8+I= +github.com/prysmaticlabs/prysm/v4 v4.0.2 h1:OU1Vw/eDp9BdWUBtO9z/mT5llIvBDLuNYKKTVyFpxrc= +github.com/prysmaticlabs/prysm/v4 v4.0.2/go.mod h1:e7Xf3nTpWEzmoOpcORzjQ56ogT4uTC7BN8DTrcFD7cQ= +github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= +github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= +github.com/quic-go/qtls-go1-19 v0.2.1 h1:aJcKNMkH5ASEJB9FXNeZCyTEIHU1J7MmHyz1Q1TSG1A= +github.com/quic-go/qtls-go1-19 v0.2.1/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.1.1 h1:KbChDlg82d3IHqaj2bn6GfKRj84Per2VGf5XV3wSwQk= +github.com/quic-go/qtls-go1-20 v0.1.1/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= +github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= +github.com/quic-go/webtransport-go v0.5.2 h1:GA6Bl6oZY+g/flt00Pnu0XtivSD8vukOu3lYhJjnGEk= +github.com/quic-go/webtransport-go v0.5.2/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= @@ -1353,7 +1368,6 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -1447,7 +1461,11 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1474,7 +1492,6 @@ github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/willf/bitset v1.1.3 h1:ekJIKh6+YbUIVt9DfNbkR5d6aFcFTLDRyJNAACURBg8= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -2145,6 +2162,8 @@ k8s.io/utils v0.0.0-20200520001619-278ece378a50 h1:ZtTUW5+ZWaoqjR3zOpRa7oFJ5d4aA k8s.io/utils v0.0.0-20200520001619-278ece378a50/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/p2p/discover/common.go b/p2p/discover/common.go index e389821fda..b4de7ed22d 100644 --- a/p2p/discover/common.go +++ b/p2p/discover/common.go @@ -18,13 +18,17 @@ package discover import ( "crypto/ecdsa" + "fmt" "net" "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // UDPConn is a network connection on which discovery can operate. @@ -35,18 +39,47 @@ type UDPConn interface { LocalAddr() net.Addr } +type NodeFilterFunc func(*enr.Record) bool + +func ParseEthFilter(chain string) (NodeFilterFunc, error) { + var filter forkid.Filter + switch chain { + case "bsc": + filter = forkid.NewStaticFilter(params.BSCChainConfig, params.BSCGenesisHash) + case "chapel": + filter = forkid.NewStaticFilter(params.ChapelChainConfig, params.ChapelGenesisHash) + case "rialto": + filter = forkid.NewStaticFilter(params.RialtoChainConfig, params.RialtoGenesisHash) + default: + return nil, fmt.Errorf("unknown network %q", chain) + } + + f := func(r *enr.Record) bool { + var eth struct { + ForkID forkid.ID + Tail []rlp.RawValue `rlp:"tail"` + } + if r.Load(enr.WithEntry("eth", ð)) != nil { + return false + } + return filter(eth.ForkID) == nil + } + return f, nil +} + // Config holds settings for the discovery listener. type Config struct { // These settings are required and configure the UDP listener: PrivateKey *ecdsa.PrivateKey // These settings are optional: - NetRestrict *netutil.Netlist // list of allowed IP networks - Bootnodes []*enode.Node // list of bootstrap nodes - Unhandled chan<- ReadPacket // unhandled packets are sent on this channel - Log log.Logger // if set, log messages go here - ValidSchemes enr.IdentityScheme // allowed identity schemes - Clock mclock.Clock + NetRestrict *netutil.Netlist // list of allowed IP networks + Bootnodes []*enode.Node // list of bootstrap nodes + Unhandled chan<- ReadPacket // unhandled packets are sent on this channel + Log log.Logger // if set, log messages go here + ValidSchemes enr.IdentityScheme // allowed identity schemes + Clock mclock.Clock + FilterFunction NodeFilterFunc // function for filtering ENR entries } func (cfg Config) withDefaults() Config { diff --git a/p2p/discover/table.go b/p2p/discover/table.go index bf136cf48f..a6301c999c 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -80,6 +80,8 @@ type Table struct { closeReq chan struct{} closed chan struct{} + enrFilter NodeFilterFunc + nodeAddedHook func(*node) // for testing } @@ -100,7 +102,7 @@ type bucket struct { ips netutil.DistinctNetSet } -func newTable(t transport, db *enode.DB, bootnodes []*enode.Node, log log.Logger) (*Table, error) { +func newTable(t transport, db *enode.DB, bootnodes []*enode.Node, log log.Logger, filter NodeFilterFunc) (*Table, error) { tab := &Table{ net: t, db: db, @@ -111,6 +113,7 @@ func newTable(t transport, db *enode.DB, bootnodes []*enode.Node, log log.Logger rand: mrand.New(mrand.NewSource(0)), ips: netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit}, log: log, + enrFilter: filter, } if err := tab.setFallbackNodes(bootnodes); err != nil { return nil, err @@ -339,10 +342,16 @@ func (tab *Table) doRevalidate(done chan<- struct{}) { // Also fetch record if the node replied and returned a higher sequence number. if last.Seq() < remoteSeq { - n, err := tab.net.RequestENR(unwrapNode(last)) - if err != nil { - tab.log.Debug("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", err) + n, enrErr := tab.net.RequestENR(unwrapNode(last)) + if enrErr != nil { + tab.log.Debug("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", enrErr) } else { + if tab.enrFilter != nil { + if !tab.enrFilter(n.Record()) { + tab.log.Trace("ENR record filter out", "id", last.ID(), "addr", last.addr()) + err = fmt.Errorf("filtered node") + } + } last = &node{Node: *n, addedAt: last.addedAt, livenessChecks: last.livenessChecks} } } @@ -473,10 +482,20 @@ func (tab *Table) bucketAtDistance(d int) *bucket { // // The caller must not hold tab.mutex. func (tab *Table) addSeenNode(n *node) { + gopool.Submit(func() { + tab.addSeenNodeSync(n) + }) +} + +func (tab *Table) addSeenNodeSync(n *node) { if n.ID() == tab.self().ID() { return } + if tab.filterNode(n) { + return + } + tab.mutex.Lock() defer tab.mutex.Unlock() b := tab.bucket(n.ID()) @@ -502,6 +521,20 @@ func (tab *Table) addSeenNode(n *node) { } } +func (tab *Table) filterNode(n *node) bool { + if tab.enrFilter == nil { + return false + } + if node, err := tab.net.RequestENR(unwrapNode(n)); err != nil { + tab.log.Debug("ENR request failed", "id", n.ID(), "addr", n.addr(), "err", err) + return false + } else if !tab.enrFilter(node.Record()) { + tab.log.Trace("ENR record filter out", "id", n.ID(), "addr", n.addr()) + return true + } + return false +} + // addVerifiedNode adds a node whose existence has been verified recently to the front of a // bucket. If the node is already in the bucket, it is moved to the front. If the bucket // has no space, the node is added to the replacements list. @@ -511,14 +544,23 @@ func (tab *Table) addSeenNode(n *node) { // ping repeatedly. // // The caller must not hold tab.mutex. + func (tab *Table) addVerifiedNode(n *node) { + gopool.Submit(func() { + tab.addVerifiedNodeSync(n) + }) +} + +func (tab *Table) addVerifiedNodeSync(n *node) { if !tab.isInitDone() { return } if n.ID() == tab.self().ID() { return } - + if tab.filterNode(n) { + return + } tab.mutex.Lock() defer tab.mutex.Unlock() b := tab.bucket(n.ID()) diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go index 5f40c967fd..cc5884e323 100644 --- a/p2p/discover/table_test.go +++ b/p2p/discover/table_test.go @@ -27,10 +27,13 @@ import ( "testing/quick" "time" + "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) func TestTable_pingReplace(t *testing.T) { @@ -65,7 +68,7 @@ func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding // its bucket if it is unresponsive. Revalidate again to ensure that transport.dead[last.ID()] = !lastInBucketIsResponding transport.dead[pingSender.ID()] = !newNodeIsResponding - tab.addSeenNode(pingSender) + tab.addSeenNodeSync(pingSender) tab.doRevalidate(make(chan struct{}, 1)) tab.doRevalidate(make(chan struct{}, 1)) @@ -148,7 +151,7 @@ func TestTable_IPLimit(t *testing.T) { for i := 0; i < tableIPLimit+1; i++ { n := nodeAtDistance(tab.self().ID(), i, net.IP{172, 0, 1, byte(i)}) - tab.addSeenNode(n) + tab.addSeenNodeSync(n) } if tab.len() > tableIPLimit { t.Errorf("too many nodes in table") @@ -314,8 +317,8 @@ func TestTable_addVerifiedNode(t *testing.T) { // Insert two nodes. n1 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 1}) n2 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 2}) - tab.addSeenNode(n1) - tab.addSeenNode(n2) + tab.addSeenNodeSync(n1) + tab.addSeenNodeSync(n2) // Verify bucket content: bcontent := []*node{n1, n2} @@ -327,7 +330,7 @@ func TestTable_addVerifiedNode(t *testing.T) { newrec := n2.Record() newrec.Set(enr.IP{99, 99, 99, 99}) newn2 := wrapNode(enode.SignNull(newrec, n2.ID())) - tab.addVerifiedNode(newn2) + tab.addVerifiedNodeSync(newn2) // Check that bucket is updated correctly. newBcontent := []*node{newn2, n1} @@ -346,8 +349,8 @@ func TestTable_addSeenNode(t *testing.T) { // Insert two nodes. n1 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 1}) n2 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 2}) - tab.addSeenNode(n1) - tab.addSeenNode(n2) + tab.addSeenNodeSync(n1) + tab.addSeenNodeSync(n2) // Verify bucket content: bcontent := []*node{n1, n2} @@ -359,7 +362,7 @@ func TestTable_addSeenNode(t *testing.T) { newrec := n2.Record() newrec.Set(enr.IP{99, 99, 99, 99}) newn2 := wrapNode(enode.SignNull(newrec, n2.ID())) - tab.addSeenNode(newn2) + tab.addSeenNodeSync(newn2) // Check that bucket content is unchanged. if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, bcontent) { @@ -382,7 +385,7 @@ func TestTable_revalidateSyncRecord(t *testing.T) { r.Set(enr.IP(net.IP{127, 0, 0, 1})) id := enode.ID{1} n1 := wrapNode(enode.SignNull(&r, id)) - tab.addSeenNode(n1) + tab.addSeenNodeSync(n1) // Update the node record. r.Set(enr.WithEntry("foo", "bar")) @@ -396,6 +399,41 @@ func TestTable_revalidateSyncRecord(t *testing.T) { } } +// This test checks that ENR filtering is working properly +func TestTable_filterNode(t *testing.T) { + // Create ENR filter + type eth struct { + ForkID forkid.ID + Tail []rlp.RawValue `rlp:"tail"` + } + + enrFilter, _ := ParseEthFilter("bsc") + + // Check test ENR record + var r1 enr.Record + r1.Set(enr.WithEntry("foo", "bar")) + if enrFilter(&r1) { + t.Fatalf("filterNode doesn't work correctly for entry") + } + t.Logf("Check test ENR record - passed") + + // Check wrong genesis ENR record + var r2 enr.Record + r2.Set(enr.WithEntry("eth", eth{ForkID: forkid.NewID(params.BSCChainConfig, params.ChapelGenesisHash, uint64(0))})) + if enrFilter(&r2) { + t.Fatalf("filterNode doesn't work correctly for wrong genesis entry") + } + t.Logf("Check wrong genesis ENR record - passed") + + // Check correct genesis ENR record + var r3 enr.Record + r3.Set(enr.WithEntry("eth", eth{ForkID: forkid.NewID(params.BSCChainConfig, params.BSCGenesisHash, uint64(0))})) + if !enrFilter(&r3) { + t.Fatalf("filterNode doesn't work correctly for correct genesis entry") + } + t.Logf("Check correct genesis ENR record - passed") +} + // gen wraps quick.Value so it's easier to use. // it generates a random value of the given value's type. func gen(typ interface{}, rand *rand.Rand) interface{} { diff --git a/p2p/discover/table_util_test.go b/p2p/discover/table_util_test.go index 47a2e7ac3c..5da68e72e1 100644 --- a/p2p/discover/table_util_test.go +++ b/p2p/discover/table_util_test.go @@ -43,7 +43,7 @@ func init() { func newTestTable(t transport) (*Table, *enode.DB) { db, _ := enode.OpenDB("") - tab, _ := newTable(t, db, nil, log.Root()) + tab, _ := newTable(t, db, nil, log.Root(), nil) go tab.loop() return tab, db } @@ -110,7 +110,7 @@ func fillBucket(tab *Table, n *node) (last *node) { // if the bucket is not full. The caller must not hold tab.mutex. func fillTable(tab *Table, nodes []*node) { for _, n := range nodes { - tab.addSeenNode(n) + tab.addSeenNodeSync(n) } } diff --git a/p2p/discover/v4_udp.go b/p2p/discover/v4_udp.go index d743cc7419..5e106f30ae 100644 --- a/p2p/discover/v4_udp.go +++ b/p2p/discover/v4_udp.go @@ -42,7 +42,7 @@ var ( errExpired = errors.New("expired") errUnsolicitedReply = errors.New("unsolicited reply") errUnknownNode = errors.New("unknown node") - errTimeout = errors.New("RPC timeout") + errTimeout = errors.New("udp timeout") errClockWarp = errors.New("reply deadline too far in the future") errClosed = errors.New("socket closed") errLowPort = errors.New("low port") @@ -143,7 +143,7 @@ func ListenV4(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { log: cfg.Log, } - tab, err := newTable(t, ln.Database(), cfg.Bootnodes, t.log) + tab, err := newTable(t, ln.Database(), cfg.Bootnodes, t.log, cfg.FilterFunction) if err != nil { return nil, err } diff --git a/p2p/discover/v5_udp.go b/p2p/discover/v5_udp.go index f98b8eadd9..f88ce33b8b 100644 --- a/p2p/discover/v5_udp.go +++ b/p2p/discover/v5_udp.go @@ -164,7 +164,7 @@ func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { closeCtx: closeCtx, cancelCloseCtx: cancelCloseCtx, } - tab, err := newTable(t, t.db, cfg.Bootnodes, cfg.Log) + tab, err := newTable(t, t.db, cfg.Bootnodes, cfg.Log, cfg.FilterFunction) if err != nil { return nil, err } diff --git a/p2p/discover/v5_udp_test.go b/p2p/discover/v5_udp_test.go index f061f5ab41..0290ab4e26 100644 --- a/p2p/discover/v5_udp_test.go +++ b/p2p/discover/v5_udp_test.go @@ -145,7 +145,7 @@ func TestUDPv5_unknownPacket(t *testing.T) { // Make node known. n := test.getNode(test.remotekey, test.remoteaddr).Node() - test.table.addSeenNode(wrapNode(n)) + test.table.addSeenNodeSync(wrapNode(n)) test.packetIn(&v5wire.Unknown{Nonce: nonce}) test.waitPacketOut(func(p *v5wire.Whoareyou, addr *net.UDPAddr, _ v5wire.Nonce) { diff --git a/p2p/server.go b/p2p/server.go index 38c2d73a0e..8008ed8ae7 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -32,6 +32,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/gopool" "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" @@ -40,6 +41,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/rlp" ) const ( @@ -193,6 +195,8 @@ type Server struct { discmix *enode.FairMix dialsched *dialScheduler + forkFilter forkid.Filter + // Channels into the run loop. quit chan struct{} addtrusted chan *enode.Node @@ -593,6 +597,21 @@ func (srv *Server) setupDiscovery() error { } srv.localnode.SetFallbackUDP(realaddr.Port) + // ENR filter function + f := func(r *enr.Record) bool { + if srv.forkFilter == nil { + return true + } + var eth struct { + ForkID forkid.ID + Tail []rlp.RawValue `rlp:"tail"` + } + if r.Load(enr.WithEntry("eth", ð)) != nil { + return false + } + return srv.forkFilter(eth.ForkID) == nil + } + // Discovery V4 var unhandled chan discover.ReadPacket var sconn *sharedUDPConn @@ -602,11 +621,12 @@ func (srv *Server) setupDiscovery() error { sconn = &sharedUDPConn{conn, unhandled} } cfg := discover.Config{ - PrivateKey: srv.PrivateKey, - NetRestrict: srv.NetRestrict, - Bootnodes: srv.BootstrapNodes, - Unhandled: unhandled, - Log: srv.log, + PrivateKey: srv.PrivateKey, + NetRestrict: srv.NetRestrict, + Bootnodes: srv.BootstrapNodes, + Unhandled: unhandled, + Log: srv.log, + FilterFunction: f, } ntab, err := discover.ListenV4(conn, srv.localnode, cfg) if err != nil { @@ -619,10 +639,11 @@ func (srv *Server) setupDiscovery() error { // Discovery V5 if srv.DiscoveryV5 { cfg := discover.Config{ - PrivateKey: srv.PrivateKey, - NetRestrict: srv.NetRestrict, - Bootnodes: srv.BootstrapNodesV5, - Log: srv.log, + PrivateKey: srv.PrivateKey, + NetRestrict: srv.NetRestrict, + Bootnodes: srv.BootstrapNodesV5, + Log: srv.log, + FilterFunction: f, } var err error if sconn != nil { @@ -666,6 +687,10 @@ func (srv *Server) maxInboundConns() int { return srv.MaxPeers - srv.maxDialedConns() } +func (srv *Server) SetFilter(f forkid.Filter) { + srv.forkFilter = f +} + func (srv *Server) maxDialedConns() (limit int) { if srv.NoDial || srv.MaxPeers == 0 { return 0 diff --git a/params/config.go b/params/config.go index da7f40128c..9883968446 100644 --- a/params/config.go +++ b/params/config.go @@ -225,7 +225,7 @@ var ( // TODO modify blockNumber, make sure the blockNumber is not an integer multiple of 200 (epoch number) // TODO Caution !!! it should be very careful !!! LubanBlock: big.NewInt(29295050), - PlatoBlock: nil, + PlatoBlock: big.NewInt(29861024), Parlia: &ParliaConfig{ Period: 3, @@ -854,6 +854,7 @@ type Rules struct { IsMoran bool IsPlanck bool IsLuban bool + IsPlato bool } // Rules ensures c's ChainID is not nil. @@ -879,5 +880,6 @@ func (c *ChainConfig) Rules(num *big.Int, isMerge bool) Rules { IsMoran: c.IsMoran(num), IsPlanck: c.IsPlanck(num), IsLuban: c.IsLuban(num), + IsPlato: c.IsPlato(num), } } diff --git a/params/version.go b/params/version.go index 251d55abba..1b0432117d 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 = 2 // Minor version component of the current release - VersionPatch = 0 // Patch version component of the current release + VersionPatch = 2 // Patch version component of the current release VersionMeta = "" // Version metadata to append to the version string )