diff --git a/kroma-bindings/bindings/colosseum.go b/kroma-bindings/bindings/colosseum.go index 765d70c90..b4b3f6f0a 100644 --- a/kroma-bindings/bindings/colosseum.go +++ b/kroma-bindings/bindings/colosseum.go @@ -31,8 +31,8 @@ var ( // ColosseumMetaData contains all meta data concerning the Colosseum contract. var ColosseumMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_zkVerifier\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"},{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_creationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bisectionTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_provingTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_dummyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_maxTxs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_securityCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_zkMerkleTrie\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BISECTION_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CREATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DUMMY_HASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE_SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TXS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PROVING_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECURITY_COUNCIL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_MERKLE_TRIE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bisect\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cancelChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengerTimeout\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challenges\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"timeoutAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"segSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"segStart\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"dismissChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_publicInputHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceDeleteOutput\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.Challenge\",\"components\":[{\"name\":\"turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"timeoutAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"segSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"segStart\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSegmentsLength\",\"inputs\":[{\"name\":\"_turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumColosseum.ChallengeStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAbleToBisect\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isInCreationPeriod\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveFault\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInputProof\",\"components\":[{\"name\":\"srcOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"dstOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"publicInput\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInput\",\"components\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"number\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"transactionsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"withdrawalsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"txHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"blobGasUsed\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"excessBlobGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"parentBeaconRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rlps\",\"type\":\"tuple\",\"internalType\":\"structTypes.BlockHeaderRLP\",\"components\":[{\"name\":\"uncleHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"coinbase\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiptsRoot\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"logsBloom\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"difficulty\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"mixHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"l2ToL1MessagePasserBalance\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ToL1MessagePasserCodeHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"name\":\"_zkproof\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_pair\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifiedPublicInputs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Bisected\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"turn\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCanceled\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCreated\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"asserter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeDismissed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengerTimedOut\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputForceDeleted\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"asseter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Proven\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReadyToProve\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyUsedPublicInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlockHashMismatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlockHashMismatchedBtwSrcAndDst\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCancelChallenge\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotRollbackOutputToZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CreationPeriodPassed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FirstSegmentMismatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperChallengeStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperChallengeStatusToCancel\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInclusionProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSegmentsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTurn\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidZKProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1Reorged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LastSegmentMatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedGenesisOutput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyChallengerCanCancel\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputAlreadyDeleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputAlreadyFinalized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputNotDeleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StateRootMismatched\",\"inputs\":[]}]", - Bin: "0x6101c06040523480156200001257600080fd5b50604051620066bb380380620066bb83398101604081905262000035916200038a565b6001600160a01b03808c166080528a811660a05260c089905260e08890526101008790526101208a90526101408690526101608590528281166101805281166101a052620000838362000094565b5050505050505050505050620004e3565b600054610100900460ff1615808015620000b55750600054600160ff909116105b80620000e55750620000d2306200029660201b620030441760201c565b158015620000e5575060005460ff166001145b6200014d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000171576000805461ff0019166101001790555b6002825162000181919062000458565b15620001a057604051630fbb795f60e41b815260040160405180910390fd5b600160005b83518110156200022557838181518110620001c457620001c46200047b565b602002602001015160016000838152602001908152602001600020819055506001848281518110620001fa57620001fa6200047b565b60200260200101516200020e9190620004a7565b6200021a9083620004c1565b9150600101620001a5565b506101205181146200024a57604051630fbb795f60e41b815260040160405180910390fd5b50801562000292576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6001600160a01b0381168114620002bb57600080fd5b50565b8051620002cb81620002a5565b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002f857600080fd5b815160206001600160401b0380831115620003175762000317620002d0565b8260051b604051601f19603f830116810181811084821117156200033f576200033f620002d0565b6040529384528581018301938381019250878511156200035e57600080fd5b83870191505b848210156200037f5781518352918301919083019062000364565b979650505050505050565b60008060008060008060008060008060006101608c8e031215620003ad57600080fd5b8b51620003ba81620002a5565b60208d0151909b50620003cd81620002a5565b809a505060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015193506101008c015160018060401b038111156200041557600080fd5b620004238e828f01620002e6565b935050620004356101208d01620002be565b9150620004466101408d01620002be565b90509295989b509295989b9093969950565b6000826200047657634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015620004bc57620004bc62000491565b500390565b6000816000190483118215151615620004de57620004de62000491565b500290565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051615fdb620006e0600039600081816103d50152613fc70152600081816102f60152818161070e0152818161157d01528181611f4c0152818161219f01526123d3015260008181610365015281816140b2015261412001526000818161051d01526140ec0152600081816104cf01528181610f5f01528181612f220152612f5b0152600081816104f6015281816130bd01526142d601526000818161031d015261433d0152600081816104480152818161062d015261295d01526000818161046f01526112e80152600081816101b70152818161064e01528181610796015281816108a9015281816109d101528181610a2f01528181610b2401528181610c230152818161104e0152818161140d015281816115ea015281816116df015281816117f801528181611a1d01528181611b5f01528181611fd4015281816120b0015281816121c7015281816122250152818161231a01528181612601015281816126f6015281816128e501528181612aad01528181612bf401528181612ce901528181612de4015281816132110152818161330601528181613397015281816134d00152818161354a015281816135dc015281816136bd015281816137c1015281816139af01528181613aa40152613b9f0152615fdb6000f3fe608060405234801561001057600080fd5b50600436106101ad5760003560e01c8063887c560f116100ee578063cfb4474d11610097578063e39a219c11610071578063e39a219c1461053f578063e58932b314610552578063e9371a2c14610572578063fc9d84df1461059257600080fd5b8063cfb4474d146104ca578063d2ee3075146104f1578063d5145ebc1461051857600080fd5b8063a41483e3116100c8578063a41483e314610491578063a6ade11f146104a4578063b8b1a27c146104b757600080fd5b8063887c560f146104305780638f3a6c88146104435780639ded39521461046a57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d057806362fc00db146103f75780636fe0e5591461040a57806380ab13131461041d57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614f17565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614f45565b6105a5565b005b6102aa61024c366004614f45565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614f17565b610628565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614fd1565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610405366004614fe4565b610703565b61023c610418366004615108565b610d75565b61023c61042b3660046151ea565b61101d565b61021961043e366004614f45565b611a89565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c61049f366004614f17565b611abd565b61023c6104b236600461529b565b611b2e565b61033f6104c5366004615305565b611eda565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61054d366004614f17565b611f41565b610565610560366004614f45565b61248d565b6040516101ed9190615328565b610585610580366004614f45565b61259a565b6040516101ed9190615407565b61023c6105a0366004615448565b6125c5565b600360008381526002602090815260408083206001600160a01b038616845290915290206105d290613053565b60058111156105e3576105e36153d8565b1461061a576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106248282613139565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161069a91815260200190565b608060405180830381865afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906154ac565b604001516fffffffffffffffffffffffffffffffff166106fb9190615553565b101592915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610765576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610809919061556b565b15610840576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82610877576040517f646194d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906154ac565b6020015114610957576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fe664672300000000000000000000000000000000000000000000000000000000815260048101879052602481018490526001600160a01b0385811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610a1557600080fd5b505af1158015610a29573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061558d565b6001600160a01b031663ad36d6cc876040518263ffffffff1660e01b8152600401610adc91815260200190565b602060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d919061556b565b15610d29577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba4919061558d565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b038681166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610c0957600080fd5b505af1158015610c1d573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca3919061558d565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0386811660248301528781166044830152919091169063be995dc290606401600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050505b846001600160a01b0316867fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610d6591815260200190565b60405180910390a3505050505050565b600054610100900460ff1615808015610d955750600054600160ff909116105b80610daf5750303b158015610daf575060005460ff166001145b610e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e9e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610eac91906155d9565b15610ee3576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b8351811015610f5c57838181518110610f0357610f036155ed565b602002602001015160016000838152602001908152602001600020819055506001848281518110610f3657610f366155ed565b6020026020010151610f48919061561c565b610f529083615633565b9150600101610ee8565b507f00000000000000000000000000000000000000000000000000000000000000008114610fb6576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50801561062457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810188905287907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c1919061556b565b156110f8576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260026020908152604080832033845290915281209061111b82613053565b6001830154909150611138908b906001600160a01b03168361378d565b15611144575050611a7f565b6005816005811115611158576111586153d8565b1415801561117857506004816005811115611175576111756153d8565b14155b156111af576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c86111c3368b90038b018b615670565b613cac565b905060006111e16111c3368c90038c0160a08d01615670565b90506111f48b8584848e60a08101613d9b565b61121d8a60a0810161120a6101408301836156e0565b6112186101608f018f61571e565b613ea3565b61124f61122e6101c08c018c615752565b8c61018001358d6101a001358e60a001604001358f60a00160200135613f6f565b600061126c60208c01356112676101408e018e6156e0565b6140ac565b60008181526003602052604090205490915060ff16156112b8576040517fda2cdb7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611325908d908d908d908d908890600401615809565b602060405180830381865afa158015611342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611366919061556b565b61139c576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908e907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018e90526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa158015611454573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147891906154ac565b905060006362fc00db60e01b8f338960000160099054906101000a90046001600160a01b03168560200151876040516024016114e29594939291909485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926115b49291908690600401615843565b600060405180830381600087803b1580156115ce57600080fd5b505af11580156115e2573d6000803e3d6000fd5b5050505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166a919061558d565b6001600160a01b031663ad36d6cc8e6040518263ffffffff1660e01b815260040161169791815260200190565b602060405180830381865afa1580156116b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d8919061556b565b156117f6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f919061558d565b6001600160a01b031663be995dc28e338860000160099054906101000a90046001600160a01b03166040518463ffffffff1660e01b81526004016117bf939291909283526001600160a01b03918216602084015216604082015260600190565b600060405180830381600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b505050506118f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611878919061558d565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018f90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b505050505b60016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008e81526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549067ffffffffffffffff02191690556000820160096101000a8154906001600160a01b0302191690556001820160006101000a8154906001600160a01b0302191690556002820160006119ca9190614e99565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018f905260248201523360448201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b5050505050505050505b5050505050505050565b60008281526002602090815260408083206001600160a01b03851684529091528120611ab490614167565b90505b92915050565b600081815260026020908152604080832033845290915290206001810154611af89083906001600160a01b0316611af384613053565b61378d565b610624576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015611bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd2919061556b565b15611c09576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008681526002602090815260408083206001600160a01b0389168452909152812090611c3582613053565b6001830154909150611c529089906001600160a01b03168361378d565b15611c5e575050611ed2565b60006001826005811115611c7457611c746153d8565b03611c8d575060018201546001600160a01b0316611cc0565b6002826005811115611ca157611ca16153d8565b03611cc057508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611d02576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611d159060ff16600161587d565b9050611da081856002018a81548110611d3057611d306155ed565b9060005260206000200154866002018b6001611d4c9190615553565b81548110611d5c57611d5c6155ed565b90600052602060002001548a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b6000611dab8561426d565b90506000611db9828b615633565b8660040154611dc89190615553565b9050611e0b868a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925087915061429a9050565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8416178655611e3f866142c4565b6040805160ff851681524260208201526001600160a01b038d16918e917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e9086614167565b611ecb576040516001600160a01b038c16908d907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b5050505050505b505050505050565b6000600160ff83161015611f1a576040517f8c29db9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016000611f2882856158a2565b60ff168152602001908152602001600020549050919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fa3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612023573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612047919061556b565b1561207e576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156120ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212391906154ac565b6020810151909150612161576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101849052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561220b57600080fd5b505af115801561221f573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a5919061558d565b6001600160a01b031663ad36d6cc846040518263ffffffff1660e01b81526004016122d291815260200190565b602060405180830381865afa1580156122ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612313919061556b565b15612440577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239a919061558d565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152918216604482015291169063be995dc290606401600060405180830381600087803b15801561242757600080fd5b505af115801561243b573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316837fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161248091815260200190565b60405180910390a3505050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c081019190915260008381526002602081815260408084206001600160a01b03808816865290835293819020815160e081018352815460ff8116825267ffffffffffffffff6101008204168286015269010000000000000000009004861681840152600182015490951660608601529283018054825181850281018501909352808352608086019383018282801561257557602002820191906000526020600020905b815481526020019060010190808311612561575b5050505050815260200160038201548152602001600482015481525050905092915050565b60008281526002602090815260408083206001600160a01b03851684529091528120611ab490613053565b846000036125ff576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561265d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612681919061558d565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b81526004016126ae91815260200190565b602060405180830381865afa1580156126cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ef919061556b565b1561282f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612752573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612776919061558d565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa1580156127d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f9919061556b565b61282f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106128b357600361286182613053565b6005811115612872576128726153d8565b146128a9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128b38633613139565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015612934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295891906154ac565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661299d9190615553565b10156129d5576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612a10576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03163303612a53576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590612a625750844015155b15612aa15785854014612aa1576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae557612add60018b61561c565b6040518263ffffffff1660e01b8152600401612afb91815260200190565b608060405180830381865afa158015612b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3c91906154ac565b6020810151909150612baa57612ba5600186866000818110612b6057612b606155ed565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b612bf2565b612bf260018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c74919061558d565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612ca191815260200190565b602060405180830381865afa158015612cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce2919061556b565b15612de2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d69919061558d565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612dc557600080fd5b505af1158015612dd9573d6000803e3d6000fd5b50505050612ee0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e64919061558d565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612ec757600080fd5b505af1158015612edb573d6000803e3d6000fd5b505050505b612f7f8386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612f5991507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff1661561c565b7f000000000000000000000000000000000000000000000000000000000000000061429a565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612ff7836142c4565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff909116101561306d57506000919050565b81546000906130819060029060ff166158c5565b835460ff91909116159150610100900467ffffffffffffffff1642111561310d5780156130b15750600392915050565b82546130f6906130f1907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff16615553565b421190565b156131045750600392915050565b50600492915050565b61311683614167565b6131235750600592915050565b8061312f576002613132565b60015b9392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905591906131b990830182614e99565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff0514260405161320791815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561326d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613291919061558d565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b81526004016132be91815260200190565b602060405180830381865afa1580156132db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ff919061556b565b156134a1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613362573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613386919061558d565b6001600160a01b031663be995dc2837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8866040518263ffffffff1660e01b81526004016133e391815260200190565b602060405180830381865afa158015613400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613424919061558d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561348d57600080fd5b505af1158015611ed2573d6000803e3d6000fd5b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa15801561351f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613543919061556b565b156136bb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ca919061558d565b6001600160a01b03166336b8346983837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8876040518263ffffffff1660e01b815260040161362891815260200190565b602060405180830381865afa158015613645573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613669919061558d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401613473565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373d919061558d565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d90604401613473565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015613810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383491906154ac565b602001511461384557506000613132565b336001600160a01b03841614613887576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082600581111561389b5761389b6153d8565b14806138b8575060038260058111156138b6576138b66153d8565b145b156138ef576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061396690830182614e99565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2f919061558d565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b8152600401613a5c91815260200190565b602060405180830381865afa158015613a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9d919061556b565b15613b9d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b24919061558d565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613b8057600080fd5b505af1158015613b94573d6000803e3d6000fd5b50505050613ca2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c1f919061558d565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613c8957600080fd5b505af1158015613c9d573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613d0e5781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ab7565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610e37565b919050565b83856002018781548110613db157613db16155ed565b906000526020600020015414613df3576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dfc85614167565b613e62578260028601613e10886001615553565b81548110613e2057613e206155ed565b906000526020600020015403613e62576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060600135826080013514611ed2576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613ee4576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613f0f57613f0a613efc84615965565b613f0584615abf565b614365565b613f29565b613f29613f1b84615965565b613f2484615abf565b614409565b905080856080013514613f68576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a729061402c907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615c60565b602060405180830381865afa158015614049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406d919061556b565b6140a3576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050565b600060607f00000000000000000000000000000000000000000000000000000000000000006140df610120850185615752565b9050101561414c576141497f0000000000000000000000000000000000000000000000000000000000000000614119610120860186615752565b61414491507f000000000000000000000000000000000000000000000000000000000000000061561c565b61451a565b90505b61415f8461415985615965565b836145a6565b949350505050565b600060016141748361426d565b1192915050565b80518061418786611eda565b146141be576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000815181106141d1576141d16155ed565b60200260200101518414614211576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161421d60018361561c565b8151811061422d5761422d6155ed565b60200260200101518303613f68576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000906001906142819060ff16611eda565b61428b919061561c565b8260030154611ab79190615d3b565b82516142af9060028601906020860190614eb7565b50600484019190915560039092019190915550565b6142cd81614167565b614338576142fb7f000000000000000000000000000000000000000000000000000000000000000042615553565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6142fb7f000000000000000000000000000000000000000000000000000000000000000042615553565b50565b6040805160118082526102408201909252600091829190816020015b60608152602001906001900390816143815790505090506143a3848483614618565b6143d28461010001516040516020016143be91815260200190565b6040516020818303038152906040526148cb565b816010815181106143e5576143e56155ed565b60200260200101819052506143f98161493a565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b6060815260200190600190039081614425579050509050614447848483614618565b6144628461010001516040516020016143be91815260200190565b81601081518110614475576144756155ed565b602002602001018190525061449884610140015167ffffffffffffffff1661497e565b816011815181106144ab576144ab6155ed565b60200260200101819052506144ce84610160015167ffffffffffffffff1661497e565b816012815181106144e1576144e16155ed565b60200260200101819052506145078461018001516040516020016143be91815260200190565b816013815181106143e5576143e56155ed565b606060008267ffffffffffffffff81111561453757614537615036565b604051908082528060200260200182016040528015614560578160200160208202803683370190505b50905060005b8381101561459e5784828281518110614581576145816155ed565b60209081029190910101528061459681615d4f565b915050614566565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016145f99c9b9a99989796959493929190615dba565b6040516020818303038152906040528051906020012090509392505050565b61463283602001516040516020016143be91815260200190565b81600081518110614645576146456155ed565b6020026020010181905250816000015181600181518110614668576146686155ed565b602002602001018190525081602001518160028151811061468b5761468b6155ed565b60200260200101819052506146b08360e001516040516020016143be91815260200190565b816003815181106146c3576146c36155ed565b60200260200101819052506146e88360c001516040516020016143be91815260200190565b816004815181106146fb576146fb6155ed565b602002602001018190525081604001518160058151811061471e5761471e6155ed565b6020026020010181905250816060015181600681518110614741576147416155ed565b6020026020010181905250816080015181600781518110614764576147646155ed565b6020026020010181905250614786836060015167ffffffffffffffff1661497e565b81600881518110614799576147996155ed565b60200260200101819052506147bb836080015167ffffffffffffffff1661497e565b816009815181106147ce576147ce6155ed565b60200260200101819052508160a0015181600a815181106147f1576147f16155ed565b6020026020010181905250614813836040015167ffffffffffffffff1661497e565b81600b81518110614826576148266155ed565b60200260200101819052508160c0015181600c81518110614849576148496155ed565b60200260200101819052508160e0015181600d8151811061486c5761486c6155ed565b602002602001018190525081610100015181600e81518110614890576148906155ed565b60200260200101819052506148a88360a0015161497e565b81600f815181106148bb576148bb6155ed565b6020026020010181905250505050565b606080825160011480156148f957506080836000815181106148ef576148ef6155ed565b016020015160f81c105b15614905575081611ab7565b61491183516080614991565b83604051602001614923929190615e73565b604051602081830303815290604052905092915050565b6060600061494783614b87565b9050614955815160c0614991565b81604051602001614967929190615e73565b604051602081830303815290604052915050919050565b6060611ab761498c83614cbf565b6148cb565b6060806038841015614a1057604080516001808252818301909252906020820181803683370190505090506149c6838561587d565b60f81b816000815181106149dc576149dc6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ab4565b600060015b614a1f8187615d3b565b15614a455781614a2e81615d4f565b9250614a3e905061010082615633565b9050614a15565b614a50826001615553565b67ffffffffffffffff811115614a6857614a68615036565b6040519080825280601f01601f191660200182016040528015614a92576020820181803683370190505b509250614a9f858361587d565b614aaa90603761587d565b60f81b83600081518110614ac057614ac06155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614b7e57610100614b08828461561c565b614b1490610100615fc2565b614b1e9088615d3b565b614b2891906155d9565b60f81b838281518110614b3d57614b3d6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614b7681615d4f565b915050614af4565b50509392505050565b60608151600003614ba657505060408051600081526020810190915290565b6000805b8351811015614bed57838181518110614bc557614bc56155ed565b60200260200101515182614bd99190615553565b915080614be581615d4f565b915050614baa565b60008267ffffffffffffffff811115614c0857614c08615036565b6040519080825280601f01601f191660200182016040528015614c32576020820181803683370190505b50600092509050602081015b8551831015614cb6576000868481518110614c5b57614c5b6155ed565b602002602001015190506000602082019050614c7983828451614e1e565b878581518110614c8b57614c8b6155ed565b60200260200101515183614c9f9190615553565b925050508280614cae90615d4f565b935050614c3e565b50949350505050565b6060600082604051602001614cd691815260200190565b604051602081830303815290604052905060005b6020811015614d4557818181518110614d0557614d056155ed565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614d455780614d3d81615d4f565b915050614cea565b6000614d5282602061561c565b67ffffffffffffffff811115614d6a57614d6a615036565b6040519080825280601f01601f191660200182016040528015614d94576020820181803683370190505b50905060005b8151811015614cb6578383614dae81615d4f565b945081518110614dc057614dc06155ed565b602001015160f81c60f81b828281518110614ddd57614ddd6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614e1681615d4f565b915050614d9a565b8282825b60208110614e5a5781518352614e39602084615553565b9250614e46602083615553565b9150614e5360208261561c565b9050614e22565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906143629190614f02565b828054828255906000526020600020908101928215614ef2579160200282015b82811115614ef2578251825591602001919060010190614ed7565b50614efe929150614f02565b5090565b5b80821115614efe5760008155600101614f03565b600060208284031215614f2957600080fd5b5035919050565b6001600160a01b038116811461436257600080fd5b60008060408385031215614f5857600080fd5b823591506020830135614f6a81614f30565b809150509250929050565b60005b83811015614f90578181015183820152602001614f78565b83811115614f9f576000848401525b50505050565b60008151808452614fbd816020860160208601614f75565b601f01601f19169290920160200192915050565b602081526000611ab46020830184614fa5565b600080600080600060a08688031215614ffc57600080fd5b85359450602086013561500e81614f30565b9350604086013561501e81614f30565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff8111828210171561508957615089615036565b60405290565b604051610120810167ffffffffffffffff8111828210171561508957615089615036565b604051601f8201601f1916810167ffffffffffffffff811182821017156150dc576150dc615036565b604052919050565b600067ffffffffffffffff8211156150fe576150fe615036565b5060051b60200190565b6000602080838503121561511b57600080fd5b823567ffffffffffffffff81111561513257600080fd5b8301601f8101851361514357600080fd5b8035615156615151826150e4565b6150b3565b81815260059190911b8201830190838101908783111561517557600080fd5b928401925b828410156151935783358252928401929084019061517a565b979650505050505050565b60008083601f8401126151b057600080fd5b50813567ffffffffffffffff8111156151c857600080fd5b6020830191508360208260051b85010111156151e357600080fd5b9250929050565b600080600080600080600060a0888a03121561520557600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561522b57600080fd5b908901906101e0828c03121561524057600080fd5b9095506060890135908082111561525657600080fd5b6152628b838c0161519e565b909650945060808a013591508082111561527b57600080fd5b506152888a828b0161519e565b989b979a50959850939692959293505050565b6000806000806000608086880312156152b357600080fd5b8535945060208601356152c581614f30565b935060408601359250606086013567ffffffffffffffff8111156152e857600080fd5b6152f48882890161519e565b969995985093965092949392505050565b60006020828403121561531757600080fd5b813560ff81168114611ab457600080fd5b60006020808352610100830160ff8551168285015267ffffffffffffffff8286015116604085015260408501516001600160a01b0380821660608701528060608801511660808701525050608085015160e060a0860152818151808452610120870191508483019350600092505b808310156153b65783518252928401926001929092019190840190615396565b5060a087015160c087015260c087015160e08701528094505050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615442577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060008060006080868803121561546057600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156152e857600080fd5b80516fffffffffffffffffffffffffffffffff81168114613d9657600080fd5b6000608082840312156154be57600080fd5b6040516080810181811067ffffffffffffffff821117156154e1576154e1615036565b60405282516154ef81614f30565b8152602083810151908201526155076040840161548c565b60408201526155186060840161548c565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561556657615566615524565b500190565b60006020828403121561557d57600080fd5b81518015158114611ab457600080fd5b60006020828403121561559f57600080fd5b8151611ab481614f30565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826155e8576155e86155aa565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008282101561562e5761562e615524565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561566b5761566b615524565b500290565b600060a0828403121561568257600080fd5b60405160a0810181811067ffffffffffffffff821117156156a5576156a5615036565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261571457600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261571457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261578757600080fd5b83018035915067ffffffffffffffff8211156157a257600080fd5b6020019150600581901b36038213156151e357600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156157ec57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60608152600061581d6060830187896157ba565b82810360208401526158308186886157ba565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006158746060830184614fa5565b95945050505050565b600060ff821660ff84168060ff0382111561589a5761589a615524565b019392505050565b600060ff821660ff8416808210156158bc576158bc615524565b90039392505050565b600060ff8316806158d8576158d86155aa565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613d9657600080fd5b600082601f83011261591057600080fd5b81356020615920615151836150e4565b82815260059290921b8401810191818101908684111561593f57600080fd5b8286015b8481101561595a5780358352918301918301615943565b509695505050505050565b60006101a0823603121561597857600080fd5b615980615065565b823581526020830135602082015261599a604084016158e7565b60408201526159ab606084016158e7565b60608201526159bc608084016158e7565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff811115615a0757600080fd5b615a13368287016158ff565b828401525050610140615a278185016158e7565b90820152610160615a398482016158e7565b9082015261018092830135928101929092525090565b600082601f830112615a6057600080fd5b813567ffffffffffffffff811115615a7a57615a7a615036565b615a8d6020601f19601f840116016150b3565b818152846020838601011115615aa257600080fd5b816020850160208301376000918101602001919091529392505050565b60006101208236031215615ad257600080fd5b615ada61508f565b823567ffffffffffffffff80821115615af257600080fd5b615afe36838701615a4f565b83526020850135915080821115615b1457600080fd5b615b2036838701615a4f565b60208401526040850135915080821115615b3957600080fd5b615b4536838701615a4f565b60408401526060850135915080821115615b5e57600080fd5b615b6a36838701615a4f565b60608401526080850135915080821115615b8357600080fd5b615b8f36838701615a4f565b608084015260a0850135915080821115615ba857600080fd5b615bb436838701615a4f565b60a084015260c0850135915080821115615bcd57600080fd5b615bd936838701615a4f565b60c084015260e0850135915080821115615bf257600080fd5b615bfe36838701615a4f565b60e084015261010091508185013581811115615c1957600080fd5b615c2536828801615a4f565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615c7a6080840188614fa5565b8381036040850152858152818101600587901b820183018860005b89811015615d2257601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615cd857600080fd5b8b01868101903567ffffffffffffffff811115615cf457600080fd5b803603821315615d0357600080fd5b615d0e858284615c35565b958801959450505090850190600101615c95565b5050809450505050508260608301529695505050505050565b600082615d4a57615d4a6155aa565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615d8057615d80615524565b5060010190565b60008151602080840160005b83811015615daf57815187529582019590820190600101615d93565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615e61615e5b60da840186615d87565b84615d87565b9e9d5050505050505050505050505050565b60008351615e85818460208801614f75565b835190830190615e99818360208801614f75565b01949350505050565b600181815b80851115615efb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615ee157615ee1615524565b80851615615eee57918102915b93841c9390800290615ea7565b509250929050565b600082615f1257506001611ab7565b81615f1f57506000611ab7565b8160018114615f355760028114615f3f57615f5b565b6001915050611ab7565b60ff841115615f5057615f50615524565b50506001821b611ab7565b5060208310610133831016604e8410600b8410161715615f7e575081810a611ab7565b615f888383615ea2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615fba57615fba615524565b029392505050565b6000611ab48383615f0356fea164736f6c634300080f000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_zkVerifier\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"},{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_creationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bisectionTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_provingTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_dummyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_maxTxs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_securityCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_zkMerkleTrie\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BISECTION_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CREATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DUMMY_HASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE_SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TXS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PROVING_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECURITY_COUNCIL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_MERKLE_TRIE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bisect\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cancelChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengerTimeout\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challenges\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"timeoutAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"segSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"segStart\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deletedOutputs\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"dismissChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_publicInputHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceDeleteOutput\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getSegments\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumColosseum.ChallengeStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isInCreationPeriod\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveFault\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInputProof\",\"components\":[{\"name\":\"srcOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"dstOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"publicInput\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInput\",\"components\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"number\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"transactionsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"withdrawalsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"txHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"blobGasUsed\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"excessBlobGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"parentBeaconRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rlps\",\"type\":\"tuple\",\"internalType\":\"structTypes.BlockHeaderRLP\",\"components\":[{\"name\":\"uncleHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"coinbase\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiptsRoot\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"logsBloom\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"difficulty\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"mixHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"l2ToL1MessagePasserBalance\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ToL1MessagePasserCodeHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"name\":\"_zkproof\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_pair\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"segmentsLengths\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifiedPublicInputs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Bisected\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"turn\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCanceled\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCreated\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"asserter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeDismissed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengerTimedOut\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputForceDeleted\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"asseter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Proven\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReadyToProve\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BlockHashMismatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlockHashMismatchedBtwSrcAndDst\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCancelChallenge\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CreationPeriodPassed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FirstSegmentMismatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperChallengeStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperChallengeStatusToCancel\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressGiven\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInclusionProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOutputGiven\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPublicInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSegmentsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTurn\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidZKProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1Reorged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LastSegmentMatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedGenesisOutput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyChallengerCanCancel\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputAlreadyDeleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputAlreadyFinalized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputNotDeleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StateRootMismatched\",\"inputs\":[]}]", + Bin: "0x6101c06040523480156200001257600080fd5b50604051620064fd380380620064fd83398101604081905262000035916200038a565b6001600160a01b03808c166080528a811660a05260c089905260e08890526101008790526101208a90526101408690526101608590528281166101805281166101a052620000838362000094565b5050505050505050505050620004e3565b600054610100900460ff1615808015620000b55750600054600160ff909116105b80620000e55750620000d2306200029660201b62002dca1760201c565b158015620000e5575060005460ff166001145b6200014d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000171576000805461ff0019166101001790555b6002825162000181919062000458565b15620001a057604051630fbb795f60e41b815260040160405180910390fd5b600160005b83518110156200022557838181518110620001c457620001c46200047b565b602002602001015160016000838152602001908152602001600020819055506001848281518110620001fa57620001fa6200047b565b60200260200101516200020e9190620004a7565b6200021a9083620004c1565b9150600101620001a5565b506101205181146200024a57604051630fbb795f60e41b815260040160405180910390fd5b50801562000292576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6001600160a01b0381168114620002bb57600080fd5b50565b8051620002cb81620002a5565b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002f857600080fd5b815160206001600160401b0380831115620003175762000317620002d0565b8260051b604051601f19603f830116810181811084821117156200033f576200033f620002d0565b6040529384528581018301938381019250878511156200035e57600080fd5b83870191505b848210156200037f5781518352918301919083019062000364565b979650505050505050565b60008060008060008060008060008060006101608c8e031215620003ad57600080fd5b8b51620003ba81620002a5565b60208d0151909b50620003cd81620002a5565b809a505060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015193506101008c015160018060401b038111156200041557600080fd5b620004238e828f01620002e6565b935050620004356101208d01620002be565b9150620004466101408d01620002be565b90509295989b509295989b9093969950565b6000826200047657634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015620004bc57620004bc62000491565b500390565b6000816000190483118215151615620004de57620004de62000491565b500290565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051615e32620006cb600039600081816103d50152613e860152600081816102f6015281816115bc0152818161202c01528181612260015261351e01526000818161036501528181613f680152613fd60152600081816105dc0152613fa201526000818161058e0152818161108001528181612ca80152612ce10152600081816105b501528181612e3f01526141af01526000818161031d01526142160152600081816104da015281816106cc01526126e301526000818161052101526113270152600081816101b7015281816106ed015281816107e50152818161090c01528181610af301528181610b5101528181610c4601528181610d4501528181611444015281816116db015281816117c1015281816118d801528181611acd01528181611f3d01528181612054015281816120b2015281816121a7015281816123870152818161247c0152818161266b015281816128330152818161297a01528181612a6f01528181612b6a01528181612f8f015281816130840152818161311501528181613256015281816132d00152818161336201528181613443015281816135a601528181613687015281816138750152818161396a0152613a650152615e326000f3fe608060405234801561001057600080fd5b50600436106101ad5760003560e01c806380ab1313116100ee578063b3e7766d11610097578063d5145ebc11610071578063d5145ebc146105d7578063e39a219c146105fe578063e9371a2c14610611578063fc9d84df1461063157600080fd5b8063b3e7766d14610569578063cfb4474d14610589578063d2ee3075146105b057600080fd5b80639ded3952116100c85780639ded39521461051c578063a41483e314610543578063a6ade11f1461055657600080fd5b806380ab1313146104c25780638f3a6c88146104d55780638f86c803146104fc57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d05780635a6b011f146103f757806362fc00db1461049c5780636fe0e559146104af57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614e01565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614e2f565b610644565b005b6102aa61024c366004614e2f565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614e01565b6106c7565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614eb7565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61045a610405366004614e01565b6004602052600090815260409020805460018201546002909201546001600160a01b0390911691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b604080516001600160a01b03909516855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080016101ed565b61023c6104aa366004614eca565b6107a2565b61023c6104bd366004614fee565b610e96565b61023c6104d03660046150d0565b61113e565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f61050a366004614e01565b60016020526000908152604090205481565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610551366004614e01565b611b3e565b61023c610564366004615181565b611baf565b61057c610577366004614e2f565b611e82565b6040516101ed91906151eb565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61060c366004614e01565b611efa565b61062461061f366004614e2f565b612319565b6040516101ed919061525e565b61023c61063f36600461529f565b61234b565b600360008381526002602090815260408083206001600160a01b0386168452909152902061067190612dd9565b60058111156106825761068261522f565b146106b9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282612eb7565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161073991815260200190565b608060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190615303565b604001516fffffffffffffffffffffffffffffffff1661079a91906153aa565b101592915050565b6107aa613513565b6107b385613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190615303565b6020015114610893576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090206001015482146108dd576040517f90e78fa500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906153c2565b6001600160a01b0316846001600160a01b03161415806109b957506000858152600460205260409020546001600160a01b03848116911614155b156109f0576040517f8036a47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526003602052604090205460ff16610a38576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905587835260049182905280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002019290925590517fe6646723000000000000000000000000000000000000000000000000000000008152908101869052602481018390526001600160a01b0384811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd191906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b8152600401610bfe91815260200190565b602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f91906153df565b15610e4b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906153c2565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038581166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc591906153c2565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0385811660248301528681166044830152919091169063be995dc290606401600060405180830381600087803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b505050505b836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610e8791815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610eb65750600054600160ff909116105b80610ed05750303b158015610ed0575060005460ff166001145b610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fbf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610fcd9190615430565b15611004576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b835181101561107d5783818151811061102457611024615444565b60200260200101516001600083815260200190815260200160002081905550600184828151811061105757611057615444565b60200260200101516110699190615473565b611073908361548a565b9150600101611009565b507f000000000000000000000000000000000000000000000000000000000000000081146110d7576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5080156106c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61114787613577565b600087815260026020908152604080832033845290915281209061116a82612dd9565b6001830154909150611187908a906001600160a01b031683613653565b15611193575050611b35565b60058160058111156111a7576111a761522f565b141580156111c7575060048160058111156111c4576111c461522f565b14155b156111fe576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611239888361121a611215368c90038c018c6154c7565b613b72565b61122f611215368d90038d0160a08e016154c7565b8b60a08101613c61565b6112628760a0810161124f610140830183615537565b61125d6101608c018c615575565b613d69565b61128e6112736101c08901896155a9565b6101808a01356101a08b013560e08c013560c08d0135613e2e565b60006112ab60208901356112a66101408b018b615537565b613f62565b60008181526003602052604090205490915060ff16156112f7576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611364908a908a908a908a908890600401615660565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a591906153df565b6113db576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908b907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018b90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190615303565b84546020820151604051602481018f905233604482015269010000000000000000009092046001600160a01b03166064830152608482015260a481018490529091506000907f62fc00db000000000000000000000000000000000000000000000000000000009060c40160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926115f3929190869060040161569a565b600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50505060008d815260046020818152604092839020865181546001600160a01b039182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255828801516001830155848801516060909801516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000298169790971760029091015582517fb98debbf00000000000000000000000000000000000000000000000000000000815292517f00000000000000000000000000000000000000000000000000000000000000009096169563b98debbf9550838301945090929091908290030181865afa158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906153c2565b6001600160a01b031663ad36d6cc8b6040518263ffffffff1660e01b815260040161177991815260200190565b602060405180830381865afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba91906153df565b156118d6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906153c2565b83546040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018d90523360248201526001600160a01b0369010000000000000000009092048216604482015291169063be995dc290606401600060405180830381600087803b1580156118b957600080fd5b505af11580156118cd573d6000803e3d6000fd5b505050506119d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195891906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018c90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156119bb57600080fd5b505af11580156119cf573d6000803e3d6000fd5b505050505b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558d8452600280845282852033865290935290832080547fffffff000000000000000000000000000000000000000000000000000000000016815590810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190611a8290830182614d83565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018c905260248201523360448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e664672390606401600060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050505050505b50505050505050565b600081815260026020908152604080832033845290915290206001810154611b799083906001600160a01b0316611b7484612dd9565b613653565b6106c3576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885613577565b60008581526002602090815260408083206001600160a01b0388168452909152812090611be482612dd9565b6001830154909150611c019088906001600160a01b031683613653565b15611c0d575050611e7b565b60006001826005811115611c2357611c2361522f565b03611c3c575060018201546001600160a01b0316611c6f565b6002826005811115611c5057611c5061522f565b03611c6f57508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611cb1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611cc49060ff1660016156d4565b9050611d4f81856002018981548110611cdf57611cdf615444565b9060005260206000200154866002018a6001611cfb91906153aa565b81548110611d0b57611d0b615444565b906000526020600020015489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b6000611d5a8561412e565b9050611db585888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611da092508691508d905061548a565b8860040154611daf91906153aa565b84614173565b84547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316178555611de98561419d565b6040805160ff841681524260208201526001600160a01b038b16918c917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e3a8561423b565b611e75576040516001600160a01b038a16908b907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b50505050505b5050505050565b60008281526002602081815260408084206001600160a01b0386168552825292839020909101805483518184028101840190945280845260609392830182828015611eec57602002820191906000526020600020905b815481526020019060010190808311611ed8575b505050505090505b92915050565b611f02613513565b611f0b81613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190615303565b6020810151909150611fee576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101839052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561209857600080fd5b505af11580156120ac573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213291906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161215f91815260200190565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906153df565b156122cd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222791906153c2565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152918216604482015291169063be995dc290606401600060405180830381600087803b1580156122b457600080fd5b505af11580156122c8573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316827fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161230d91815260200190565b60405180910390a35050565b60008281526002602090815260408083206001600160a01b0385168452909152812061234490612dd9565b9392505050565b84600003612385576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240791906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b815260040161243491815260200190565b602060405180830381865afa158015612451573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247591906153df565b156125b5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc91906153c2565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f91906153df565b6125b5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106126395760036125e782612dd9565b60058111156125f8576125f861522f565b1461262f576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126398633612eb7565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190615303565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661272391906153aa565b101561275b576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612796576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b031633036127d9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015906127e85750844015155b156128275785854014612827576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761286360018b615473565b6040518263ffffffff1660e01b815260040161288191815260200190565b608060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c29190615303565b60208101519091506129305761292b6001868660008181106128e6576128e6615444565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b612978565b61297860018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa91906153c2565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612a2791815260200190565b602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6891906153df565b15612b68577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef91906153c2565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612b4b57600080fd5b505af1158015612b5f573d6000803e3d6000fd5b50505050612c66565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bea91906153c2565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612c4d57600080fd5b505af1158015612c61573d6000803e3d6000fd5b505050505b612d058386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612cdf91507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff16615473565b7f0000000000000000000000000000000000000000000000000000000000000000614173565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612d7d8361419d565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612df357506000919050565b8154600090612e079060029060ff166156f9565b835460ff91909116159150610100900467ffffffffffffffff16421115612e8c578015612e375750600392915050565b8254612e73907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff166153aa565b421115612e835750600392915050565b50600492915050565b612e958361423b565b612ea25750600592915050565b80612eae576002612344565b60019392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612f3790830182614d83565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612f8591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f91906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161303c91815260200190565b602060405180830381865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d91906153df565b15613227577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310491906153c2565b6001600160a01b031663be995dc2837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8866040518263ffffffff1660e01b815260040161316191815260200190565b602060405180830381865afa15801561317e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a291906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050505050565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156132a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c991906153df565b15613441577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335091906153c2565b6001600160a01b03166336b8346983837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8876040518263ffffffff1660e01b81526004016133ae91815260200190565b602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef91906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b0391821660248401521660448201526064016131f1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c391906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d906044016131f1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614613575576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156135f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361991906153df565b15613650576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156136d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fa9190615303565b602001511461370b57506000612344565b336001600160a01b0384161461374d576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260058111156137615761376161522f565b148061377e5750600382600581111561377c5761377c61522f565b145b156137b5576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061382c90830182614d83565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f591906153c2565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b815260040161392291815260200190565b602060405180830381865afa15801561393f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396391906153df565b15613a63577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea91906153c2565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613a4657600080fd5b505af1158015613a5a573d6000803e3d6000fd5b50505050613b68565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae591906153c2565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613bd45781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ef4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610f58565b919050565b83856002018781548110613c7757613c77615444565b906000526020600020015414613cb9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cc28561423b565b613d28578260028601613cd68860016153aa565b81548110613ce657613ce6615444565b906000526020600020015403613d28576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060013582608001351461321f576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613daa576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613dd557613dd0613dc284615799565b613dcb846158f3565b61424f565b613def565b613def613de184615799565b613dea846158f3565b6142f3565b905080856080013514611e7b576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a7290613eeb907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615a94565b602060405180830381865afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c91906153df565b611b35576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060607f0000000000000000000000000000000000000000000000000000000000000000613f956101208501856155a9565b9050101561400257613fff7f0000000000000000000000000000000000000000000000000000000000000000613fcf6101208601866155a9565b613ffa91507f0000000000000000000000000000000000000000000000000000000000000000615473565b614404565b90505b6140158461400f85615799565b83614490565b949350505050565b80516001600061402d8288615b6f565b60ff1681526020019081526020016000205414614076576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008151811061408957614089615444565b602002602001015183146140c9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600182516140d89190615473565b815181106140e8576140e8615444565b60200260200101518203614128576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b80546000906001908190839061414890839060ff16615b6f565b60ff168152602001908152602001600020546141649190615473565b8260030154611ef49190615b92565b82516141889060028601906020860190614da1565b50600484019190915560039092019190915550565b6141a68161423b565b614211576141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b600060016142488361412e565b1192915050565b6040805160118082526102408201909252600091829190816020015b606081526020019060019003908161426b57905050905061428d848483614502565b6142bc8461010001516040516020016142a891815260200190565b6040516020818303038152906040526147b5565b816010815181106142cf576142cf615444565b60200260200101819052506142e381614824565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b606081526020019060019003908161430f579050509050614331848483614502565b61434c8461010001516040516020016142a891815260200190565b8160108151811061435f5761435f615444565b602002602001018190525061438284610140015167ffffffffffffffff16614868565b8160118151811061439557614395615444565b60200260200101819052506143b884610160015167ffffffffffffffff16614868565b816012815181106143cb576143cb615444565b60200260200101819052506143f18461018001516040516020016142a891815260200190565b816013815181106142cf576142cf615444565b606060008267ffffffffffffffff81111561442157614421614f1c565b60405190808252806020026020018201604052801561444a578160200160208202803683370190505b50905060005b83811015614488578482828151811061446b5761446b615444565b60209081029190910101528061448081615ba6565b915050614450565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016144e39c9b9a99989796959493929190615c11565b6040516020818303038152906040528051906020012090509392505050565b61451c83602001516040516020016142a891815260200190565b8160008151811061452f5761452f615444565b602002602001018190525081600001518160018151811061455257614552615444565b602002602001018190525081602001518160028151811061457557614575615444565b602002602001018190525061459a8360e001516040516020016142a891815260200190565b816003815181106145ad576145ad615444565b60200260200101819052506145d28360c001516040516020016142a891815260200190565b816004815181106145e5576145e5615444565b602002602001018190525081604001518160058151811061460857614608615444565b602002602001018190525081606001518160068151811061462b5761462b615444565b602002602001018190525081608001518160078151811061464e5761464e615444565b6020026020010181905250614670836060015167ffffffffffffffff16614868565b8160088151811061468357614683615444565b60200260200101819052506146a5836080015167ffffffffffffffff16614868565b816009815181106146b8576146b8615444565b60200260200101819052508160a0015181600a815181106146db576146db615444565b60200260200101819052506146fd836040015167ffffffffffffffff16614868565b81600b8151811061471057614710615444565b60200260200101819052508160c0015181600c8151811061473357614733615444565b60200260200101819052508160e0015181600d8151811061475657614756615444565b602002602001018190525081610100015181600e8151811061477a5761477a615444565b60200260200101819052506147928360a00151614868565b81600f815181106147a5576147a5615444565b6020026020010181905250505050565b606080825160011480156147e357506080836000815181106147d9576147d9615444565b016020015160f81c105b156147ef575081611ef4565b6147fb8351608061487b565b8360405160200161480d929190615cca565b604051602081830303815290604052905092915050565b6060600061483183614a71565b905061483f815160c061487b565b81604051602001614851929190615cca565b604051602081830303815290604052915050919050565b6060611ef461487683614ba9565b6147b5565b60608060388410156148fa57604080516001808252818301909252906020820181803683370190505090506148b083856156d4565b60f81b816000815181106148c6576148c6615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612344565b600060015b6149098187615b92565b1561492f578161491881615ba6565b925061492890506101008261548a565b90506148ff565b61493a8260016153aa565b67ffffffffffffffff81111561495257614952614f1c565b6040519080825280601f01601f19166020018201604052801561497c576020820181803683370190505b50925061498985836156d4565b6149949060376156d4565b60f81b836000815181106149aa576149aa615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614a68576101006149f28284615473565b6149fe90610100615e19565b614a089088615b92565b614a129190615430565b60f81b838281518110614a2757614a27615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614a6081615ba6565b9150506149de565b50509392505050565b60608151600003614a9057505060408051600081526020810190915290565b6000805b8351811015614ad757838181518110614aaf57614aaf615444565b60200260200101515182614ac391906153aa565b915080614acf81615ba6565b915050614a94565b60008267ffffffffffffffff811115614af257614af2614f1c565b6040519080825280601f01601f191660200182016040528015614b1c576020820181803683370190505b50600092509050602081015b8551831015614ba0576000868481518110614b4557614b45615444565b602002602001015190506000602082019050614b6383828451614d08565b878581518110614b7557614b75615444565b60200260200101515183614b8991906153aa565b925050508280614b9890615ba6565b935050614b28565b50949350505050565b6060600082604051602001614bc091815260200190565b604051602081830303815290604052905060005b6020811015614c2f57818181518110614bef57614bef615444565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614c2f5780614c2781615ba6565b915050614bd4565b6000614c3c826020615473565b67ffffffffffffffff811115614c5457614c54614f1c565b6040519080825280601f01601f191660200182016040528015614c7e576020820181803683370190505b50905060005b8151811015614ba0578383614c9881615ba6565b945081518110614caa57614caa615444565b602001015160f81c60f81b828281518110614cc757614cc7615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614d0081615ba6565b915050614c84565b8282825b60208110614d445781518352614d236020846153aa565b9250614d306020836153aa565b9150614d3d602082615473565b9050614d0c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906136509190614dec565b828054828255906000526020600020908101928215614ddc579160200282015b82811115614ddc578251825591602001919060010190614dc1565b50614de8929150614dec565b5090565b5b80821115614de85760008155600101614ded565b600060208284031215614e1357600080fd5b5035919050565b6001600160a01b038116811461365057600080fd5b60008060408385031215614e4257600080fd5b823591506020830135614e5481614e1a565b809150509250929050565b60005b83811015614e7a578181015183820152602001614e62565b838111156141285750506000910152565b60008151808452614ea3816020860160208601614e5f565b601f01601f19169290920160200192915050565b6020815260006123446020830184614e8b565b600080600080600060a08688031215614ee257600080fd5b853594506020860135614ef481614e1a565b93506040860135614f0481614e1a565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b60405290565b604051610120810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b604051601f8201601f1916810167ffffffffffffffff81118282101715614fc257614fc2614f1c565b604052919050565b600067ffffffffffffffff821115614fe457614fe4614f1c565b5060051b60200190565b6000602080838503121561500157600080fd5b823567ffffffffffffffff81111561501857600080fd5b8301601f8101851361502957600080fd5b803561503c61503782614fca565b614f99565b81815260059190911b8201830190838101908783111561505b57600080fd5b928401925b8284101561507957833582529284019290840190615060565b979650505050505050565b60008083601f84011261509657600080fd5b50813567ffffffffffffffff8111156150ae57600080fd5b6020830191508360208260051b85010111156150c957600080fd5b9250929050565b600080600080600080600060a0888a0312156150eb57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561511157600080fd5b908901906101e0828c03121561512657600080fd5b9095506060890135908082111561513c57600080fd5b6151488b838c01615084565b909650945060808a013591508082111561516157600080fd5b5061516e8a828b01615084565b989b979a50959850939692959293505050565b60008060008060006080868803121561519957600080fd5b8535945060208601356151ab81614e1a565b935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b6151da88828901615084565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561522357835183529284019291840191600101615207565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615299577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000806000608086880312156152b757600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b80516fffffffffffffffffffffffffffffffff81168114613c5c57600080fd5b60006080828403121561531557600080fd5b6040516080810181811067ffffffffffffffff8211171561533857615338614f1c565b604052825161534681614e1a565b81526020838101519082015261535e604084016152e3565b604082015261536f606084016152e3565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156153bd576153bd61537b565b500190565b6000602082840312156153d457600080fd5b815161234481614e1a565b6000602082840312156153f157600080fd5b8151801515811461234457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261543f5761543f615401565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000828210156154855761548561537b565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154c2576154c261537b565b500290565b600060a082840312156154d957600080fd5b60405160a0810181811067ffffffffffffffff821117156154fc576154fc614f1c565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261556b57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261556b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155de57600080fd5b83018035915067ffffffffffffffff8211156155f957600080fd5b6020019150600581901b36038213156150c957600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561564357600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615674606083018789615611565b8281036020840152615687818688615611565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006156cb6060830184614e8b565b95945050505050565b600060ff821660ff84168060ff038211156156f1576156f161537b565b019392505050565b600060ff83168061570c5761570c615401565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613c5c57600080fd5b600082601f83011261574457600080fd5b8135602061575461503783614fca565b82815260059290921b8401810191818101908684111561577357600080fd5b8286015b8481101561578e5780358352918301918301615777565b509695505050505050565b60006101a082360312156157ac57600080fd5b6157b4614f4b565b82358152602083013560208201526157ce6040840161571b565b60408201526157df6060840161571b565b60608201526157f06080840161571b565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561583b57600080fd5b61584736828701615733565b82840152505061014061585b81850161571b565b9082015261016061586d84820161571b565b9082015261018092830135928101929092525090565b600082601f83011261589457600080fd5b813567ffffffffffffffff8111156158ae576158ae614f1c565b6158c16020601f19601f84011601614f99565b8181528460208386010111156158d657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561590657600080fd5b61590e614f75565b823567ffffffffffffffff8082111561592657600080fd5b61593236838701615883565b8352602085013591508082111561594857600080fd5b61595436838701615883565b6020840152604085013591508082111561596d57600080fd5b61597936838701615883565b6040840152606085013591508082111561599257600080fd5b61599e36838701615883565b606084015260808501359150808211156159b757600080fd5b6159c336838701615883565b608084015260a08501359150808211156159dc57600080fd5b6159e836838701615883565b60a084015260c0850135915080821115615a0157600080fd5b615a0d36838701615883565b60c084015260e0850135915080821115615a2657600080fd5b615a3236838701615883565b60e084015261010091508185013581811115615a4d57600080fd5b615a5936828801615883565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615aae6080840188614e8b565b8381036040850152858152818101600587901b820183018860005b89811015615b5657601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615b0c57600080fd5b8b01868101903567ffffffffffffffff811115615b2857600080fd5b803603821315615b3757600080fd5b615b42858284615a69565b958801959450505090850190600101615ac9565b5050809450505050508260608301529695505050505050565b600060ff821660ff841680821015615b8957615b8961537b565b90039392505050565b600082615ba157615ba1615401565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bd757615bd761537b565b5060010190565b60008151602080840160005b83811015615c0657815187529582019590820190600101615bea565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615cb8615cb260da840186615bde565b84615bde565b9e9d5050505050505050505050505050565b60008351615cdc818460208801614e5f565b835190830190615cf0818360208801614e5f565b01949350505050565b600181815b80851115615d5257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d3857615d3861537b565b80851615615d4557918102915b93841c9390800290615cfe565b509250929050565b600082615d6957506001611ef4565b81615d7657506000611ef4565b8160018114615d8c5760028114615d9657615db2565b6001915050611ef4565b60ff841115615da757615da761537b565b50506001821b611ef4565b5060208310610133831016604e8410600b8410161715615dd5575081810a611ef4565b615ddf8383615cf9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615e1157615e1161537b565b029392505050565b60006123448383615d5a56fea164736f6c634300080f000a", } // ColosseumABI is the input ABI used to generate the binding from. @@ -577,66 +577,90 @@ func (_Colosseum *ColosseumCallerSession) Challenges(arg0 *big.Int, arg1 common. return _Colosseum.Contract.Challenges(&_Colosseum.CallOpts, arg0, arg1) } -// GetChallenge is a free data retrieval call binding the contract method 0xe58932b3. +// DeletedOutputs is a free data retrieval call binding the contract method 0x5a6b011f. // -// Solidity: function getChallenge(uint256 _outputIndex, address _challenger) view returns((uint8,uint64,address,address,bytes32[],uint256,uint256)) -func (_Colosseum *ColosseumCaller) GetChallenge(opts *bind.CallOpts, _outputIndex *big.Int, _challenger common.Address) (TypesChallenge, error) { +// Solidity: function deletedOutputs(uint256 ) view returns(address submitter, bytes32 outputRoot, uint128 timestamp, uint128 l2BlockNumber) +func (_Colosseum *ColosseumCaller) DeletedOutputs(opts *bind.CallOpts, arg0 *big.Int) (struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int +}, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "getChallenge", _outputIndex, _challenger) + err := _Colosseum.contract.Call(opts, &out, "deletedOutputs", arg0) + outstruct := new(struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int + }) if err != nil { - return *new(TypesChallenge), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new(TypesChallenge)).(*TypesChallenge) + outstruct.Submitter = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.OutputRoot = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.Timestamp = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + outstruct.L2BlockNumber = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) - return out0, err + return *outstruct, err } -// GetChallenge is a free data retrieval call binding the contract method 0xe58932b3. +// DeletedOutputs is a free data retrieval call binding the contract method 0x5a6b011f. // -// Solidity: function getChallenge(uint256 _outputIndex, address _challenger) view returns((uint8,uint64,address,address,bytes32[],uint256,uint256)) -func (_Colosseum *ColosseumSession) GetChallenge(_outputIndex *big.Int, _challenger common.Address) (TypesChallenge, error) { - return _Colosseum.Contract.GetChallenge(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function deletedOutputs(uint256 ) view returns(address submitter, bytes32 outputRoot, uint128 timestamp, uint128 l2BlockNumber) +func (_Colosseum *ColosseumSession) DeletedOutputs(arg0 *big.Int) (struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int +}, error) { + return _Colosseum.Contract.DeletedOutputs(&_Colosseum.CallOpts, arg0) } -// GetChallenge is a free data retrieval call binding the contract method 0xe58932b3. +// DeletedOutputs is a free data retrieval call binding the contract method 0x5a6b011f. // -// Solidity: function getChallenge(uint256 _outputIndex, address _challenger) view returns((uint8,uint64,address,address,bytes32[],uint256,uint256)) -func (_Colosseum *ColosseumCallerSession) GetChallenge(_outputIndex *big.Int, _challenger common.Address) (TypesChallenge, error) { - return _Colosseum.Contract.GetChallenge(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function deletedOutputs(uint256 ) view returns(address submitter, bytes32 outputRoot, uint128 timestamp, uint128 l2BlockNumber) +func (_Colosseum *ColosseumCallerSession) DeletedOutputs(arg0 *big.Int) (struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int +}, error) { + return _Colosseum.Contract.DeletedOutputs(&_Colosseum.CallOpts, arg0) } -// GetSegmentsLength is a free data retrieval call binding the contract method 0xb8b1a27c. +// GetSegments is a free data retrieval call binding the contract method 0xb3e7766d. // -// Solidity: function getSegmentsLength(uint8 _turn) view returns(uint256) -func (_Colosseum *ColosseumCaller) GetSegmentsLength(opts *bind.CallOpts, _turn uint8) (*big.Int, error) { +// Solidity: function getSegments(uint256 _outputIndex, address _challenger) view returns(bytes32[]) +func (_Colosseum *ColosseumCaller) GetSegments(opts *bind.CallOpts, _outputIndex *big.Int, _challenger common.Address) ([][32]byte, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "getSegmentsLength", _turn) + err := _Colosseum.contract.Call(opts, &out, "getSegments", _outputIndex, _challenger) if err != nil { - return *new(*big.Int), err + return *new([][32]byte), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new([][32]byte)).(*[][32]byte) return out0, err } -// GetSegmentsLength is a free data retrieval call binding the contract method 0xb8b1a27c. +// GetSegments is a free data retrieval call binding the contract method 0xb3e7766d. // -// Solidity: function getSegmentsLength(uint8 _turn) view returns(uint256) -func (_Colosseum *ColosseumSession) GetSegmentsLength(_turn uint8) (*big.Int, error) { - return _Colosseum.Contract.GetSegmentsLength(&_Colosseum.CallOpts, _turn) +// Solidity: function getSegments(uint256 _outputIndex, address _challenger) view returns(bytes32[]) +func (_Colosseum *ColosseumSession) GetSegments(_outputIndex *big.Int, _challenger common.Address) ([][32]byte, error) { + return _Colosseum.Contract.GetSegments(&_Colosseum.CallOpts, _outputIndex, _challenger) } -// GetSegmentsLength is a free data retrieval call binding the contract method 0xb8b1a27c. +// GetSegments is a free data retrieval call binding the contract method 0xb3e7766d. // -// Solidity: function getSegmentsLength(uint8 _turn) view returns(uint256) -func (_Colosseum *ColosseumCallerSession) GetSegmentsLength(_turn uint8) (*big.Int, error) { - return _Colosseum.Contract.GetSegmentsLength(&_Colosseum.CallOpts, _turn) +// Solidity: function getSegments(uint256 _outputIndex, address _challenger) view returns(bytes32[]) +func (_Colosseum *ColosseumCallerSession) GetSegments(_outputIndex *big.Int, _challenger common.Address) ([][32]byte, error) { + return _Colosseum.Contract.GetSegments(&_Colosseum.CallOpts, _outputIndex, _challenger) } // GetStatus is a free data retrieval call binding the contract method 0xe9371a2c. @@ -670,12 +694,12 @@ func (_Colosseum *ColosseumCallerSession) GetStatus(_outputIndex *big.Int, _chal return _Colosseum.Contract.GetStatus(&_Colosseum.CallOpts, _outputIndex, _challenger) } -// IsAbleToBisect is a free data retrieval call binding the contract method 0x887c560f. +// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. // -// Solidity: function isAbleToBisect(uint256 _outputIndex, address _challenger) view returns(bool) -func (_Colosseum *ColosseumCaller) IsAbleToBisect(opts *bind.CallOpts, _outputIndex *big.Int, _challenger common.Address) (bool, error) { +// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) +func (_Colosseum *ColosseumCaller) IsInCreationPeriod(opts *bind.CallOpts, _outputIndex *big.Int) (bool, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "isAbleToBisect", _outputIndex, _challenger) + err := _Colosseum.contract.Call(opts, &out, "isInCreationPeriod", _outputIndex) if err != nil { return *new(bool), err @@ -687,49 +711,49 @@ func (_Colosseum *ColosseumCaller) IsAbleToBisect(opts *bind.CallOpts, _outputIn } -// IsAbleToBisect is a free data retrieval call binding the contract method 0x887c560f. +// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. // -// Solidity: function isAbleToBisect(uint256 _outputIndex, address _challenger) view returns(bool) -func (_Colosseum *ColosseumSession) IsAbleToBisect(_outputIndex *big.Int, _challenger common.Address) (bool, error) { - return _Colosseum.Contract.IsAbleToBisect(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) +func (_Colosseum *ColosseumSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { + return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) } -// IsAbleToBisect is a free data retrieval call binding the contract method 0x887c560f. +// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. // -// Solidity: function isAbleToBisect(uint256 _outputIndex, address _challenger) view returns(bool) -func (_Colosseum *ColosseumCallerSession) IsAbleToBisect(_outputIndex *big.Int, _challenger common.Address) (bool, error) { - return _Colosseum.Contract.IsAbleToBisect(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) +func (_Colosseum *ColosseumCallerSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { + return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) } -// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. +// SegmentsLengths is a free data retrieval call binding the contract method 0x8f86c803. // -// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) -func (_Colosseum *ColosseumCaller) IsInCreationPeriod(opts *bind.CallOpts, _outputIndex *big.Int) (bool, error) { +// Solidity: function segmentsLengths(uint256 ) view returns(uint256) +func (_Colosseum *ColosseumCaller) SegmentsLengths(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "isInCreationPeriod", _outputIndex) + err := _Colosseum.contract.Call(opts, &out, "segmentsLengths", arg0) if err != nil { - return *new(bool), err + return *new(*big.Int), err } - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err } -// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. +// SegmentsLengths is a free data retrieval call binding the contract method 0x8f86c803. // -// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) -func (_Colosseum *ColosseumSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { - return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) +// Solidity: function segmentsLengths(uint256 ) view returns(uint256) +func (_Colosseum *ColosseumSession) SegmentsLengths(arg0 *big.Int) (*big.Int, error) { + return _Colosseum.Contract.SegmentsLengths(&_Colosseum.CallOpts, arg0) } -// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. +// SegmentsLengths is a free data retrieval call binding the contract method 0x8f86c803. // -// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) -func (_Colosseum *ColosseumCallerSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { - return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) +// Solidity: function segmentsLengths(uint256 ) view returns(uint256) +func (_Colosseum *ColosseumCallerSession) SegmentsLengths(arg0 *big.Int) (*big.Int, error) { + return _Colosseum.Contract.SegmentsLengths(&_Colosseum.CallOpts, arg0) } // VerifiedPublicInputs is a free data retrieval call binding the contract method 0x1be4e27e. diff --git a/kroma-bindings/bindings/colosseum_more.go b/kroma-bindings/bindings/colosseum_more.go index 21956a3a7..27445e957 100644 --- a/kroma-bindings/bindings/colosseum_more.go +++ b/kroma-bindings/bindings/colosseum_more.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/solc" ) -const ColosseumStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"segmentsLengths\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1003,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1005_storage))\"},{\"astId\":1004,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"verifiedPublicInputs\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_bytes32,t_bool)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\",\"base\":\"t_bytes32\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_struct(Challenge)1005_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.Challenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Challenge)1005_storage\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1005_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e mapping(address =\u003e struct Types.Challenge))\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_mapping(t_address,t_struct(Challenge)1005_storage)\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(Challenge)1005_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.Challenge\",\"numberOfBytes\":\"160\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const ColosseumStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"segmentsLengths\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1003,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1006_storage))\"},{\"astId\":1004,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"verifiedPublicInputs\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1005,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"deletedOutputs\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_mapping(t_uint256,t_struct(CheckpointOutput)1007_storage)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\",\"base\":\"t_bytes32\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_struct(Challenge)1006_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.Challenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Challenge)1006_storage\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1006_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e mapping(address =\u003e struct Types.Challenge))\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_mapping(t_address,t_struct(Challenge)1006_storage)\"},\"t_mapping(t_uint256,t_struct(CheckpointOutput)1007_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct Types.CheckpointOutput)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(CheckpointOutput)1007_storage\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(Challenge)1006_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.Challenge\",\"numberOfBytes\":\"160\"},\"t_struct(CheckpointOutput)1007_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.CheckpointOutput\",\"numberOfBytes\":\"96\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var ColosseumStorageLayout = new(solc.StorageLayout) -var ColosseumDeployedBin = "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c8063887c560f116100ee578063cfb4474d11610097578063e39a219c11610071578063e39a219c1461053f578063e58932b314610552578063e9371a2c14610572578063fc9d84df1461059257600080fd5b8063cfb4474d146104ca578063d2ee3075146104f1578063d5145ebc1461051857600080fd5b8063a41483e3116100c8578063a41483e314610491578063a6ade11f146104a4578063b8b1a27c146104b757600080fd5b8063887c560f146104305780638f3a6c88146104435780639ded39521461046a57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d057806362fc00db146103f75780636fe0e5591461040a57806380ab13131461041d57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614f17565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614f45565b6105a5565b005b6102aa61024c366004614f45565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614f17565b610628565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614fd1565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610405366004614fe4565b610703565b61023c610418366004615108565b610d75565b61023c61042b3660046151ea565b61101d565b61021961043e366004614f45565b611a89565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c61049f366004614f17565b611abd565b61023c6104b236600461529b565b611b2e565b61033f6104c5366004615305565b611eda565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61054d366004614f17565b611f41565b610565610560366004614f45565b61248d565b6040516101ed9190615328565b610585610580366004614f45565b61259a565b6040516101ed9190615407565b61023c6105a0366004615448565b6125c5565b600360008381526002602090815260408083206001600160a01b038616845290915290206105d290613053565b60058111156105e3576105e36153d8565b1461061a576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106248282613139565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161069a91815260200190565b608060405180830381865afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906154ac565b604001516fffffffffffffffffffffffffffffffff166106fb9190615553565b101592915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610765576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610809919061556b565b15610840576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82610877576040517f646194d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906154ac565b6020015114610957576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fe664672300000000000000000000000000000000000000000000000000000000815260048101879052602481018490526001600160a01b0385811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610a1557600080fd5b505af1158015610a29573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061558d565b6001600160a01b031663ad36d6cc876040518263ffffffff1660e01b8152600401610adc91815260200190565b602060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d919061556b565b15610d29577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba4919061558d565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b038681166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610c0957600080fd5b505af1158015610c1d573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca3919061558d565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0386811660248301528781166044830152919091169063be995dc290606401600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050505b846001600160a01b0316867fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610d6591815260200190565b60405180910390a3505050505050565b600054610100900460ff1615808015610d955750600054600160ff909116105b80610daf5750303b158015610daf575060005460ff166001145b610e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e9e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610eac91906155d9565b15610ee3576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b8351811015610f5c57838181518110610f0357610f036155ed565b602002602001015160016000838152602001908152602001600020819055506001848281518110610f3657610f366155ed565b6020026020010151610f48919061561c565b610f529083615633565b9150600101610ee8565b507f00000000000000000000000000000000000000000000000000000000000000008114610fb6576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50801561062457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810188905287907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c1919061556b565b156110f8576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260026020908152604080832033845290915281209061111b82613053565b6001830154909150611138908b906001600160a01b03168361378d565b15611144575050611a7f565b6005816005811115611158576111586153d8565b1415801561117857506004816005811115611175576111756153d8565b14155b156111af576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c86111c3368b90038b018b615670565b613cac565b905060006111e16111c3368c90038c0160a08d01615670565b90506111f48b8584848e60a08101613d9b565b61121d8a60a0810161120a6101408301836156e0565b6112186101608f018f61571e565b613ea3565b61124f61122e6101c08c018c615752565b8c61018001358d6101a001358e60a001604001358f60a00160200135613f6f565b600061126c60208c01356112676101408e018e6156e0565b6140ac565b60008181526003602052604090205490915060ff16156112b8576040517fda2cdb7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611325908d908d908d908d908890600401615809565b602060405180830381865afa158015611342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611366919061556b565b61139c576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908e907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018e90526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa158015611454573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147891906154ac565b905060006362fc00db60e01b8f338960000160099054906101000a90046001600160a01b03168560200151876040516024016114e29594939291909485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926115b49291908690600401615843565b600060405180830381600087803b1580156115ce57600080fd5b505af11580156115e2573d6000803e3d6000fd5b5050505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166a919061558d565b6001600160a01b031663ad36d6cc8e6040518263ffffffff1660e01b815260040161169791815260200190565b602060405180830381865afa1580156116b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d8919061556b565b156117f6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f919061558d565b6001600160a01b031663be995dc28e338860000160099054906101000a90046001600160a01b03166040518463ffffffff1660e01b81526004016117bf939291909283526001600160a01b03918216602084015216604082015260600190565b600060405180830381600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b505050506118f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611878919061558d565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018f90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b505050505b60016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008e81526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549067ffffffffffffffff02191690556000820160096101000a8154906001600160a01b0302191690556001820160006101000a8154906001600160a01b0302191690556002820160006119ca9190614e99565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018f905260248201523360448201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b5050505050505050505b5050505050505050565b60008281526002602090815260408083206001600160a01b03851684529091528120611ab490614167565b90505b92915050565b600081815260026020908152604080832033845290915290206001810154611af89083906001600160a01b0316611af384613053565b61378d565b610624576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015611bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd2919061556b565b15611c09576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008681526002602090815260408083206001600160a01b0389168452909152812090611c3582613053565b6001830154909150611c529089906001600160a01b03168361378d565b15611c5e575050611ed2565b60006001826005811115611c7457611c746153d8565b03611c8d575060018201546001600160a01b0316611cc0565b6002826005811115611ca157611ca16153d8565b03611cc057508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611d02576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611d159060ff16600161587d565b9050611da081856002018a81548110611d3057611d306155ed565b9060005260206000200154866002018b6001611d4c9190615553565b81548110611d5c57611d5c6155ed565b90600052602060002001548a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b6000611dab8561426d565b90506000611db9828b615633565b8660040154611dc89190615553565b9050611e0b868a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925087915061429a9050565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8416178655611e3f866142c4565b6040805160ff851681524260208201526001600160a01b038d16918e917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e9086614167565b611ecb576040516001600160a01b038c16908d907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b5050505050505b505050505050565b6000600160ff83161015611f1a576040517f8c29db9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016000611f2882856158a2565b60ff168152602001908152602001600020549050919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fa3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612023573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612047919061556b565b1561207e576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156120ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212391906154ac565b6020810151909150612161576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101849052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561220b57600080fd5b505af115801561221f573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a5919061558d565b6001600160a01b031663ad36d6cc846040518263ffffffff1660e01b81526004016122d291815260200190565b602060405180830381865afa1580156122ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612313919061556b565b15612440577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239a919061558d565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152918216604482015291169063be995dc290606401600060405180830381600087803b15801561242757600080fd5b505af115801561243b573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316837fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161248091815260200190565b60405180910390a3505050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c081019190915260008381526002602081815260408084206001600160a01b03808816865290835293819020815160e081018352815460ff8116825267ffffffffffffffff6101008204168286015269010000000000000000009004861681840152600182015490951660608601529283018054825181850281018501909352808352608086019383018282801561257557602002820191906000526020600020905b815481526020019060010190808311612561575b5050505050815260200160038201548152602001600482015481525050905092915050565b60008281526002602090815260408083206001600160a01b03851684529091528120611ab490613053565b846000036125ff576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561265d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612681919061558d565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b81526004016126ae91815260200190565b602060405180830381865afa1580156126cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ef919061556b565b1561282f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612752573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612776919061558d565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa1580156127d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f9919061556b565b61282f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106128b357600361286182613053565b6005811115612872576128726153d8565b146128a9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128b38633613139565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015612934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295891906154ac565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661299d9190615553565b10156129d5576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612a10576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03163303612a53576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590612a625750844015155b15612aa15785854014612aa1576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae557612add60018b61561c565b6040518263ffffffff1660e01b8152600401612afb91815260200190565b608060405180830381865afa158015612b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3c91906154ac565b6020810151909150612baa57612ba5600186866000818110612b6057612b606155ed565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b612bf2565b612bf260018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c74919061558d565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612ca191815260200190565b602060405180830381865afa158015612cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce2919061556b565b15612de2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d69919061558d565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612dc557600080fd5b505af1158015612dd9573d6000803e3d6000fd5b50505050612ee0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e64919061558d565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612ec757600080fd5b505af1158015612edb573d6000803e3d6000fd5b505050505b612f7f8386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612f5991507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff1661561c565b7f000000000000000000000000000000000000000000000000000000000000000061429a565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612ff7836142c4565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff909116101561306d57506000919050565b81546000906130819060029060ff166158c5565b835460ff91909116159150610100900467ffffffffffffffff1642111561310d5780156130b15750600392915050565b82546130f6906130f1907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff16615553565b421190565b156131045750600392915050565b50600492915050565b61311683614167565b6131235750600592915050565b8061312f576002613132565b60015b9392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905591906131b990830182614e99565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff0514260405161320791815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561326d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613291919061558d565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b81526004016132be91815260200190565b602060405180830381865afa1580156132db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ff919061556b565b156134a1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613362573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613386919061558d565b6001600160a01b031663be995dc2837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8866040518263ffffffff1660e01b81526004016133e391815260200190565b602060405180830381865afa158015613400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613424919061558d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561348d57600080fd5b505af1158015611ed2573d6000803e3d6000fd5b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa15801561351f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613543919061556b565b156136bb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ca919061558d565b6001600160a01b03166336b8346983837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8876040518263ffffffff1660e01b815260040161362891815260200190565b602060405180830381865afa158015613645573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613669919061558d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401613473565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373d919061558d565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d90604401613473565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015613810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383491906154ac565b602001511461384557506000613132565b336001600160a01b03841614613887576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082600581111561389b5761389b6153d8565b14806138b8575060038260058111156138b6576138b66153d8565b145b156138ef576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061396690830182614e99565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2f919061558d565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b8152600401613a5c91815260200190565b602060405180830381865afa158015613a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9d919061556b565b15613b9d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b24919061558d565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613b8057600080fd5b505af1158015613b94573d6000803e3d6000fd5b50505050613ca2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c1f919061558d565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613c8957600080fd5b505af1158015613c9d573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613d0e5781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ab7565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610e37565b919050565b83856002018781548110613db157613db16155ed565b906000526020600020015414613df3576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dfc85614167565b613e62578260028601613e10886001615553565b81548110613e2057613e206155ed565b906000526020600020015403613e62576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060600135826080013514611ed2576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613ee4576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613f0f57613f0a613efc84615965565b613f0584615abf565b614365565b613f29565b613f29613f1b84615965565b613f2484615abf565b614409565b905080856080013514613f68576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a729061402c907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615c60565b602060405180830381865afa158015614049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406d919061556b565b6140a3576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050565b600060607f00000000000000000000000000000000000000000000000000000000000000006140df610120850185615752565b9050101561414c576141497f0000000000000000000000000000000000000000000000000000000000000000614119610120860186615752565b61414491507f000000000000000000000000000000000000000000000000000000000000000061561c565b61451a565b90505b61415f8461415985615965565b836145a6565b949350505050565b600060016141748361426d565b1192915050565b80518061418786611eda565b146141be576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000815181106141d1576141d16155ed565b60200260200101518414614211576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161421d60018361561c565b8151811061422d5761422d6155ed565b60200260200101518303613f68576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000906001906142819060ff16611eda565b61428b919061561c565b8260030154611ab79190615d3b565b82516142af9060028601906020860190614eb7565b50600484019190915560039092019190915550565b6142cd81614167565b614338576142fb7f000000000000000000000000000000000000000000000000000000000000000042615553565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6142fb7f000000000000000000000000000000000000000000000000000000000000000042615553565b50565b6040805160118082526102408201909252600091829190816020015b60608152602001906001900390816143815790505090506143a3848483614618565b6143d28461010001516040516020016143be91815260200190565b6040516020818303038152906040526148cb565b816010815181106143e5576143e56155ed565b60200260200101819052506143f98161493a565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b6060815260200190600190039081614425579050509050614447848483614618565b6144628461010001516040516020016143be91815260200190565b81601081518110614475576144756155ed565b602002602001018190525061449884610140015167ffffffffffffffff1661497e565b816011815181106144ab576144ab6155ed565b60200260200101819052506144ce84610160015167ffffffffffffffff1661497e565b816012815181106144e1576144e16155ed565b60200260200101819052506145078461018001516040516020016143be91815260200190565b816013815181106143e5576143e56155ed565b606060008267ffffffffffffffff81111561453757614537615036565b604051908082528060200260200182016040528015614560578160200160208202803683370190505b50905060005b8381101561459e5784828281518110614581576145816155ed565b60209081029190910101528061459681615d4f565b915050614566565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016145f99c9b9a99989796959493929190615dba565b6040516020818303038152906040528051906020012090509392505050565b61463283602001516040516020016143be91815260200190565b81600081518110614645576146456155ed565b6020026020010181905250816000015181600181518110614668576146686155ed565b602002602001018190525081602001518160028151811061468b5761468b6155ed565b60200260200101819052506146b08360e001516040516020016143be91815260200190565b816003815181106146c3576146c36155ed565b60200260200101819052506146e88360c001516040516020016143be91815260200190565b816004815181106146fb576146fb6155ed565b602002602001018190525081604001518160058151811061471e5761471e6155ed565b6020026020010181905250816060015181600681518110614741576147416155ed565b6020026020010181905250816080015181600781518110614764576147646155ed565b6020026020010181905250614786836060015167ffffffffffffffff1661497e565b81600881518110614799576147996155ed565b60200260200101819052506147bb836080015167ffffffffffffffff1661497e565b816009815181106147ce576147ce6155ed565b60200260200101819052508160a0015181600a815181106147f1576147f16155ed565b6020026020010181905250614813836040015167ffffffffffffffff1661497e565b81600b81518110614826576148266155ed565b60200260200101819052508160c0015181600c81518110614849576148496155ed565b60200260200101819052508160e0015181600d8151811061486c5761486c6155ed565b602002602001018190525081610100015181600e81518110614890576148906155ed565b60200260200101819052506148a88360a0015161497e565b81600f815181106148bb576148bb6155ed565b6020026020010181905250505050565b606080825160011480156148f957506080836000815181106148ef576148ef6155ed565b016020015160f81c105b15614905575081611ab7565b61491183516080614991565b83604051602001614923929190615e73565b604051602081830303815290604052905092915050565b6060600061494783614b87565b9050614955815160c0614991565b81604051602001614967929190615e73565b604051602081830303815290604052915050919050565b6060611ab761498c83614cbf565b6148cb565b6060806038841015614a1057604080516001808252818301909252906020820181803683370190505090506149c6838561587d565b60f81b816000815181106149dc576149dc6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ab4565b600060015b614a1f8187615d3b565b15614a455781614a2e81615d4f565b9250614a3e905061010082615633565b9050614a15565b614a50826001615553565b67ffffffffffffffff811115614a6857614a68615036565b6040519080825280601f01601f191660200182016040528015614a92576020820181803683370190505b509250614a9f858361587d565b614aaa90603761587d565b60f81b83600081518110614ac057614ac06155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614b7e57610100614b08828461561c565b614b1490610100615fc2565b614b1e9088615d3b565b614b2891906155d9565b60f81b838281518110614b3d57614b3d6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614b7681615d4f565b915050614af4565b50509392505050565b60608151600003614ba657505060408051600081526020810190915290565b6000805b8351811015614bed57838181518110614bc557614bc56155ed565b60200260200101515182614bd99190615553565b915080614be581615d4f565b915050614baa565b60008267ffffffffffffffff811115614c0857614c08615036565b6040519080825280601f01601f191660200182016040528015614c32576020820181803683370190505b50600092509050602081015b8551831015614cb6576000868481518110614c5b57614c5b6155ed565b602002602001015190506000602082019050614c7983828451614e1e565b878581518110614c8b57614c8b6155ed565b60200260200101515183614c9f9190615553565b925050508280614cae90615d4f565b935050614c3e565b50949350505050565b6060600082604051602001614cd691815260200190565b604051602081830303815290604052905060005b6020811015614d4557818181518110614d0557614d056155ed565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614d455780614d3d81615d4f565b915050614cea565b6000614d5282602061561c565b67ffffffffffffffff811115614d6a57614d6a615036565b6040519080825280601f01601f191660200182016040528015614d94576020820181803683370190505b50905060005b8151811015614cb6578383614dae81615d4f565b945081518110614dc057614dc06155ed565b602001015160f81c60f81b828281518110614ddd57614ddd6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614e1681615d4f565b915050614d9a565b8282825b60208110614e5a5781518352614e39602084615553565b9250614e46602083615553565b9150614e5360208261561c565b9050614e22565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906143629190614f02565b828054828255906000526020600020908101928215614ef2579160200282015b82811115614ef2578251825591602001919060010190614ed7565b50614efe929150614f02565b5090565b5b80821115614efe5760008155600101614f03565b600060208284031215614f2957600080fd5b5035919050565b6001600160a01b038116811461436257600080fd5b60008060408385031215614f5857600080fd5b823591506020830135614f6a81614f30565b809150509250929050565b60005b83811015614f90578181015183820152602001614f78565b83811115614f9f576000848401525b50505050565b60008151808452614fbd816020860160208601614f75565b601f01601f19169290920160200192915050565b602081526000611ab46020830184614fa5565b600080600080600060a08688031215614ffc57600080fd5b85359450602086013561500e81614f30565b9350604086013561501e81614f30565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff8111828210171561508957615089615036565b60405290565b604051610120810167ffffffffffffffff8111828210171561508957615089615036565b604051601f8201601f1916810167ffffffffffffffff811182821017156150dc576150dc615036565b604052919050565b600067ffffffffffffffff8211156150fe576150fe615036565b5060051b60200190565b6000602080838503121561511b57600080fd5b823567ffffffffffffffff81111561513257600080fd5b8301601f8101851361514357600080fd5b8035615156615151826150e4565b6150b3565b81815260059190911b8201830190838101908783111561517557600080fd5b928401925b828410156151935783358252928401929084019061517a565b979650505050505050565b60008083601f8401126151b057600080fd5b50813567ffffffffffffffff8111156151c857600080fd5b6020830191508360208260051b85010111156151e357600080fd5b9250929050565b600080600080600080600060a0888a03121561520557600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561522b57600080fd5b908901906101e0828c03121561524057600080fd5b9095506060890135908082111561525657600080fd5b6152628b838c0161519e565b909650945060808a013591508082111561527b57600080fd5b506152888a828b0161519e565b989b979a50959850939692959293505050565b6000806000806000608086880312156152b357600080fd5b8535945060208601356152c581614f30565b935060408601359250606086013567ffffffffffffffff8111156152e857600080fd5b6152f48882890161519e565b969995985093965092949392505050565b60006020828403121561531757600080fd5b813560ff81168114611ab457600080fd5b60006020808352610100830160ff8551168285015267ffffffffffffffff8286015116604085015260408501516001600160a01b0380821660608701528060608801511660808701525050608085015160e060a0860152818151808452610120870191508483019350600092505b808310156153b65783518252928401926001929092019190840190615396565b5060a087015160c087015260c087015160e08701528094505050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615442577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060008060006080868803121561546057600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156152e857600080fd5b80516fffffffffffffffffffffffffffffffff81168114613d9657600080fd5b6000608082840312156154be57600080fd5b6040516080810181811067ffffffffffffffff821117156154e1576154e1615036565b60405282516154ef81614f30565b8152602083810151908201526155076040840161548c565b60408201526155186060840161548c565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561556657615566615524565b500190565b60006020828403121561557d57600080fd5b81518015158114611ab457600080fd5b60006020828403121561559f57600080fd5b8151611ab481614f30565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826155e8576155e86155aa565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008282101561562e5761562e615524565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561566b5761566b615524565b500290565b600060a0828403121561568257600080fd5b60405160a0810181811067ffffffffffffffff821117156156a5576156a5615036565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261571457600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261571457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261578757600080fd5b83018035915067ffffffffffffffff8211156157a257600080fd5b6020019150600581901b36038213156151e357600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156157ec57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60608152600061581d6060830187896157ba565b82810360208401526158308186886157ba565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006158746060830184614fa5565b95945050505050565b600060ff821660ff84168060ff0382111561589a5761589a615524565b019392505050565b600060ff821660ff8416808210156158bc576158bc615524565b90039392505050565b600060ff8316806158d8576158d86155aa565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613d9657600080fd5b600082601f83011261591057600080fd5b81356020615920615151836150e4565b82815260059290921b8401810191818101908684111561593f57600080fd5b8286015b8481101561595a5780358352918301918301615943565b509695505050505050565b60006101a0823603121561597857600080fd5b615980615065565b823581526020830135602082015261599a604084016158e7565b60408201526159ab606084016158e7565b60608201526159bc608084016158e7565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff811115615a0757600080fd5b615a13368287016158ff565b828401525050610140615a278185016158e7565b90820152610160615a398482016158e7565b9082015261018092830135928101929092525090565b600082601f830112615a6057600080fd5b813567ffffffffffffffff811115615a7a57615a7a615036565b615a8d6020601f19601f840116016150b3565b818152846020838601011115615aa257600080fd5b816020850160208301376000918101602001919091529392505050565b60006101208236031215615ad257600080fd5b615ada61508f565b823567ffffffffffffffff80821115615af257600080fd5b615afe36838701615a4f565b83526020850135915080821115615b1457600080fd5b615b2036838701615a4f565b60208401526040850135915080821115615b3957600080fd5b615b4536838701615a4f565b60408401526060850135915080821115615b5e57600080fd5b615b6a36838701615a4f565b60608401526080850135915080821115615b8357600080fd5b615b8f36838701615a4f565b608084015260a0850135915080821115615ba857600080fd5b615bb436838701615a4f565b60a084015260c0850135915080821115615bcd57600080fd5b615bd936838701615a4f565b60c084015260e0850135915080821115615bf257600080fd5b615bfe36838701615a4f565b60e084015261010091508185013581811115615c1957600080fd5b615c2536828801615a4f565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615c7a6080840188614fa5565b8381036040850152858152818101600587901b820183018860005b89811015615d2257601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615cd857600080fd5b8b01868101903567ffffffffffffffff811115615cf457600080fd5b803603821315615d0357600080fd5b615d0e858284615c35565b958801959450505090850190600101615c95565b5050809450505050508260608301529695505050505050565b600082615d4a57615d4a6155aa565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615d8057615d80615524565b5060010190565b60008151602080840160005b83811015615daf57815187529582019590820190600101615d93565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615e61615e5b60da840186615d87565b84615d87565b9e9d5050505050505050505050505050565b60008351615e85818460208801614f75565b835190830190615e99818360208801614f75565b01949350505050565b600181815b80851115615efb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615ee157615ee1615524565b80851615615eee57918102915b93841c9390800290615ea7565b509250929050565b600082615f1257506001611ab7565b81615f1f57506000611ab7565b8160018114615f355760028114615f3f57615f5b565b6001915050611ab7565b60ff841115615f5057615f50615524565b50506001821b611ab7565b5060208310610133831016604e8410600b8410161715615f7e575081810a611ab7565b615f888383615ea2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615fba57615fba615524565b029392505050565b6000611ab48383615f0356fea164736f6c634300080f000a" +var ColosseumDeployedBin = "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c806380ab1313116100ee578063b3e7766d11610097578063d5145ebc11610071578063d5145ebc146105d7578063e39a219c146105fe578063e9371a2c14610611578063fc9d84df1461063157600080fd5b8063b3e7766d14610569578063cfb4474d14610589578063d2ee3075146105b057600080fd5b80639ded3952116100c85780639ded39521461051c578063a41483e314610543578063a6ade11f1461055657600080fd5b806380ab1313146104c25780638f3a6c88146104d55780638f86c803146104fc57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d05780635a6b011f146103f757806362fc00db1461049c5780636fe0e559146104af57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614e01565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614e2f565b610644565b005b6102aa61024c366004614e2f565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614e01565b6106c7565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614eb7565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61045a610405366004614e01565b6004602052600090815260409020805460018201546002909201546001600160a01b0390911691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b604080516001600160a01b03909516855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080016101ed565b61023c6104aa366004614eca565b6107a2565b61023c6104bd366004614fee565b610e96565b61023c6104d03660046150d0565b61113e565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f61050a366004614e01565b60016020526000908152604090205481565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610551366004614e01565b611b3e565b61023c610564366004615181565b611baf565b61057c610577366004614e2f565b611e82565b6040516101ed91906151eb565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61060c366004614e01565b611efa565b61062461061f366004614e2f565b612319565b6040516101ed919061525e565b61023c61063f36600461529f565b61234b565b600360008381526002602090815260408083206001600160a01b0386168452909152902061067190612dd9565b60058111156106825761068261522f565b146106b9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282612eb7565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161073991815260200190565b608060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190615303565b604001516fffffffffffffffffffffffffffffffff1661079a91906153aa565b101592915050565b6107aa613513565b6107b385613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190615303565b6020015114610893576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090206001015482146108dd576040517f90e78fa500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906153c2565b6001600160a01b0316846001600160a01b03161415806109b957506000858152600460205260409020546001600160a01b03848116911614155b156109f0576040517f8036a47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526003602052604090205460ff16610a38576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905587835260049182905280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002019290925590517fe6646723000000000000000000000000000000000000000000000000000000008152908101869052602481018390526001600160a01b0384811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd191906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b8152600401610bfe91815260200190565b602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f91906153df565b15610e4b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906153c2565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038581166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc591906153c2565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0385811660248301528681166044830152919091169063be995dc290606401600060405180830381600087803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b505050505b836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610e8791815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610eb65750600054600160ff909116105b80610ed05750303b158015610ed0575060005460ff166001145b610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fbf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610fcd9190615430565b15611004576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b835181101561107d5783818151811061102457611024615444565b60200260200101516001600083815260200190815260200160002081905550600184828151811061105757611057615444565b60200260200101516110699190615473565b611073908361548a565b9150600101611009565b507f000000000000000000000000000000000000000000000000000000000000000081146110d7576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5080156106c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61114787613577565b600087815260026020908152604080832033845290915281209061116a82612dd9565b6001830154909150611187908a906001600160a01b031683613653565b15611193575050611b35565b60058160058111156111a7576111a761522f565b141580156111c7575060048160058111156111c4576111c461522f565b14155b156111fe576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611239888361121a611215368c90038c018c6154c7565b613b72565b61122f611215368d90038d0160a08e016154c7565b8b60a08101613c61565b6112628760a0810161124f610140830183615537565b61125d6101608c018c615575565b613d69565b61128e6112736101c08901896155a9565b6101808a01356101a08b013560e08c013560c08d0135613e2e565b60006112ab60208901356112a66101408b018b615537565b613f62565b60008181526003602052604090205490915060ff16156112f7576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611364908a908a908a908a908890600401615660565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a591906153df565b6113db576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908b907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018b90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190615303565b84546020820151604051602481018f905233604482015269010000000000000000009092046001600160a01b03166064830152608482015260a481018490529091506000907f62fc00db000000000000000000000000000000000000000000000000000000009060c40160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926115f3929190869060040161569a565b600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50505060008d815260046020818152604092839020865181546001600160a01b039182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255828801516001830155848801516060909801516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000298169790971760029091015582517fb98debbf00000000000000000000000000000000000000000000000000000000815292517f00000000000000000000000000000000000000000000000000000000000000009096169563b98debbf9550838301945090929091908290030181865afa158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906153c2565b6001600160a01b031663ad36d6cc8b6040518263ffffffff1660e01b815260040161177991815260200190565b602060405180830381865afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba91906153df565b156118d6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906153c2565b83546040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018d90523360248201526001600160a01b0369010000000000000000009092048216604482015291169063be995dc290606401600060405180830381600087803b1580156118b957600080fd5b505af11580156118cd573d6000803e3d6000fd5b505050506119d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195891906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018c90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156119bb57600080fd5b505af11580156119cf573d6000803e3d6000fd5b505050505b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558d8452600280845282852033865290935290832080547fffffff000000000000000000000000000000000000000000000000000000000016815590810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190611a8290830182614d83565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018c905260248201523360448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e664672390606401600060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050505050505b50505050505050565b600081815260026020908152604080832033845290915290206001810154611b799083906001600160a01b0316611b7484612dd9565b613653565b6106c3576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885613577565b60008581526002602090815260408083206001600160a01b0388168452909152812090611be482612dd9565b6001830154909150611c019088906001600160a01b031683613653565b15611c0d575050611e7b565b60006001826005811115611c2357611c2361522f565b03611c3c575060018201546001600160a01b0316611c6f565b6002826005811115611c5057611c5061522f565b03611c6f57508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611cb1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611cc49060ff1660016156d4565b9050611d4f81856002018981548110611cdf57611cdf615444565b9060005260206000200154866002018a6001611cfb91906153aa565b81548110611d0b57611d0b615444565b906000526020600020015489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b6000611d5a8561412e565b9050611db585888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611da092508691508d905061548a565b8860040154611daf91906153aa565b84614173565b84547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316178555611de98561419d565b6040805160ff841681524260208201526001600160a01b038b16918c917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e3a8561423b565b611e75576040516001600160a01b038a16908b907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b50505050505b5050505050565b60008281526002602081815260408084206001600160a01b0386168552825292839020909101805483518184028101840190945280845260609392830182828015611eec57602002820191906000526020600020905b815481526020019060010190808311611ed8575b505050505090505b92915050565b611f02613513565b611f0b81613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190615303565b6020810151909150611fee576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101839052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561209857600080fd5b505af11580156120ac573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213291906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161215f91815260200190565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906153df565b156122cd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222791906153c2565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152918216604482015291169063be995dc290606401600060405180830381600087803b1580156122b457600080fd5b505af11580156122c8573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316827fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161230d91815260200190565b60405180910390a35050565b60008281526002602090815260408083206001600160a01b0385168452909152812061234490612dd9565b9392505050565b84600003612385576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240791906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b815260040161243491815260200190565b602060405180830381865afa158015612451573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247591906153df565b156125b5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc91906153c2565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f91906153df565b6125b5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106126395760036125e782612dd9565b60058111156125f8576125f861522f565b1461262f576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126398633612eb7565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190615303565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661272391906153aa565b101561275b576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612796576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b031633036127d9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015906127e85750844015155b156128275785854014612827576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761286360018b615473565b6040518263ffffffff1660e01b815260040161288191815260200190565b608060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c29190615303565b60208101519091506129305761292b6001868660008181106128e6576128e6615444565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b612978565b61297860018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa91906153c2565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612a2791815260200190565b602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6891906153df565b15612b68577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef91906153c2565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612b4b57600080fd5b505af1158015612b5f573d6000803e3d6000fd5b50505050612c66565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bea91906153c2565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612c4d57600080fd5b505af1158015612c61573d6000803e3d6000fd5b505050505b612d058386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612cdf91507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff16615473565b7f0000000000000000000000000000000000000000000000000000000000000000614173565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612d7d8361419d565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612df357506000919050565b8154600090612e079060029060ff166156f9565b835460ff91909116159150610100900467ffffffffffffffff16421115612e8c578015612e375750600392915050565b8254612e73907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff166153aa565b421115612e835750600392915050565b50600492915050565b612e958361423b565b612ea25750600592915050565b80612eae576002612344565b60019392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612f3790830182614d83565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612f8591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f91906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161303c91815260200190565b602060405180830381865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d91906153df565b15613227577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310491906153c2565b6001600160a01b031663be995dc2837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8866040518263ffffffff1660e01b815260040161316191815260200190565b602060405180830381865afa15801561317e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a291906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050505050565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156132a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c991906153df565b15613441577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335091906153c2565b6001600160a01b03166336b8346983837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8876040518263ffffffff1660e01b81526004016133ae91815260200190565b602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef91906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b0391821660248401521660448201526064016131f1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c391906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d906044016131f1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614613575576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156135f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361991906153df565b15613650576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156136d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fa9190615303565b602001511461370b57506000612344565b336001600160a01b0384161461374d576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260058111156137615761376161522f565b148061377e5750600382600581111561377c5761377c61522f565b145b156137b5576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061382c90830182614d83565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f591906153c2565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b815260040161392291815260200190565b602060405180830381865afa15801561393f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396391906153df565b15613a63577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea91906153c2565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613a4657600080fd5b505af1158015613a5a573d6000803e3d6000fd5b50505050613b68565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae591906153c2565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613bd45781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ef4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610f58565b919050565b83856002018781548110613c7757613c77615444565b906000526020600020015414613cb9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cc28561423b565b613d28578260028601613cd68860016153aa565b81548110613ce657613ce6615444565b906000526020600020015403613d28576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060013582608001351461321f576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613daa576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613dd557613dd0613dc284615799565b613dcb846158f3565b61424f565b613def565b613def613de184615799565b613dea846158f3565b6142f3565b905080856080013514611e7b576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a7290613eeb907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615a94565b602060405180830381865afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c91906153df565b611b35576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060607f0000000000000000000000000000000000000000000000000000000000000000613f956101208501856155a9565b9050101561400257613fff7f0000000000000000000000000000000000000000000000000000000000000000613fcf6101208601866155a9565b613ffa91507f0000000000000000000000000000000000000000000000000000000000000000615473565b614404565b90505b6140158461400f85615799565b83614490565b949350505050565b80516001600061402d8288615b6f565b60ff1681526020019081526020016000205414614076576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008151811061408957614089615444565b602002602001015183146140c9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600182516140d89190615473565b815181106140e8576140e8615444565b60200260200101518203614128576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b80546000906001908190839061414890839060ff16615b6f565b60ff168152602001908152602001600020546141649190615473565b8260030154611ef49190615b92565b82516141889060028601906020860190614da1565b50600484019190915560039092019190915550565b6141a68161423b565b614211576141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b600060016142488361412e565b1192915050565b6040805160118082526102408201909252600091829190816020015b606081526020019060019003908161426b57905050905061428d848483614502565b6142bc8461010001516040516020016142a891815260200190565b6040516020818303038152906040526147b5565b816010815181106142cf576142cf615444565b60200260200101819052506142e381614824565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b606081526020019060019003908161430f579050509050614331848483614502565b61434c8461010001516040516020016142a891815260200190565b8160108151811061435f5761435f615444565b602002602001018190525061438284610140015167ffffffffffffffff16614868565b8160118151811061439557614395615444565b60200260200101819052506143b884610160015167ffffffffffffffff16614868565b816012815181106143cb576143cb615444565b60200260200101819052506143f18461018001516040516020016142a891815260200190565b816013815181106142cf576142cf615444565b606060008267ffffffffffffffff81111561442157614421614f1c565b60405190808252806020026020018201604052801561444a578160200160208202803683370190505b50905060005b83811015614488578482828151811061446b5761446b615444565b60209081029190910101528061448081615ba6565b915050614450565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016144e39c9b9a99989796959493929190615c11565b6040516020818303038152906040528051906020012090509392505050565b61451c83602001516040516020016142a891815260200190565b8160008151811061452f5761452f615444565b602002602001018190525081600001518160018151811061455257614552615444565b602002602001018190525081602001518160028151811061457557614575615444565b602002602001018190525061459a8360e001516040516020016142a891815260200190565b816003815181106145ad576145ad615444565b60200260200101819052506145d28360c001516040516020016142a891815260200190565b816004815181106145e5576145e5615444565b602002602001018190525081604001518160058151811061460857614608615444565b602002602001018190525081606001518160068151811061462b5761462b615444565b602002602001018190525081608001518160078151811061464e5761464e615444565b6020026020010181905250614670836060015167ffffffffffffffff16614868565b8160088151811061468357614683615444565b60200260200101819052506146a5836080015167ffffffffffffffff16614868565b816009815181106146b8576146b8615444565b60200260200101819052508160a0015181600a815181106146db576146db615444565b60200260200101819052506146fd836040015167ffffffffffffffff16614868565b81600b8151811061471057614710615444565b60200260200101819052508160c0015181600c8151811061473357614733615444565b60200260200101819052508160e0015181600d8151811061475657614756615444565b602002602001018190525081610100015181600e8151811061477a5761477a615444565b60200260200101819052506147928360a00151614868565b81600f815181106147a5576147a5615444565b6020026020010181905250505050565b606080825160011480156147e357506080836000815181106147d9576147d9615444565b016020015160f81c105b156147ef575081611ef4565b6147fb8351608061487b565b8360405160200161480d929190615cca565b604051602081830303815290604052905092915050565b6060600061483183614a71565b905061483f815160c061487b565b81604051602001614851929190615cca565b604051602081830303815290604052915050919050565b6060611ef461487683614ba9565b6147b5565b60608060388410156148fa57604080516001808252818301909252906020820181803683370190505090506148b083856156d4565b60f81b816000815181106148c6576148c6615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612344565b600060015b6149098187615b92565b1561492f578161491881615ba6565b925061492890506101008261548a565b90506148ff565b61493a8260016153aa565b67ffffffffffffffff81111561495257614952614f1c565b6040519080825280601f01601f19166020018201604052801561497c576020820181803683370190505b50925061498985836156d4565b6149949060376156d4565b60f81b836000815181106149aa576149aa615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614a68576101006149f28284615473565b6149fe90610100615e19565b614a089088615b92565b614a129190615430565b60f81b838281518110614a2757614a27615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614a6081615ba6565b9150506149de565b50509392505050565b60608151600003614a9057505060408051600081526020810190915290565b6000805b8351811015614ad757838181518110614aaf57614aaf615444565b60200260200101515182614ac391906153aa565b915080614acf81615ba6565b915050614a94565b60008267ffffffffffffffff811115614af257614af2614f1c565b6040519080825280601f01601f191660200182016040528015614b1c576020820181803683370190505b50600092509050602081015b8551831015614ba0576000868481518110614b4557614b45615444565b602002602001015190506000602082019050614b6383828451614d08565b878581518110614b7557614b75615444565b60200260200101515183614b8991906153aa565b925050508280614b9890615ba6565b935050614b28565b50949350505050565b6060600082604051602001614bc091815260200190565b604051602081830303815290604052905060005b6020811015614c2f57818181518110614bef57614bef615444565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614c2f5780614c2781615ba6565b915050614bd4565b6000614c3c826020615473565b67ffffffffffffffff811115614c5457614c54614f1c565b6040519080825280601f01601f191660200182016040528015614c7e576020820181803683370190505b50905060005b8151811015614ba0578383614c9881615ba6565b945081518110614caa57614caa615444565b602001015160f81c60f81b828281518110614cc757614cc7615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614d0081615ba6565b915050614c84565b8282825b60208110614d445781518352614d236020846153aa565b9250614d306020836153aa565b9150614d3d602082615473565b9050614d0c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906136509190614dec565b828054828255906000526020600020908101928215614ddc579160200282015b82811115614ddc578251825591602001919060010190614dc1565b50614de8929150614dec565b5090565b5b80821115614de85760008155600101614ded565b600060208284031215614e1357600080fd5b5035919050565b6001600160a01b038116811461365057600080fd5b60008060408385031215614e4257600080fd5b823591506020830135614e5481614e1a565b809150509250929050565b60005b83811015614e7a578181015183820152602001614e62565b838111156141285750506000910152565b60008151808452614ea3816020860160208601614e5f565b601f01601f19169290920160200192915050565b6020815260006123446020830184614e8b565b600080600080600060a08688031215614ee257600080fd5b853594506020860135614ef481614e1a565b93506040860135614f0481614e1a565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b60405290565b604051610120810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b604051601f8201601f1916810167ffffffffffffffff81118282101715614fc257614fc2614f1c565b604052919050565b600067ffffffffffffffff821115614fe457614fe4614f1c565b5060051b60200190565b6000602080838503121561500157600080fd5b823567ffffffffffffffff81111561501857600080fd5b8301601f8101851361502957600080fd5b803561503c61503782614fca565b614f99565b81815260059190911b8201830190838101908783111561505b57600080fd5b928401925b8284101561507957833582529284019290840190615060565b979650505050505050565b60008083601f84011261509657600080fd5b50813567ffffffffffffffff8111156150ae57600080fd5b6020830191508360208260051b85010111156150c957600080fd5b9250929050565b600080600080600080600060a0888a0312156150eb57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561511157600080fd5b908901906101e0828c03121561512657600080fd5b9095506060890135908082111561513c57600080fd5b6151488b838c01615084565b909650945060808a013591508082111561516157600080fd5b5061516e8a828b01615084565b989b979a50959850939692959293505050565b60008060008060006080868803121561519957600080fd5b8535945060208601356151ab81614e1a565b935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b6151da88828901615084565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561522357835183529284019291840191600101615207565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615299577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000806000608086880312156152b757600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b80516fffffffffffffffffffffffffffffffff81168114613c5c57600080fd5b60006080828403121561531557600080fd5b6040516080810181811067ffffffffffffffff8211171561533857615338614f1c565b604052825161534681614e1a565b81526020838101519082015261535e604084016152e3565b604082015261536f606084016152e3565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156153bd576153bd61537b565b500190565b6000602082840312156153d457600080fd5b815161234481614e1a565b6000602082840312156153f157600080fd5b8151801515811461234457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261543f5761543f615401565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000828210156154855761548561537b565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154c2576154c261537b565b500290565b600060a082840312156154d957600080fd5b60405160a0810181811067ffffffffffffffff821117156154fc576154fc614f1c565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261556b57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261556b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155de57600080fd5b83018035915067ffffffffffffffff8211156155f957600080fd5b6020019150600581901b36038213156150c957600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561564357600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615674606083018789615611565b8281036020840152615687818688615611565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006156cb6060830184614e8b565b95945050505050565b600060ff821660ff84168060ff038211156156f1576156f161537b565b019392505050565b600060ff83168061570c5761570c615401565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613c5c57600080fd5b600082601f83011261574457600080fd5b8135602061575461503783614fca565b82815260059290921b8401810191818101908684111561577357600080fd5b8286015b8481101561578e5780358352918301918301615777565b509695505050505050565b60006101a082360312156157ac57600080fd5b6157b4614f4b565b82358152602083013560208201526157ce6040840161571b565b60408201526157df6060840161571b565b60608201526157f06080840161571b565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561583b57600080fd5b61584736828701615733565b82840152505061014061585b81850161571b565b9082015261016061586d84820161571b565b9082015261018092830135928101929092525090565b600082601f83011261589457600080fd5b813567ffffffffffffffff8111156158ae576158ae614f1c565b6158c16020601f19601f84011601614f99565b8181528460208386010111156158d657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561590657600080fd5b61590e614f75565b823567ffffffffffffffff8082111561592657600080fd5b61593236838701615883565b8352602085013591508082111561594857600080fd5b61595436838701615883565b6020840152604085013591508082111561596d57600080fd5b61597936838701615883565b6040840152606085013591508082111561599257600080fd5b61599e36838701615883565b606084015260808501359150808211156159b757600080fd5b6159c336838701615883565b608084015260a08501359150808211156159dc57600080fd5b6159e836838701615883565b60a084015260c0850135915080821115615a0157600080fd5b615a0d36838701615883565b60c084015260e0850135915080821115615a2657600080fd5b615a3236838701615883565b60e084015261010091508185013581811115615a4d57600080fd5b615a5936828801615883565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615aae6080840188614e8b565b8381036040850152858152818101600587901b820183018860005b89811015615b5657601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615b0c57600080fd5b8b01868101903567ffffffffffffffff811115615b2857600080fd5b803603821315615b3757600080fd5b615b42858284615a69565b958801959450505090850190600101615ac9565b5050809450505050508260608301529695505050505050565b600060ff821660ff841680821015615b8957615b8961537b565b90039392505050565b600082615ba157615ba1615401565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bd757615bd761537b565b5060010190565b60008151602080840160005b83811015615c0657815187529582019590820190600101615bea565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615cb8615cb260da840186615bde565b84615bde565b9e9d5050505050505050505050505050565b60008351615cdc818460208801614e5f565b835190830190615cf0818360208801614e5f565b01949350505050565b600181815b80851115615d5257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d3857615d3861537b565b80851615615d4557918102915b93841c9390800290615cfe565b509250929050565b600082615d6957506001611ef4565b81615d7657506000611ef4565b8160018114615d8c5760028114615d9657615db2565b6001915050611ef4565b60ff841115615da757615da761537b565b50506001821b611ef4565b5060208310610133831016604e8410600b8410161715615dd5575081810a611ef4565b615ddf8383615cf9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615e1157615e1161537b565b029392505050565b60006123448383615d5a56fea164736f6c634300080f000a" func init() { diff --git a/kroma-bindings/bindings/validatormanager.go b/kroma-bindings/bindings/validatormanager.go index c5e85409c..adb91fe1d 100644 --- a/kroma-bindings/bindings/validatormanager.go +++ b/kroma-bindings/bindings/validatormanager.go @@ -48,7 +48,7 @@ type IValidatorManagerConstructorParams struct { // ValidatorManagerMetaData contains all meta data concerning the ValidatorManager contract. var ValidatorManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_constructorParams\",\"type\":\"tuple\",\"internalType\":\"structIValidatorManager.ConstructorParams\",\"components\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_assetManager\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"},{\"name\":\"_trustedValidator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_commissionChangeDelaySeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_roundDurationSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_softJailPeriodSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_hardJailPeriodSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_jailThreshold\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_maxOutputFinalizations\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_baseReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minRegisterAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minActivateAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BASE_REWARD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_CHANGE_DELAY_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_RATE_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"HARD_JAIL_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"JAIL_THRESHOLD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_OUTPUT_FINALIZATIONS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_ACTIVATE_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_REGISTER_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROUND_DURATION_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SOFT_JAIL_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TRUSTED_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateValidator\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activatedValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activatedValidatorTotalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"afterSubmitL2Output\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bondValidatorKro\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canFinalizeCommissionChangeAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkSubmissionEligibility\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizeCommissionChange\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCommissionRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingCommissionRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIValidatorManager.ValidatorStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inJail\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initCommissionChange\",\"inputs\":[{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isActive\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"jailExpiresAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"noSubmissionCount\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerValidator\",\"inputs\":[{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"withdrawAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revertSlash\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tryActivateValidator\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tryUnjail\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unbondValidatorKro\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateValidatorTree\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tryRemove\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ChallengeRewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"baseReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"boostedReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashReverted\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Slashed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorActivated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCommissionChangeFinalized\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCommissionChangeInitiated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorJailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRegistered\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activated\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"assets\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorStopped\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stopsAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorUnjailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAsset\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConstructorParams\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxCommissionRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedCommissionChangeDelay\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedJailPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitiatedCommissionChange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotSelectedPriorityValidator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameCommissionRate\",\"inputs\":[]}]", - Bin: "0x6102006040523480156200001257600080fd5b5060405162005aeb38038062005aeb83398101604081905262000035916200017d565b8061016001516001600160801b03168161014001516001600160801b031611156200007357604051631510b77f60e01b815260040160405180910390fd5b80516001600160a01b0390811660809081526020830151821660a0908152604084015190921660c0908152610140808501516001600160801b0390811660e090815261016080880151831661010090815260608901518416610120908152968901518416909452958701518216909552918501518216610180529284015181166101a0529183015182166101c05290910151166101e05262000284565b60405161018081016001600160401b03811182821017156200014257634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200016057600080fd5b919050565b80516001600160801b03811681146200016057600080fd5b600061018082840312156200019157600080fd5b6200019b62000110565b620001a68362000148565b8152620001b66020840162000148565b6020820152620001c96040840162000148565b6040820152620001dc6060840162000165565b6060820152620001ef6080840162000165565b60808201526200020260a0840162000165565b60a08201526200021560c0840162000165565b60c08201526200022860e0840162000165565b60e08201526101006200023d81850162000165565b908201526101206200025184820162000165565b908201526101406200026584820162000165565b908201526101606200027984820162000165565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516156706200047b6000396000818161038d015281816149a201528181614a0d01528181614a4f0152614ebb0152600081816108580152612b7201526000818161043201526130c50152600081816103e401526134120152600081816107bb01526134380152600081816104590152610ec40152600081816105c1015281816115000152611c6e0152600081816106f901528181610a9a0152610d2e015260008181610366015281816108cf0152610c1901526000818161040b0152610f2101526000818161052901528181610a2901528181610c4d01528181610d620152818161103e015281816114120152818161198601528181611abc01528181611dfe01528181611f9901528181612193015281816122950152818161238c01528181612d8901528181612ebf0152818161490001528181614adb01528181614b840152614e360152600081816102dc01528181610e2b015281816112060152818161131001528181611884015281816119b701528181611cbe01528181611d5001528181611e940152818161206b01528181612967015281816129ed01528181612a7101528181612bf701528181612c9e0152818161301e015281816131c2015261327601526156706000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461521d565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b61032e610b2e565b6103ca6103c5366004615266565b610bb9565b60405161031291906152b2565b6102fe610e15565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161031291906152f3565b6105016104d2366004615266565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f366004615374565b610f43565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b61032e6110b8565b61032e610561366004615266565b6111fb565b61032e610574366004615266565b61130e565b61032e611472565b61033861058f366004615266565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6105016105f1366004615266565b611683565b61032e6106043660046153ad565b6116b6565b61032e610617366004615266565b611882565b61032e61062a3660046153c8565b6119b5565b61068461063d366004615266565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b610338610729366004615266565b611c4f565b61032e61073c3660046153ed565b611cb3565b61032e61074f366004615406565b611e92565b610787610762366004615266565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a1612265565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6107876107eb366004615266565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c366004615266565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e366004615266565b61228a565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b600061088533610bb9565b600581111561089657610896615283565b146108cd576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff16101561094b576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610989576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000000000000000000000000000000000000000000909116906319412a2090606401600060405180830381600087803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610acf57610acf3361234e565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610b3933610bb9565b6005811115610b4a57610b4a615283565b141580610b775750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610bae576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bb73361234e565b565b6001600160a01b03811660009081526004602052604081205460ff16610be157506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cba919061542d565b6fffffffffffffffffffffffffffffffff161015610cda57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690638abf0af090602401602060405180830381865afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061542d565b6fffffffffffffffffffffffffffffffff161015610dfe5780610df55750600292915050565b50600492915050565b80610e0c5750600392915050565b50600592915050565b600080546001600160a01b031615610f1e5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eab919061544a565b9050804210610f0d576000610ec08242615492565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610f0b576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610f4e83610bb9565b9050818015610f8957506001816005811115610f6c57610f6c615283565b1480610f8957506004816005811115610f8757610f87615283565b145b15610fe757610f99600184612446565b15610fe257826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051610fd991815260200190565b60405180910390a25b505050565b6004816005811115610ffb57610ffb615283565b10610fe2576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526110b29185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a9919061542d565b600191906125e8565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611110576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff909116111561116d576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611176336128fd565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a260036111dc33610bb9565b60058111156111ed576111ed615283565b03610bb757610bb73361234e565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461125d576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611267610e15565b90506001600160a01b03808216148015906112945750806001600160a01b0316826001600160a01b031614155b156112cb576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d482611683565b61130a576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139091906154a9565b6001600160a01b0316336001600160a01b0316146113da576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638c1516c7906024015b600060405180830381600087803b15801561145757600080fd5b505af115801561146b573d6000803e3d6000fd5b5050505050565b600261147d33610bb9565b600581111561148e5761148e615283565b10806114ba5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156114f1576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006114fc33611c4f565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff160361157b576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff164210156115c7576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561169083610bb9565b60058111156116a1576116a1615283565b036116ae57506001919050565b506000919050565b60026116c133610bb9565b60058111156116d2576116d2615283565b10806116fe5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611735576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff83161115611782576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff6201000090910481169083168190036117cb576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190491906154a9565b6001600160a01b0316336001600160a01b03161461194e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a83871729060240161143d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3791906154a9565b6001600160a01b0316336001600160a01b031614611a81576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063536afae4906024016020604051808303816000875af1158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b919061542d565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611c3083610bb9565b6005811115611c4157611c41615283565b03610fe257610fe28261234e565b6001600160a01b038116600090815260046020526040812054611cad907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff166154c6565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d15576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1d612962565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc391906154a9565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f000000000000000000000000000000000000000000000000000000000000000090911690638c1516c790602401600060405180830381600087803b158015611e4457600080fd5b505af1158015611e58573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611e82905057611e7d816128fd565b611e8a565b611e8a613098565b61130a61316f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1491906154a9565b6001600160a01b0316336001600160a01b031614611f5e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690635636aabd906024016020604051808303816000875af1158015611fe4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612008919061542d565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a3612068826000613409565b837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120eb919061544a565b1161214357600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161790556110b2565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af11580156121dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612200919061542d565b905061220d836000610f43565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122859063ffffffff6401000000008204811691166154fa565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146122ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122f782610bb9565b600581111561230857612308615283565b14801561233d57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b1561234b5761234b8161234e565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124009183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa1580156123d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f7919061542d565b600191906135b1565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a4260405161243b91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203612478576000915050611cad565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff82161561258f5763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906124ed565b6125998684613b36565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361261a5760009150506128f6565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156127ca5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156127ba5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612719565b506127c587846142c2565b6128ee565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156128e35763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612841565b506128ee87846144ce565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff161561234b576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e7919061544a565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6d919061544a565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af191906154a9565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b1e91815260200190565b602060405180830381865afa158015612b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5f919061551f565b612b6c5760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612bc35750828411155b15612fd7576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6a919061551f565b15612fd7576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1191906154a9565b90506000806000612d21846148f9565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b158015612dcf57600080fd5b505af1158015612de3573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612fb7576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af1158015612f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2c919061542d565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612fc2856000610f43565b87600101975085600101955050505050612b70565b6fffffffffffffffffffffffffffffffff82161561308d576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b15801561306a57600080fd5b505af115801561307e573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b03166130aa57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff161061311b57600054610bb7906001600160a01b03166001613409565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561321e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613242919061544a565b90506000826effffffffffffffffffffffffffffff161180156132655750600081115b156133dd5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576132a6600185615492565b6040518263ffffffff1660e01b81526004016132c491815260200190565b608060405180830381865afa1580156132e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613305919061553c565b9050600083826020015143414460014361331f9190615492565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613390919061560e565b905061339d600182614c2a565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061130a9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b600081613436577f0000000000000000000000000000000000000000000000000000000000000000613458565b7f00000000000000000000000000000000000000000000000000000000000000005b9050600061348f846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6134a25761349d82426154c6565b6134d8565b6001600160a01b0384166000908152600560205260409020546134d89083906fffffffffffffffffffffffffffffffff166154c6565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2613571600185612446565b156110b257836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161167591815260200190565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff1660000361388c57845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036139c85763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556139bf87846142c2565b50505050505050565b8054600160e01b900463ffffffff16600003613a9e5763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556139bf87846142c2565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613b1e578054600160e01b900463ffffffff169150613b30565b8054600160c01b900463ffffffff1691505b506138a1565b63ffffffff8082166000908152600184016020526040812080549092600160c01b909104169003613e19578054600160e01b900463ffffffff16600003613cc857805474010000000000000000000000000000000000000000900463ffffffff16600003613bc95782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613c84565b600181015460ff1615613c3157805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613c84565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906142bc565b8054600160e01b900463ffffffff16600003613f8057805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906142bc565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff6101009283900481169290910416111561414e57805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906142bc565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613b36565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906143505750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b156110b257815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff1991821617909155875496549095168352808320805490951674010000000000000000000000000000000000000000968790048916179094559454849004861680825291870190945281842080549390930490941683529091206142fd565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561471757600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610fe257805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c16179055885486900487168086529282528385205490971684529590955290208054909516909217909355905404166144cf565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610fe257805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c16179055885486900487168086529282528385205490971684529590955290208054909516909217909355905404166144cf565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561495c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061498091906154a9565b6001600160a01b0316846001600160a01b0316036149c65750600091508190507f0000000000000000000000000000000000000000000000000000000000000000614c23565b6001600160a01b03841660009081526004602052604081205462010000900460ff16906149f286614df9565b9050600080614a376fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064614f2f565b9050614a7a6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390614f2f565b9150614a9d6fffffffffffffffffffffffffffffffff8416606486810390614f2f565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000000000000000000000000000000000000000000169063981cee5390602401602060405180830381865afa158015614b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b46919061542d565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690636b9ffeac90602401602060405180830381865afa158015614bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bef919061542d565b90506000614c126fffffffffffffffffffffffffffffffff861684808501614f2f565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614cc35763ffffffff9081166000908152600185016020526040902054600160c01b900416614c42565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614d5c5763ffffffff1660009081526001840160205260409020546001600160a01b03169050611cad565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff90811690940393848116700100000000000000000000000000000000909204161115614def5763ffffffff9081166000908152600185016020526040902054600160e01b900416614c42565b6000915050611cad565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa158015614e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ea1919061542d565b90506000614ee46fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064614f2f565b9050614f27816fffffffffffffffffffffffffffffffff1665010000000000614f20856fffffffffffffffffffffffffffffffff166064614fe3565b91906150aa565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611614fb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff168181614fd957614fd96155df565b0495945050505050565b6000808383108015614ffc576001811461500f5761501e565b650100000000008502849004915061501e565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611cad576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615102578382816150f8576150f86155df565b04925050506128f6565b80841161516b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f7700000000000000000000006044820152606401614faf565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff8116811461234b57600080fd5b803560ff8116811461520357600080fd5b919050565b6001600160a01b038116811461234b57600080fd5b60008060006060848603121561523257600080fd5b833561523d816151d4565b925061524b602085016151f2565b9150604084013561525b81615208565b809150509250925092565b60006020828403121561527857600080fd5b81356128f681615208565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600683106152ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561532057858101830151858201604001528201615304565b81811115615332576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b801515811461234b57600080fd5b6000806040838503121561538757600080fd5b823561539281615208565b915060208301356153a281615366565b809150509250929050565b6000602082840312156153bf57600080fd5b6128f6826151f2565b600080604083850312156153db57600080fd5b8235915060208301356153a281615208565b6000602082840312156153ff57600080fd5b5035919050565b60008060006060848603121561541b57600080fd5b83359250602084013561524b81615208565b60006020828403121561543f57600080fd5b81516128f6816151d4565b60006020828403121561545c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156154a4576154a4615463565b500390565b6000602082840312156154bb57600080fd5b81516128f681615208565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156154f1576154f1615463565b01949350505050565b600063ffffffff8381169083168181101561551757615517615463565b039392505050565b60006020828403121561553157600080fd5b81516128f681615366565b60006080828403121561554e57600080fd5b6040516080810181811067ffffffffffffffff82111715615598577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516155a681615208565b81526020838101519082015260408301516155c0816151d4565b604082015260608301516155d3816151d4565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680615657577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a", + Bin: "0x6102006040523480156200001257600080fd5b5060405162005d3a38038062005d3a83398101604081905262000035916200017d565b8061016001516001600160801b03168161014001516001600160801b031611156200007357604051631510b77f60e01b815260040160405180910390fd5b80516001600160a01b0390811660809081526020830151821660a0908152604084015190921660c0908152610140808501516001600160801b0390811660e090815261016080880151831661010090815260608901518416610120908152968901518416909452958701518216909552918501518216610180529284015181166101a0529183015182166101c05290910151166101e05262000284565b60405161018081016001600160401b03811182821017156200014257634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200016057600080fd5b919050565b80516001600160801b03811681146200016057600080fd5b600061018082840312156200019157600080fd5b6200019b62000110565b620001a68362000148565b8152620001b66020840162000148565b6020820152620001c96040840162000148565b6040820152620001dc6060840162000165565b6060820152620001ef6080840162000165565b60808201526200020260a0840162000165565b60a08201526200021560c0840162000165565b60c08201526200022860e0840162000165565b60e08201526101006200023d81850162000165565b908201526101206200025184820162000165565b908201526101406200026584820162000165565b908201526101606200027984820162000165565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516158bf6200047b6000396000818161038d01528181614bf601528181614c6101528181614ca3015261510f0152600081816108580152612be401526000818161043201526131370152600081816103e401526134840152600081816107bb01526134aa0152600081816104590152610f360152600081816105c1015281816115720152611ce00152600081816106f901528181610b0c0152610da0015260008181610366015281816109410152610c8b01526000818161040b0152610f9301526000818161052901528181610a9b01528181610cbf01528181610dd4015281816110b001528181611484015281816119f801528181611b2e01528181611e700152818161200b0152818161220501528181612307015281816123fe01528181612dfb01528181612f3101528181614b5401528181614d2f01528181614dd8015261508a0152600081816102dc01528181610e9d0152818161127801528181611382015281816118f601528181611a2901528181611d3001528181611dc201528181611f06015281816120dd015281816129d901528181612a5f01528181612ae301528181612c6901528181612d10015281816130900152818161323401526132e801526158bf6000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461546c565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b61032e610ba0565b6103ca6103c53660046154b5565b610c2b565b6040516103129190615501565b6102fe610e87565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103129190615542565b6105016104d23660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f3660046155c3565b610fb5565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b61032e61112a565b61032e6105613660046154b5565b61126d565b61032e6105743660046154b5565b611380565b61032e6114e4565b61033861058f3660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6105016105f13660046154b5565b6116f5565b61032e6106043660046155fc565b611728565b61032e6106173660046154b5565b6118f4565b61032e61062a366004615617565b611a27565b61068461063d3660046154b5565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103386107293660046154b5565b611cc1565b61032e61073c36600461563c565b611d25565b61032e61074f366004615655565b611f04565b6107876107623660046154b5565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a16122d7565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6107876107eb3660046154b5565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c3660046154b5565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e3660046154b5565b6122fc565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b3332146108b3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156108ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108f733610c2b565b6005811115610908576109086154d2565b1461093f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156109bd576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff831611156109fb576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000000000000000000000000000000000000000000909116906319412a2090606401600060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610b4157610b41336123c0565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610bab33610c2b565b6005811115610bbc57610bbc6154d2565b141580610be95750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610c20576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c29336123c0565b565b6001600160a01b03811660009081526004602052604081205460ff16610c5357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2c919061567c565b6fffffffffffffffffffffffffffffffff161015610d4c57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690638abf0af090602401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e41919061567c565b6fffffffffffffffffffffffffffffffff161015610e705780610e675750600292915050565b50600492915050565b80610e7e5750600392915050565b50600592915050565b600080546001600160a01b031615610f905760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190615699565b9050804210610f7f576000610f3282426156e1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610f7d576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610fc083610c2b565b9050818015610ffb57506001816005811115610fde57610fde6154d2565b1480610ffb57506004816005811115610ff957610ff96154d2565b145b156110595761100b6001846124b8565b1561105457826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161104b91815260200190565b60405180910390a25b505050565b600481600581111561106d5761106d6154d2565b10611054576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111249185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b919061567c565b6001919061265a565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611182576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156111df576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e83361296f565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361124e33610c2b565b600581111561125f5761125f6154d2565b03610c2957610c29336123c0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112cf576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d9610e87565b90506001600160a01b03808216148015906113065750806001600160a01b0316826001600160a01b031614155b1561133d576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346826116f5565b61137c576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906156f8565b6001600160a01b0316336001600160a01b03161461144c576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638c1516c7906024015b600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b5050505050565b60026114ef33610c2b565b6005811115611500576115006154d2565b108061152c5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611563576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061156e33611cc1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff16036115ed576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff16421015611639576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561170283610c2b565b6005811115611713576117136154d2565b0361172057506001919050565b506000919050565b600261173333610c2b565b6005811115611744576117446154d2565b10806117705750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156117a7576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff831611156117f4576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff62010000909104811690831681900361183d576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197691906156f8565b6001600160a01b0316336001600160a01b0316146119c0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8387172906024016114af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa991906156f8565b6001600160a01b0316336001600160a01b031614611af3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063536afae4906024016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061567c565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611ca283610c2b565b6005811115611cb357611cb36154d2565b0361105457611054826123c0565b6001600160a01b038116600090815260046020526040812054611d1f907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16615715565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d87576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8f6129d4565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906156f8565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f000000000000000000000000000000000000000000000000000000000000000090911690638c1516c790602401600060405180830381600087803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611ef4905057611eef8161296f565b611efc565b611efc61310a565b61137c6131e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906156f8565b6001600160a01b0316336001600160a01b031614611fd0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690635636aabd906024016020604051808303816000875af1158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a919061567c565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a36120da82600061347b565b837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190615699565b116121b557600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611124565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af115801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061567c565b905061227f836000610fb5565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122f79063ffffffff640100000000820481169116615749565b905090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461235e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361236982610c2b565b600581111561237a5761237a6154d2565b1480156123af57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b156123bd576123bd816123c0565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124729183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612469919061567c565b60019190613623565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a426040516124ad91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff168082036124ea576000915050611d1f565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156126015763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061255f565b61260b8684613cf1565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361268c576000915050612968565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff851617909455935492909104169274010000000000000000000000000000000000000000909104169082101561283c5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff82161561282c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061278b565b506128378784614516565b612960565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156129555763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906128b3565b506129608784614722565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123bd576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190615699565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adf9190615699565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906156f8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b9091815260200190565b602060405180830381865afa158015612bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd1919061576e565b612bde5760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612c355750828411155b15613049576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc919061576e565b15613049576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8391906156f8565b90506000806000612d9384614b4d565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015613029576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af1158015612f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9e919061567c565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b613034856000610fb5565b87600101975085600101955050505050612be2565b6fffffffffffffffffffffffffffffffff8216156130ff576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b1580156130dc57600080fd5b505af11580156130f0573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b031661311c57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff161061318d57600054610c29906001600160a01b0316600161347b565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b49190615699565b90506000826effffffffffffffffffffffffffffff161180156132d75750600081115b1561344f5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576133186001856156e1565b6040518263ffffffff1660e01b815260040161333691815260200190565b608060405180830381865afa158015613353573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613377919061578b565b9050600083826020015143414460014361339191906156e1565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613402919061585d565b905061340f600182614e7e565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061137c9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816134a8577f00000000000000000000000000000000000000000000000000000000000000006134ca565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000613501846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6135145761350f8242615715565b61354a565b6001600160a01b03841660009081526005602052604090205461354a9083906fffffffffffffffffffffffffffffffff16615715565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a26135e36001856124b8565b1561112457836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961426040516116e791815260200190565b6001600160a01b0382166136be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42616c616e636564576569676874547265653a207a65726f206164647265737360448201527f206e6f7420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260028401602052604090205463ffffffff161561376c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f42616c616e636564576569676874547265653a206e6f646520616c726561647960448201527f206578697374696e67000000000000000000000000000000000000000000000060648201526084016136b5565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff16600003613a4757845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b909104169003613b835763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b909102178155613b7a8784614516565b50505050505050565b8054600160e01b900463ffffffff16600003613c595763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b909102178155613b7a8784614516565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613cd9578054600160e01b900463ffffffff169150613ceb565b8054600160c01b900463ffffffff1691505b50613a5c565b63ffffffff81166000908152600183016020526040902080546001600160a01b0316613d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42616c616e636564576569676874547265653a206e6f6465206e6f742065786960448201527f737473000000000000000000000000000000000000000000000000000000000060648201526084016136b5565b8054600160c01b900463ffffffff1660000361406d578054600160e01b900463ffffffff16600003613f1c57805474010000000000000000000000000000000000000000900463ffffffff16600003613e1d5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613ed8565b600181015460ff1615613e8557805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613ed8565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b8054600160e01b900463ffffffff166000036141d457805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff610100928390048116929091041611156143a257805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613cf1565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906145a45750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561112457815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120614551565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561496b57600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bd491906156f8565b6001600160a01b0316846001600160a01b031603614c1a5750600091508190507f0000000000000000000000000000000000000000000000000000000000000000614e77565b6001600160a01b03841660009081526004602052604081205462010000900460ff1690614c468661504d565b9050600080614c8b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064615183565b9050614cce6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390615183565b9150614cf16fffffffffffffffffffffffffffffffff8416606486810390615183565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000000000000000000000000000000000000000000169063981cee5390602401602060405180830381865afa158015614d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d9a919061567c565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690636b9ffeac90602401602060405180830381865afa158015614e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e43919061567c565b90506000614e666fffffffffffffffffffffffffffffffff861684808501615183565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614f175763ffffffff9081166000908152600185016020526040902054600160c01b900416614e96565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614fb05763ffffffff1660009081526001840160205260409020546001600160a01b03169050611d1f565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156150435763ffffffff9081166000908152600185016020526040902054600160e01b900416614e96565b6000915050611d1f565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa1580156150d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f5919061567c565b905060006151386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064615183565b905061517b816fffffffffffffffffffffffffffffffff1665010000000000615174856fffffffffffffffffffffffffffffffff166064615232565b91906152f9565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611615207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064016136b5565b826fffffffffffffffffffffffffffffffff1681816152285761522861582e565b0495945050505050565b600080838310801561524b576001811461525e5761526d565b650100000000008502849004915061526d565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611d1f576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615351578382816153475761534761582e565b0492505050612968565b8084116153ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016136b5565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff811681146123bd57600080fd5b803560ff8116811461545257600080fd5b919050565b6001600160a01b03811681146123bd57600080fd5b60008060006060848603121561548157600080fd5b833561548c81615423565b925061549a60208501615441565b915060408401356154aa81615457565b809150509250925092565b6000602082840312156154c757600080fd5b813561296881615457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061553c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561556f57858101830151858201604001528201615553565b81811115615581576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123bd57600080fd5b600080604083850312156155d657600080fd5b82356155e181615457565b915060208301356155f1816155b5565b809150509250929050565b60006020828403121561560e57600080fd5b61296882615441565b6000806040838503121561562a57600080fd5b8235915060208301356155f181615457565b60006020828403121561564e57600080fd5b5035919050565b60008060006060848603121561566a57600080fd5b83359250602084013561549a81615457565b60006020828403121561568e57600080fd5b815161296881615423565b6000602082840312156156ab57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156156f3576156f36156b2565b500390565b60006020828403121561570a57600080fd5b815161296881615457565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615740576157406156b2565b01949350505050565b600063ffffffff83811690831681811015615766576157666156b2565b039392505050565b60006020828403121561578057600080fd5b8151612968816155b5565b60006080828403121561579d57600080fd5b6040516080810181811067ffffffffffffffff821117156157e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516157f581615457565b815260208381015190820152604083015161580f81615423565b6040820152606083015161582281615423565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff808416806158a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a", } // ValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/kroma-bindings/bindings/validatormanager_more.go b/kroma-bindings/bindings/validatormanager_more.go index 3466cedb6..70321d981 100644 --- a/kroma-bindings/bindings/validatormanager_more.go +++ b/kroma-bindings/bindings/validatormanager_more.go @@ -13,7 +13,7 @@ const ValidatorManagerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contr var ValidatorManagerStorageLayout = new(solc.StorageLayout) -var ValidatorManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461521d565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b61032e610b2e565b6103ca6103c5366004615266565b610bb9565b60405161031291906152b2565b6102fe610e15565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161031291906152f3565b6105016104d2366004615266565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f366004615374565b610f43565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b61032e6110b8565b61032e610561366004615266565b6111fb565b61032e610574366004615266565b61130e565b61032e611472565b61033861058f366004615266565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6105016105f1366004615266565b611683565b61032e6106043660046153ad565b6116b6565b61032e610617366004615266565b611882565b61032e61062a3660046153c8565b6119b5565b61068461063d366004615266565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b610338610729366004615266565b611c4f565b61032e61073c3660046153ed565b611cb3565b61032e61074f366004615406565b611e92565b610787610762366004615266565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a1612265565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6107876107eb366004615266565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c366004615266565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e366004615266565b61228a565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b600061088533610bb9565b600581111561089657610896615283565b146108cd576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff16101561094b576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610989576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000000000000000000000000000000000000000000909116906319412a2090606401600060405180830381600087803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610acf57610acf3361234e565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610b3933610bb9565b6005811115610b4a57610b4a615283565b141580610b775750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610bae576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bb73361234e565b565b6001600160a01b03811660009081526004602052604081205460ff16610be157506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cba919061542d565b6fffffffffffffffffffffffffffffffff161015610cda57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690638abf0af090602401602060405180830381865afa158015610dab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcf919061542d565b6fffffffffffffffffffffffffffffffff161015610dfe5780610df55750600292915050565b50600492915050565b80610e0c5750600392915050565b50600592915050565b600080546001600160a01b031615610f1e5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eab919061544a565b9050804210610f0d576000610ec08242615492565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610f0b576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610f4e83610bb9565b9050818015610f8957506001816005811115610f6c57610f6c615283565b1480610f8957506004816005811115610f8757610f87615283565b145b15610fe757610f99600184612446565b15610fe257826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051610fd991815260200190565b60405180910390a25b505050565b6004816005811115610ffb57610ffb615283565b10610fe2576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526110b29185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a9919061542d565b600191906125e8565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611110576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff909116111561116d576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611176336128fd565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a260036111dc33610bb9565b60058111156111ed576111ed615283565b03610bb757610bb73361234e565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461125d576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611267610e15565b90506001600160a01b03808216148015906112945750806001600160a01b0316826001600160a01b031614155b156112cb576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112d482611683565b61130a576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139091906154a9565b6001600160a01b0316336001600160a01b0316146113da576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638c1516c7906024015b600060405180830381600087803b15801561145757600080fd5b505af115801561146b573d6000803e3d6000fd5b5050505050565b600261147d33610bb9565b600581111561148e5761148e615283565b10806114ba5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156114f1576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006114fc33611c4f565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff160361157b576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff164210156115c7576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561169083610bb9565b60058111156116a1576116a1615283565b036116ae57506001919050565b506000919050565b60026116c133610bb9565b60058111156116d2576116d2615283565b10806116fe5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611735576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff83161115611782576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff6201000090910481169083168190036117cb576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190491906154a9565b6001600160a01b0316336001600160a01b03161461194e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a83871729060240161143d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3791906154a9565b6001600160a01b0316336001600160a01b031614611a81576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063536afae4906024016020604051808303816000875af1158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b919061542d565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611c3083610bb9565b6005811115611c4157611c41615283565b03610fe257610fe28261234e565b6001600160a01b038116600090815260046020526040812054611cad907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff166154c6565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d15576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1d612962565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc391906154a9565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f000000000000000000000000000000000000000000000000000000000000000090911690638c1516c790602401600060405180830381600087803b158015611e4457600080fd5b505af1158015611e58573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611e82905057611e7d816128fd565b611e8a565b611e8a613098565b61130a61316f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1491906154a9565b6001600160a01b0316336001600160a01b031614611f5e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690635636aabd906024016020604051808303816000875af1158015611fe4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612008919061542d565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a3612068826000613409565b837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120eb919061544a565b1161214357600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161790556110b2565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af11580156121dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612200919061542d565b905061220d836000610f43565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122859063ffffffff6401000000008204811691166154fa565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146122ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122f782610bb9565b600581111561230857612308615283565b14801561233d57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b1561234b5761234b8161234e565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124009183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa1580156123d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f7919061542d565b600191906135b1565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a4260405161243b91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203612478576000915050611cad565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff82161561258f5763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906124ed565b6125998684613b36565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361261a5760009150506128f6565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156127ca5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156127ba5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612719565b506127c587846142c2565b6128ee565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156128e35763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612841565b506128ee87846144ce565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff161561234b576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e7919061544a565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6d919061544a565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af191906154a9565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b1e91815260200190565b602060405180830381865afa158015612b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5f919061551f565b612b6c5760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612bc35750828411155b15612fd7576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6a919061551f565b15612fd7576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1191906154a9565b90506000806000612d21846148f9565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b158015612dcf57600080fd5b505af1158015612de3573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612fb7576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af1158015612f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2c919061542d565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612fc2856000610f43565b87600101975085600101955050505050612b70565b6fffffffffffffffffffffffffffffffff82161561308d576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b15801561306a57600080fd5b505af115801561307e573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b03166130aa57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff161061311b57600054610bb7906001600160a01b03166001613409565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561321e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613242919061544a565b90506000826effffffffffffffffffffffffffffff161180156132655750600081115b156133dd5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576132a6600185615492565b6040518263ffffffff1660e01b81526004016132c491815260200190565b608060405180830381865afa1580156132e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613305919061553c565b9050600083826020015143414460014361331f9190615492565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613390919061560e565b905061339d600182614c2a565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061130a9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b600081613436577f0000000000000000000000000000000000000000000000000000000000000000613458565b7f00000000000000000000000000000000000000000000000000000000000000005b9050600061348f846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6134a25761349d82426154c6565b6134d8565b6001600160a01b0384166000908152600560205260409020546134d89083906fffffffffffffffffffffffffffffffff166154c6565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2613571600185612446565b156110b257836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161167591815260200190565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff1660000361388c57845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036139c85763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556139bf87846142c2565b50505050505050565b8054600160e01b900463ffffffff16600003613a9e5763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556139bf87846142c2565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613b1e578054600160e01b900463ffffffff169150613b30565b8054600160c01b900463ffffffff1691505b506138a1565b63ffffffff8082166000908152600184016020526040812080549092600160c01b909104169003613e19578054600160e01b900463ffffffff16600003613cc857805474010000000000000000000000000000000000000000900463ffffffff16600003613bc95782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613c84565b600181015460ff1615613c3157805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613c84565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906142bc565b8054600160e01b900463ffffffff16600003613f8057805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906142bc565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff6101009283900481169290910416111561414e57805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906142bc565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613b36565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906143505750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b156110b257815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff1991821617909155875496549095168352808320805490951674010000000000000000000000000000000000000000968790048916179094559454849004861680825291870190945281842080549390930490941683529091206142fd565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561471757600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610fe257805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c16179055885486900487168086529282528385205490971684529590955290208054909516909217909355905404166144cf565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610fe257805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c16179055885486900487168086529282528385205490971684529590955290208054909516909217909355905404166144cf565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561495c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061498091906154a9565b6001600160a01b0316846001600160a01b0316036149c65750600091508190507f0000000000000000000000000000000000000000000000000000000000000000614c23565b6001600160a01b03841660009081526004602052604081205462010000900460ff16906149f286614df9565b9050600080614a376fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064614f2f565b9050614a7a6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390614f2f565b9150614a9d6fffffffffffffffffffffffffffffffff8416606486810390614f2f565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000000000000000000000000000000000000000000169063981cee5390602401602060405180830381865afa158015614b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b46919061542d565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690636b9ffeac90602401602060405180830381865afa158015614bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bef919061542d565b90506000614c126fffffffffffffffffffffffffffffffff861684808501614f2f565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614cc35763ffffffff9081166000908152600185016020526040902054600160c01b900416614c42565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614d5c5763ffffffff1660009081526001840160205260409020546001600160a01b03169050611cad565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff90811690940393848116700100000000000000000000000000000000909204161115614def5763ffffffff9081166000908152600185016020526040902054600160e01b900416614c42565b6000915050611cad565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa158015614e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ea1919061542d565b90506000614ee46fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064614f2f565b9050614f27816fffffffffffffffffffffffffffffffff1665010000000000614f20856fffffffffffffffffffffffffffffffff166064614fe3565b91906150aa565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611614fb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff168181614fd957614fd96155df565b0495945050505050565b6000808383108015614ffc576001811461500f5761501e565b650100000000008502849004915061501e565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611cad576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615102578382816150f8576150f86155df565b04925050506128f6565b80841161516b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f7700000000000000000000006044820152606401614faf565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff8116811461234b57600080fd5b803560ff8116811461520357600080fd5b919050565b6001600160a01b038116811461234b57600080fd5b60008060006060848603121561523257600080fd5b833561523d816151d4565b925061524b602085016151f2565b9150604084013561525b81615208565b809150509250925092565b60006020828403121561527857600080fd5b81356128f681615208565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600683106152ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561532057858101830151858201604001528201615304565b81811115615332576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b801515811461234b57600080fd5b6000806040838503121561538757600080fd5b823561539281615208565b915060208301356153a281615366565b809150509250929050565b6000602082840312156153bf57600080fd5b6128f6826151f2565b600080604083850312156153db57600080fd5b8235915060208301356153a281615208565b6000602082840312156153ff57600080fd5b5035919050565b60008060006060848603121561541b57600080fd5b83359250602084013561524b81615208565b60006020828403121561543f57600080fd5b81516128f6816151d4565b60006020828403121561545c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156154a4576154a4615463565b500390565b6000602082840312156154bb57600080fd5b81516128f681615208565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156154f1576154f1615463565b01949350505050565b600063ffffffff8381169083168181101561551757615517615463565b039392505050565b60006020828403121561553157600080fd5b81516128f681615366565b60006080828403121561554e57600080fd5b6040516080810181811067ffffffffffffffff82111715615598577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516155a681615208565b81526020838101519082015260408301516155c0816151d4565b604082015260608301516155d3816151d4565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680615657577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a" +var ValidatorManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461546c565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b61032e610ba0565b6103ca6103c53660046154b5565b610c2b565b6040516103129190615501565b6102fe610e87565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103129190615542565b6105016104d23660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f3660046155c3565b610fb5565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b61032e61112a565b61032e6105613660046154b5565b61126d565b61032e6105743660046154b5565b611380565b61032e6114e4565b61033861058f3660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6105016105f13660046154b5565b6116f5565b61032e6106043660046155fc565b611728565b61032e6106173660046154b5565b6118f4565b61032e61062a366004615617565b611a27565b61068461063d3660046154b5565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103386107293660046154b5565b611cc1565b61032e61073c36600461563c565b611d25565b61032e61074f366004615655565b611f04565b6107876107623660046154b5565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a16122d7565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6107876107eb3660046154b5565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c3660046154b5565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e3660046154b5565b6122fc565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b3332146108b3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156108ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108f733610c2b565b6005811115610908576109086154d2565b1461093f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156109bd576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff831611156109fb576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000000000000000000000000000000000000000000909116906319412a2090606401600060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610b4157610b41336123c0565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610bab33610c2b565b6005811115610bbc57610bbc6154d2565b141580610be95750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610c20576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c29336123c0565b565b6001600160a01b03811660009081526004602052604081205460ff16610c5357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2c919061567c565b6fffffffffffffffffffffffffffffffff161015610d4c57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690638abf0af090602401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e41919061567c565b6fffffffffffffffffffffffffffffffff161015610e705780610e675750600292915050565b50600492915050565b80610e7e5750600392915050565b50600592915050565b600080546001600160a01b031615610f905760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190615699565b9050804210610f7f576000610f3282426156e1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610f7d576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610fc083610c2b565b9050818015610ffb57506001816005811115610fde57610fde6154d2565b1480610ffb57506004816005811115610ff957610ff96154d2565b145b156110595761100b6001846124b8565b1561105457826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161104b91815260200190565b60405180910390a25b505050565b600481600581111561106d5761106d6154d2565b10611054576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111249185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b919061567c565b6001919061265a565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611182576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156111df576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e83361296f565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361124e33610c2b565b600581111561125f5761125f6154d2565b03610c2957610c29336123c0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112cf576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d9610e87565b90506001600160a01b03808216148015906113065750806001600160a01b0316826001600160a01b031614155b1561133d576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346826116f5565b61137c576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906156f8565b6001600160a01b0316336001600160a01b03161461144c576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638c1516c7906024015b600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b5050505050565b60026114ef33610c2b565b6005811115611500576115006154d2565b108061152c5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611563576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061156e33611cc1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff16036115ed576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff16421015611639576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561170283610c2b565b6005811115611713576117136154d2565b0361172057506001919050565b506000919050565b600261173333610c2b565b6005811115611744576117446154d2565b10806117705750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156117a7576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff831611156117f4576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff62010000909104811690831681900361183d576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197691906156f8565b6001600160a01b0316336001600160a01b0316146119c0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8387172906024016114af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa991906156f8565b6001600160a01b0316336001600160a01b031614611af3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063536afae4906024016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061567c565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611ca283610c2b565b6005811115611cb357611cb36154d2565b0361105457611054826123c0565b6001600160a01b038116600090815260046020526040812054611d1f907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16615715565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d87576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8f6129d4565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906156f8565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f000000000000000000000000000000000000000000000000000000000000000090911690638c1516c790602401600060405180830381600087803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611ef4905057611eef8161296f565b611efc565b611efc61310a565b61137c6131e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906156f8565b6001600160a01b0316336001600160a01b031614611fd0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690635636aabd906024016020604051808303816000875af1158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a919061567c565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a36120da82600061347b565b837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190615699565b116121b557600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611124565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af115801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061567c565b905061227f836000610fb5565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122f79063ffffffff640100000000820481169116615749565b905090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461235e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361236982610c2b565b600581111561237a5761237a6154d2565b1480156123af57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b156123bd576123bd816123c0565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124729183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612469919061567c565b60019190613623565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a426040516124ad91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff168082036124ea576000915050611d1f565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156126015763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061255f565b61260b8684613cf1565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361268c576000915050612968565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff851617909455935492909104169274010000000000000000000000000000000000000000909104169082101561283c5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff82161561282c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061278b565b506128378784614516565b612960565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156129555763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906128b3565b506129608784614722565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123bd576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190615699565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adf9190615699565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906156f8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b9091815260200190565b602060405180830381865afa158015612bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd1919061576e565b612bde5760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612c355750828411155b15613049576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc919061576e565b15613049576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8391906156f8565b90506000806000612d9384614b4d565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015613029576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af1158015612f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9e919061567c565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b613034856000610fb5565b87600101975085600101955050505050612be2565b6fffffffffffffffffffffffffffffffff8216156130ff576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b1580156130dc57600080fd5b505af11580156130f0573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b031661311c57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff161061318d57600054610c29906001600160a01b0316600161347b565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b49190615699565b90506000826effffffffffffffffffffffffffffff161180156132d75750600081115b1561344f5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576133186001856156e1565b6040518263ffffffff1660e01b815260040161333691815260200190565b608060405180830381865afa158015613353573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613377919061578b565b9050600083826020015143414460014361339191906156e1565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613402919061585d565b905061340f600182614e7e565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061137c9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816134a8577f00000000000000000000000000000000000000000000000000000000000000006134ca565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000613501846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6135145761350f8242615715565b61354a565b6001600160a01b03841660009081526005602052604090205461354a9083906fffffffffffffffffffffffffffffffff16615715565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a26135e36001856124b8565b1561112457836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961426040516116e791815260200190565b6001600160a01b0382166136be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42616c616e636564576569676874547265653a207a65726f206164647265737360448201527f206e6f7420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260028401602052604090205463ffffffff161561376c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f42616c616e636564576569676874547265653a206e6f646520616c726561647960448201527f206578697374696e67000000000000000000000000000000000000000000000060648201526084016136b5565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff16600003613a4757845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b909104169003613b835763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b909102178155613b7a8784614516565b50505050505050565b8054600160e01b900463ffffffff16600003613c595763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b909102178155613b7a8784614516565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613cd9578054600160e01b900463ffffffff169150613ceb565b8054600160c01b900463ffffffff1691505b50613a5c565b63ffffffff81166000908152600183016020526040902080546001600160a01b0316613d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42616c616e636564576569676874547265653a206e6f6465206e6f742065786960448201527f737473000000000000000000000000000000000000000000000000000000000060648201526084016136b5565b8054600160c01b900463ffffffff1660000361406d578054600160e01b900463ffffffff16600003613f1c57805474010000000000000000000000000000000000000000900463ffffffff16600003613e1d5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613ed8565b600181015460ff1615613e8557805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613ed8565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b8054600160e01b900463ffffffff166000036141d457805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff610100928390048116929091041611156143a257805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613cf1565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906145a45750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561112457815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120614551565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561496b57600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bd491906156f8565b6001600160a01b0316846001600160a01b031603614c1a5750600091508190507f0000000000000000000000000000000000000000000000000000000000000000614e77565b6001600160a01b03841660009081526004602052604081205462010000900460ff1690614c468661504d565b9050600080614c8b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064615183565b9050614cce6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390615183565b9150614cf16fffffffffffffffffffffffffffffffff8416606486810390615183565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000000000000000000000000000000000000000000169063981cee5390602401602060405180830381865afa158015614d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d9a919061567c565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690636b9ffeac90602401602060405180830381865afa158015614e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e43919061567c565b90506000614e666fffffffffffffffffffffffffffffffff861684808501615183565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614f175763ffffffff9081166000908152600185016020526040902054600160c01b900416614e96565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614fb05763ffffffff1660009081526001840160205260409020546001600160a01b03169050611d1f565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156150435763ffffffff9081166000908152600185016020526040902054600160e01b900416614e96565b6000915050611d1f565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa1580156150d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f5919061567c565b905060006151386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064615183565b905061517b816fffffffffffffffffffffffffffffffff1665010000000000615174856fffffffffffffffffffffffffffffffff166064615232565b91906152f9565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611615207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064016136b5565b826fffffffffffffffffffffffffffffffff1681816152285761522861582e565b0495945050505050565b600080838310801561524b576001811461525e5761526d565b650100000000008502849004915061526d565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611d1f576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615351578382816153475761534761582e565b0492505050612968565b8084116153ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016136b5565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff811681146123bd57600080fd5b803560ff8116811461545257600080fd5b919050565b6001600160a01b03811681146123bd57600080fd5b60008060006060848603121561548157600080fd5b833561548c81615423565b925061549a60208501615441565b915060408401356154aa81615457565b809150509250925092565b6000602082840312156154c757600080fd5b813561296881615457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061553c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561556f57858101830151858201604001528201615553565b81811115615581576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123bd57600080fd5b600080604083850312156155d657600080fd5b82356155e181615457565b915060208301356155f1816155b5565b809150509250929050565b60006020828403121561560e57600080fd5b61296882615441565b6000806040838503121561562a57600080fd5b8235915060208301356155f181615457565b60006020828403121561564e57600080fd5b5035919050565b60008060006060848603121561566a57600080fd5b83359250602084013561549a81615457565b60006020828403121561568e57600080fd5b815161296881615423565b6000602082840312156156ab57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156156f3576156f36156b2565b500390565b60006020828403121561570a57600080fd5b815161296881615457565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615740576157406156b2565b01949350505050565b600063ffffffff83811690831681811015615766576157666156b2565b039392505050565b60006020828403121561578057600080fd5b8151612968816155b5565b60006080828403121561579d57600080fd5b6040516080810181811067ffffffffffffffff821117156157e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516157f581615457565b815260208381015190820152604083015161580f81615423565b6040820152606083015161582281615423565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff808416806158a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a" func init() { diff --git a/kroma-chain-ops/genesis/testdata/allocs-l1.json b/kroma-chain-ops/genesis/testdata/allocs-l1.json index 973c1b7eb..0d5984824 100644 --- a/kroma-chain-ops/genesis/testdata/allocs-l1.json +++ b/kroma-chain-ops/genesis/testdata/allocs-l1.json @@ -1,8 +1,8 @@ { - "root": "b2f107c30d47830452f6741fc7212aec5aec600b0658064443326bd1d56c6ac4", + "root": "109739f58f03cb1297da4034e50b91353577bff33a7c3a0a93894a37ac36afc7", "accounts": { "0x0000000000000000000000000000000000000000": { - "balance": "205177415175896875", + "balance": "205840745175896875", "nonce": 0, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", @@ -87,8 +87,8 @@ "balance": "0", "nonce": 1, "root": "0xa7abcc6e1e344abdd761f5e3b08dfacd08b68a6533969baeeaf61e80fde624e4", - "codeHash": "0x16a2a736d6a000df9725730d4470e099191d27caf5e1a8144b2058d52a218643", - "code": "0x6080604052600436106101b65760003560e01c806370a08231116100ec578063ad36d6cc1161008a578063d38dc7ee11610064578063d38dc7ee146105d7578063d8fe7642146105f7578063dd215c5d14610647578063facd743b1461066757600080fd5b8063ad36d6cc1461054b578063b7d636a51461059b578063d0e30db0146105cf57600080fd5b80638f09ade4116100c65780638f09ade4146104b2578063946765fd146104d2578063a51c9ace14610506578063ab91f1901461051b57600080fd5b806370a08231146104315780638129fc1c1461046757806382dae3aa1461047c57600080fd5b806339111af81161015957806354fd4d501161013357806354fd4d50146103725780635a544742146103c85780635df6a6bc146103e85780636641ea08146103fd57600080fd5b806339111af8146102f55780633a549046146103295780633ee4d4a31461033e57600080fd5b8063205c287811610195578063205c28781461025f5780632e1a7d4d1461028157806336086417146102a157806336b83469146102d557600080fd5b80621c2ff6146101bb5780630f43a6771461020c5780630ff754ea1461022b575b600080fd5b3480156101c757600080fd5b506101ef7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021857600080fd5b506036545b604051908152602001610203565b34801561023757600080fd5b506101ef7f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b34801561026b57600080fd5b5061027f61027a3660046124ff565b610687565b005b34801561028d57600080fd5b5061027f61029c36600461252b565b6107ba565b3480156102ad57600080fd5b506101ef7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b3480156102e157600080fd5b5061027f6102f0366004612544565b61086b565b34801561030157600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000a81565b34801561033557600080fd5b506101ef610adc565b34801561034a57600080fd5b506101ef7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b34801561037e57600080fd5b506103bb6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161020391906125f1565b3480156103d457600080fd5b5061027f6103e3366004612604565b610bfa565b3480156103f457600080fd5b5061027f610ea3565b34801561040957600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000481565b34801561043d57600080fd5b5061021d61044c366004612634565b6001600160a01b031660009081526033602052604090205490565b34801561047357600080fd5b5061027f610f22565b34801561048857600080fd5b50610491601481565b6040516fffffffffffffffffffffffffffffffff9091168152602001610203565b3480156104be57600080fd5b506104916104cd366004612604565b611099565b3480156104de57600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000a81565b34801561051257600080fd5b50610491606481565b34801561052757600080fd5b50610532620186a081565b60405167ffffffffffffffff9091168152602001610203565b34801561055757600080fd5b5061058b61056636600461252b565b7f000000000000000000000000000000000000000000000000000000000000000a1090565b6040519015158152602001610203565b3480156105a757600080fd5b506104917f000000000000000000000000000000000000000000000000000000000000000181565b61027f611148565b3480156105e357600080fd5b5061027f6105f236600461266f565b61129a565b34801561060357600080fd5b5061061761061236600461252b565b611573565b6040805182516fffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610203565b34801561065357600080fd5b5061027f610662366004612604565b611692565b34801561067357600080fd5b5061058b610682366004612634565b6119f8565b61068f611a7e565b6001600160a01b0382166107105760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61071a3382611ad7565b6000610737835a8460405180602001604052806000815250611d29565b9050806107ac5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b506107b660018055565b5050565b6107c2611a7e565b6107cc3382611ad7565b60006107e9335a8460405180602001604052806000815250611d29565b90508061085e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b5061086860018055565b50565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ed9190612694565b6001600160a01b0316336001600160a01b0316146109735760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff1680610a1b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055610a7f826fffffffffffffffffffffffffffffffff8316611d49565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610bd55760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7491906126b1565b9050804210610bc4576000610b8982426126f9565b90507f0000000000000000000000000000000000000000000000000000000000000004811115610bc2576001600160a01b039250505090565b505b50506038546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190612694565b6001600160a01b0316336001600160a01b031614610d025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dae5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b610dea827f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16611ad7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ead611e7d565b9050806108685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e6400000000000000000000000000000000000000000000006064820152608401610707565b600054610100900460ff1615808015610f425750600054600160ff909116105b80610f5c5750303b158015610f5c575060005460ff166001145b610fce5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610707565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561102c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61103461212e565b801561086857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111415760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b9392505050565b6111737f000000000000000000000000000000000000000000000000000000000000000a6001612710565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316636abcf5636040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906126b1565b1061128e5760405162461bcd60e51b815260206004820152604260248201527f56616c696461746f72506f6f6c3a206f6e6c792063616e206465706f7369742060448201527f746f2056616c696461746f72506f6f6c206265666f7265207465726d696e617460648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610707565b6112983334611d49565b565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146113385760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c650000000000000000000000000000000000000000006064820152608401610707565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156113e15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c726561647920657869737473000000006064820152608401610707565b6113e9611e7d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561146b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148f9190612694565b90506114cd817f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16611ad7565b7f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361156d6121ab565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906115dd5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61164f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f20657869737400000000000000000000000000000000000000000000000000006064820152608401610707565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117149190612694565b6001600160a01b0316336001600160a01b03161461179a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156118465760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806118ee5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b600060646118fd601484612728565b611907919061278f565b9050600061191582846127be565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e9091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b6036546000908103611a0c57506000919050565b6001600160a01b038216611a2257506000919050565b6001600160a01b0382166000818152603760205260409020546036805491929183908110611a5257611a526127ef565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b600260015403611ad05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610707565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611b655760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e636573000000000000000000000000000000000000000000000000000000006064820152608401610707565b611b6f82826126f9565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff1681108015611bb65750611bb6836119f8565b15611d0957603654600090611bcd906001906126f9565b90508015611c85576001600160a01b0384166000908152603760205260408120546036805491929184908110611c0557611c056127ef565b600091825260209091200154603680546001600160a01b039092169250829184908110611c3457611c346127ef565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611caf57611caf61281e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611d6d908390612710565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff168110158015611db75750611db5836119f8565b155b15611d09577f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160a01b0316836001600160a01b031614611d0957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f000000000000000000000000000000000000000000000000000000000000000a81101561207857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611f3457506000846fffffffffffffffffffffffffffffffff16115b156120785760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fec919061284d565b915061200e8260000151856fffffffffffffffffffffffffffffffff16611d49565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a361206c82612379565b60019485019401611ead565b80156121225760358590556040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b1580156120fe57600080fd5b505af1158015612112573d6000803e3d6000fd5b5050505060019550505050505090565b60009550505050505090565b600054610100900460ff16611d435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610707565b60365480158015906121bf57506000603554115b1561234e5760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663a25ae557600160355461220491906126f9565b6040518263ffffffff1660e01b815260040161222291815260200190565b608060405180830381865afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612263919061284d565b9050600082826020015143414460014361227d91906126f9565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c6122ee91906128f0565b905060368181548110612303576123036127ef565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506108689050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612423926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526124b5939291600401612904565b600060405180830381600087803b1580156124cf57600080fd5b505af11580156124e3573d6000803e3d6000fd5b5050505050565b6001600160a01b038116811461086857600080fd5b6000806040838503121561251257600080fd5b823561251d816124ea565b946020939093013593505050565b60006020828403121561253d57600080fd5b5035919050565b60008060006060848603121561255957600080fd5b83359250602084013561256b816124ea565b9150604084013561257b816124ea565b809150509250925092565b6000815180845260005b818110156125ac57602081850181015186830182015201612590565b818111156125be576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111416020830184612586565b6000806040838503121561261757600080fd5b823591506020830135612629816124ea565b809150509250929050565b60006020828403121561264657600080fd5b8135611141816124ea565b6fffffffffffffffffffffffffffffffff8116811461086857600080fd5b6000806040838503121561268257600080fd5b82359150602083013561262981612651565b6000602082840312156126a657600080fd5b8151611141816124ea565b6000602082840312156126c357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561270b5761270b6126ca565b500390565b60008219821115612723576127236126ca565b500190565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615612757576127576126ca565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806127b2576127b2612760565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff838116908316818110156127e7576127e76126ca565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561285f57600080fd5b6040516080810181811067ffffffffffffffff821117156128a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516128b7816124ea565b81526020838101519082015260408301516128d181612651565b604082015260608301516128e481612651565b60608201529392505050565b6000826128ff576128ff612760565b500690565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006129366060830184612586565b9594505050505056fea164736f6c634300080f000a", + "codeHash": "0xb384f6d924b013f5f6d69dd2a55302d90e83b4ff460e8eb4478c367a8da27843", + "code": "0x6080604052600436106101b65760003560e01c806370a08231116100ec578063ad36d6cc1161008a578063d38dc7ee11610064578063d38dc7ee146105d7578063d8fe7642146105f7578063dd215c5d14610647578063facd743b1461066757600080fd5b8063ad36d6cc1461054b578063b7d636a51461059b578063d0e30db0146105cf57600080fd5b80638f09ade4116100c65780638f09ade4146104b2578063946765fd146104d2578063a51c9ace14610506578063ab91f1901461051b57600080fd5b806370a08231146104315780638129fc1c1461046757806382dae3aa1461047c57600080fd5b806339111af81161015957806354fd4d501161013357806354fd4d50146103725780635a544742146103c85780635df6a6bc146103e85780636641ea08146103fd57600080fd5b806339111af8146102f55780633a549046146103295780633ee4d4a31461033e57600080fd5b8063205c287811610195578063205c28781461025f5780632e1a7d4d1461028157806336086417146102a157806336b83469146102d557600080fd5b80621c2ff6146101bb5780630f43a6771461020c5780630ff754ea1461022b575b600080fd5b3480156101c757600080fd5b506101ef7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021857600080fd5b506036545b604051908152602001610203565b34801561023757600080fd5b506101ef7f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b34801561026b57600080fd5b5061027f61027a3660046124ff565b610687565b005b34801561028d57600080fd5b5061027f61029c36600461252b565b6107ba565b3480156102ad57600080fd5b506101ef7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b3480156102e157600080fd5b5061027f6102f0366004612544565b61086b565b34801561030157600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000003281565b34801561033557600080fd5b506101ef610adc565b34801561034a57600080fd5b506101ef7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b34801561037e57600080fd5b506103bb6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161020391906125f1565b3480156103d457600080fd5b5061027f6103e3366004612604565b610bfa565b3480156103f457600080fd5b5061027f610ea3565b34801561040957600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000481565b34801561043d57600080fd5b5061021d61044c366004612634565b6001600160a01b031660009081526033602052604090205490565b34801561047357600080fd5b5061027f610f22565b34801561048857600080fd5b50610491601481565b6040516fffffffffffffffffffffffffffffffff9091168152602001610203565b3480156104be57600080fd5b506104916104cd366004612604565b611099565b3480156104de57600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000a81565b34801561051257600080fd5b50610491606481565b34801561052757600080fd5b50610532620186a081565b60405167ffffffffffffffff9091168152602001610203565b34801561055757600080fd5b5061058b61056636600461252b565b7f00000000000000000000000000000000000000000000000000000000000000321090565b6040519015158152602001610203565b3480156105a757600080fd5b506104917f000000000000000000000000000000000000000000000000000000000000000181565b61027f611148565b3480156105e357600080fd5b5061027f6105f236600461266f565b61129a565b34801561060357600080fd5b5061061761061236600461252b565b611573565b6040805182516fffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610203565b34801561065357600080fd5b5061027f610662366004612604565b611692565b34801561067357600080fd5b5061058b610682366004612634565b6119f8565b61068f611a7e565b6001600160a01b0382166107105760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61071a3382611ad7565b6000610737835a8460405180602001604052806000815250611d29565b9050806107ac5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b506107b660018055565b5050565b6107c2611a7e565b6107cc3382611ad7565b60006107e9335a8460405180602001604052806000815250611d29565b90508061085e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b5061086860018055565b50565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ed9190612694565b6001600160a01b0316336001600160a01b0316146109735760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff1680610a1b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055610a7f826fffffffffffffffffffffffffffffffff8316611d49565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610bd55760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7491906126b1565b9050804210610bc4576000610b8982426126f9565b90507f0000000000000000000000000000000000000000000000000000000000000004811115610bc2576001600160a01b039250505090565b505b50506038546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190612694565b6001600160a01b0316336001600160a01b031614610d025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dae5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b610dea827f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16611ad7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ead611e7d565b9050806108685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e6400000000000000000000000000000000000000000000006064820152608401610707565b600054610100900460ff1615808015610f425750600054600160ff909116105b80610f5c5750303b158015610f5c575060005460ff166001145b610fce5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610707565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561102c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61103461212e565b801561086857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111415760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b9392505050565b6111737f00000000000000000000000000000000000000000000000000000000000000326001612710565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316636abcf5636040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906126b1565b1061128e5760405162461bcd60e51b815260206004820152604260248201527f56616c696461746f72506f6f6c3a206f6e6c792063616e206465706f7369742060448201527f746f2056616c696461746f72506f6f6c206265666f7265207465726d696e617460648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610707565b6112983334611d49565b565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146113385760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c650000000000000000000000000000000000000000006064820152608401610707565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156113e15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c726561647920657869737473000000006064820152608401610707565b6113e9611e7d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561146b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148f9190612694565b90506114cd817f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16611ad7565b7f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361156d6121ab565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906115dd5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61164f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f20657869737400000000000000000000000000000000000000000000000000006064820152608401610707565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117149190612694565b6001600160a01b0316336001600160a01b03161461179a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156118465760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806118ee5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b600060646118fd601484612728565b611907919061278f565b9050600061191582846127be565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e9091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b6036546000908103611a0c57506000919050565b6001600160a01b038216611a2257506000919050565b6001600160a01b0382166000818152603760205260409020546036805491929183908110611a5257611a526127ef565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b600260015403611ad05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610707565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611b655760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e636573000000000000000000000000000000000000000000000000000000006064820152608401610707565b611b6f82826126f9565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff1681108015611bb65750611bb6836119f8565b15611d0957603654600090611bcd906001906126f9565b90508015611c85576001600160a01b0384166000908152603760205260408120546036805491929184908110611c0557611c056127ef565b600091825260209091200154603680546001600160a01b039092169250829184908110611c3457611c346127ef565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611caf57611caf61281e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611d6d908390612710565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff168110158015611db75750611db5836119f8565b155b15611d09577f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160a01b0316836001600160a01b031614611d0957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f000000000000000000000000000000000000000000000000000000000000000a81101561207857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611f3457506000846fffffffffffffffffffffffffffffffff16115b156120785760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fec919061284d565b915061200e8260000151856fffffffffffffffffffffffffffffffff16611d49565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a361206c82612379565b60019485019401611ead565b80156121225760358590556040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b1580156120fe57600080fd5b505af1158015612112573d6000803e3d6000fd5b5050505060019550505050505090565b60009550505050505090565b600054610100900460ff16611d435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610707565b60365480158015906121bf57506000603554115b1561234e5760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663a25ae557600160355461220491906126f9565b6040518263ffffffff1660e01b815260040161222291815260200190565b608060405180830381865afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612263919061284d565b9050600082826020015143414460014361227d91906126f9565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c6122ee91906128f0565b905060368181548110612303576123036127ef565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506108689050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612423926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526124b5939291600401612904565b600060405180830381600087803b1580156124cf57600080fd5b505af11580156124e3573d6000803e3d6000fd5b5050505050565b6001600160a01b038116811461086857600080fd5b6000806040838503121561251257600080fd5b823561251d816124ea565b946020939093013593505050565b60006020828403121561253d57600080fd5b5035919050565b60008060006060848603121561255957600080fd5b83359250602084013561256b816124ea565b9150604084013561257b816124ea565b809150509250925092565b6000815180845260005b818110156125ac57602081850181015186830182015201612590565b818111156125be576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111416020830184612586565b6000806040838503121561261757600080fd5b823591506020830135612629816124ea565b809150509250929050565b60006020828403121561264657600080fd5b8135611141816124ea565b6fffffffffffffffffffffffffffffffff8116811461086857600080fd5b6000806040838503121561268257600080fd5b82359150602083013561262981612651565b6000602082840312156126a657600080fd5b8151611141816124ea565b6000602082840312156126c357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561270b5761270b6126ca565b500390565b60008219821115612723576127236126ca565b500190565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615612757576127576126ca565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806127b2576127b2612760565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff838116908316818110156127e7576127e76126ca565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561285f57600080fd5b6040516080810181811067ffffffffffffffff821117156128a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516128b7816124ea565b81526020838101519082015260408301516128d181612651565b604082015260608301516128e481612651565b60608201529392505050565b6000826128ff576128ff612760565b500690565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006129366060830184612586565b9594505050505056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", "0x0000000000000000000000000000000000000000000000000000000000000001": "01" @@ -180,6 +180,13 @@ }, "key": "0x228e1b4e1a077e8fe2073d2aea60505de76d541f0ccda8c233c439c27b0c341e" }, + "0x310ca0030eba3c67f7b3dedf6ad577cc59070573": { + "balance": "115792089237316195423570985008687907853269984665640564039455583849457825464927", + "nonce": 2, + "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "key": "0xcf14cc2c583a89667a82cc1fbe9a6931396a5627c9431c7fd5d89f47c12c38ce" + }, "0x322813fd9a801c5507c9de605d63cea4f2ce6c44": { "balance": "0", "nonce": 1, @@ -311,8 +318,8 @@ "balance": "0", "nonce": 1, "root": "0x821e2556a290c86405f8160a2d662042a431ba456b9db265c79bb837c04be5f0", - "codeHash": "0x52e81f7681b0259980f18b56c5fb3eb715a64480ec10afa5ad749d728c00ab5d", - "code": "0x6080604052600436106101a05760003560e01c80639e45e8f4116100e1578063cf8e5cf01161008a578063e4a3011611610064578063e4a3011614610550578063e664672314610570578063f403838d14610590578063f4daa291146105a657600080fd5b8063cf8e5cf0146104fb578063d1de856c1461051b578063dcec33481461053b57600080fd5b8063ae9483e0116100bb578063ae9483e014610473578063b0ea09a8146104a7578063b98debbf146104c757600080fd5b80639e45e8f41461037b578063a25ae557146103d4578063a48ea6de1461045357600080fd5b806369f16eec1161014e5780637f006420116101285780637f0064201461031057806380446bd21461033057806388786272146103455780639902cdc01461035b57600080fd5b806369f16eec146102d05780636abcf563146102e557806370872aa5146102fa57600080fd5b8063529933df1161017f578063529933df1461023157806354fd4d50146102655780635a045f78146102bb57600080fd5b80622134cc146101a557806333727c4d146101ec5780634599c7881461021c575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000281565b6040519081526020015b60405180910390f35b3480156101f857600080fd5b5061020c610207366004611ac1565b6105da565b60405190151581526020016101e3565b34801561022857600080fd5b506101d96105ee565b34801561023d57600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000481565b34801561027157600080fd5b506102ae6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e39190611ada565b6102ce6102c9366004611b4d565b610661565b005b3480156102dc57600080fd5b506101d9610e7d565b3480156102f157600080fd5b506003546101d9565b34801561030657600080fd5b506101d960015481565b34801561031c57600080fd5b506101d961032b366004611ac1565b610e8f565b34801561033c57600080fd5b506101d961106f565b34801561035157600080fd5b506101d960025481565b34801561036757600080fd5b506102ce610376366004611ac1565b611087565b34801561038757600080fd5b506103af7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e3565b3480156103e057600080fd5b506103f46103ef366004611ac1565b6112d9565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101e3565b34801561045f57600080fd5b506101d961046e366004611ac1565b611396565b34801561047f57600080fd5b506103af7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b181565b3480156104b357600080fd5b506103af6104c2366004611ac1565b611402565b3480156104d357600080fd5b506103af7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561050757600080fd5b506103f4610516366004611ac1565b611444565b34801561052757600080fd5b506101d9610536366004611ac1565b611483565b34801561054757600080fd5b506101d96114cb565b34801561055c57600080fd5b506102ce61056b366004611b7f565b611511565b34801561057c57600080fd5b506102ce61058b366004611bc6565b61172a565b34801561059c57600080fd5b506101d960045481565b3480156105b257600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000007881565b6000426105e683611396565b111592915050565b60035460009015610658576003805461060990600190611c2e565b8154811061061957610619611c45565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600061066c60035490565b6040517fad36d6cc0000000000000000000000000000000000000000000000000000000081526004810182905290915060009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063ad36d6cc90602401602060405180830381865afa1580156106fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107219190611c74565b9050600081156107cd576040517f891aab740000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b173ffffffffffffffffffffffffffffffffffffffff169063891aab749060240160006040518083038186803b1580156107b057600080fd5b505afa1580156107c4573d6000803e3d6000fd5b5050505061085f565b7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc973ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190611c9d565b90505b81158015610883575073ffffffffffffffffffffffffffffffffffffffff81811614155b1561093e573373ffffffffffffffffffffffffffffffffffffffff82161461093e5760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6109466114cb565b86146109e05760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a401610935565b426109e961106f565b1115610a5d5760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e207468652066757475726500000000000000000000006064820152608401610935565b86610ad05760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f2068617368000000006064820152608401610935565b8415801590610adf5750834015155b15610b805784844014610b805760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a401610935565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909201919091559051879185918a917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610cd991815260200190565b60405180910390a48115610d8c576040517fbe119347000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b173ffffffffffffffffffffffffffffffffffffffff169063be11934790602401600060405180830381600087803b158015610d6f57600080fd5b505af1158015610d83573d6000803e3d6000fd5b50505050610e74565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663d38dc7ee84610df37f000000000000000000000000000000000000000000000000000000000000007842611cba565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b505050505b50505050505050565b60035460009061065c90600190611c2e565b6000610e996105ee565b821115610f345760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a401610935565b600354610fcf5760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a401610935565b6003546000905b808210156110685760006002610fec8385611cba565b610ff69190611cd2565b9050846003828154811061100c5761100c611c45565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16101561105e57611057816001611cba565b9250611062565b8091505b50610fd6565b5092915050565b600061065c61107c6114cb565b610536906001611cba565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663ad36d6cc6110ce600184611c2e565b6040518263ffffffff1660e01b81526004016110ec91815260200190565b602060405180830381865afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d9190611c74565b15611208573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146112035760405162461bcd60e51b815260206004820152605660248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f72206d616e6167657220636f6e74726163742063616e20736574206e65787460648201527f2066696e616c697a65206f757470757420696e64657800000000000000000000608482015260a401610935565b600455565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146112035760405162461bcd60e51b815260206004820152605360248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f7220706f6f6c20636f6e74726163742063616e20736574206e65787420666960648201527f6e616c697a65206f757470757420696e64657800000000000000000000000000608482015260a401610935565b6040805160808101825260008082526020820181905291810182905260608101919091526003828154811061131057611310611c45565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f0000000000000000000000000000000000000000000000000000000000000078600383815481106113cc576113cc611c45565b60009182526020909120600260039092020101546113fc91906fffffffffffffffffffffffffffffffff16611cba565b92915050565b60006003828154811061141757611417611c45565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b604080516080810182526000808252602082018190529181018290526060810191909152600361147383610e8f565b8154811061131057611310611c45565b60007f0000000000000000000000000000000000000000000000000000000000000002600154836114b49190611c2e565b6114be9190611d0d565b6002546113fc9190611cba565b60035460009015611509577f00000000000000000000000000000000000000000000000000000000000000046114ff6105ee565b61065c9190611cba565b61065c6105ee565b600054610100900460ff16158080156115315750600054600160ff909116105b8061154b5750303b15801561154b575060005460ff166001145b6115bd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610935565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561161b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156116b85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a401610935565b60028290556001839055801561172557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78816146117fb5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a401610935565b73ffffffffffffffffffffffffffffffffffffffff81166118845760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f000000000000000000000000000000006064820152608401610935565b60035483106119215760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a401610935565b60006003848154811061193657611936611c45565b6000918252602090912060039091020160028101549091507f00000000000000000000000000000000000000000000000000000000000000789061198c906fffffffffffffffffffffffffffffffff1642611c2e565b10611a255760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a401610935565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617815560405183815284907fa1b831bb8b6b242db6d0988a6d21f869c610de9f703a5e45e1b7d3dc3137b9069060200160405180910390a250505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208284031215611ad357600080fd5b5035919050565b600060208083528351808285015260005b81811015611b0757858101830151858201604001528201611aeb565b81811115611b19576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060008060808587031215611b6357600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611b9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611bc357600080fd5b50565b600080600060608486031215611bdb57600080fd5b83359250602084013591506040840135611bf481611ba1565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611c4057611c40611bff565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611c8657600080fd5b81518015158114611c9657600080fd5b9392505050565b600060208284031215611caf57600080fd5b8151611c9681611ba1565b60008219821115611ccd57611ccd611bff565b500190565b600082611d08577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d4557611d45611bff565b50029056fea164736f6c634300080f000a", + "codeHash": "0x87c2f1a51ca632e37dfdc53f34133f88d3c0463694fced6136cf4d5bf22ac087", + "code": "0x6080604052600436106101a05760003560e01c80639e45e8f4116100e1578063cf8e5cf01161008a578063e4a3011611610064578063e4a3011614610550578063e664672314610570578063f403838d14610590578063f4daa291146105a657600080fd5b8063cf8e5cf0146104fb578063d1de856c1461051b578063dcec33481461053b57600080fd5b8063ae9483e0116100bb578063ae9483e014610473578063b0ea09a8146104a7578063b98debbf146104c757600080fd5b80639e45e8f41461037b578063a25ae557146103d4578063a48ea6de1461045357600080fd5b806369f16eec1161014e5780637f006420116101285780637f0064201461031057806380446bd21461033057806388786272146103455780639902cdc01461035b57600080fd5b806369f16eec146102d05780636abcf563146102e557806370872aa5146102fa57600080fd5b8063529933df1161017f578063529933df1461023157806354fd4d50146102655780635a045f78146102bb57600080fd5b80622134cc146101a557806333727c4d146101ec5780634599c7881461021c575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000281565b6040519081526020015b60405180910390f35b3480156101f857600080fd5b5061020c610207366004611ac3565b6105da565b60405190151581526020016101e3565b34801561022857600080fd5b506101d96105ee565b34801561023d57600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000481565b34801561027157600080fd5b506102ae6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e39190611adc565b6102ce6102c9366004611b4f565b610661565b005b3480156102dc57600080fd5b506101d9610e7d565b3480156102f157600080fd5b506003546101d9565b34801561030657600080fd5b506101d960015481565b34801561031c57600080fd5b506101d961032b366004611ac3565b610e8f565b34801561033c57600080fd5b506101d961106f565b34801561035157600080fd5b506101d960025481565b34801561036757600080fd5b506102ce610376366004611ac3565b611087565b34801561038757600080fd5b506103af7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e3565b3480156103e057600080fd5b506103f46103ef366004611ac3565b6112d9565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101e3565b34801561045f57600080fd5b506101d961046e366004611ac3565b611396565b34801561047f57600080fd5b506103af7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b181565b3480156104b357600080fd5b506103af6104c2366004611ac3565b611402565b3480156104d357600080fd5b506103af7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561050757600080fd5b506103f4610516366004611ac3565b611444565b34801561052757600080fd5b506101d9610536366004611ac3565b611483565b34801561054757600080fd5b506101d96114cb565b34801561055c57600080fd5b506102ce61056b366004611b81565b611511565b34801561057c57600080fd5b506102ce61058b366004611bc8565b61172a565b34801561059c57600080fd5b506101d960045481565b3480156105b257600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000007881565b6000426105e683611396565b111592915050565b60035460009015610658576003805461060990600190611c30565b8154811061061957610619611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600061066c60035490565b6040517fad36d6cc0000000000000000000000000000000000000000000000000000000081526004810182905290915060009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063ad36d6cc90602401602060405180830381865afa1580156106fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107219190611c76565b9050600081156107cd576040517f891aab740000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b173ffffffffffffffffffffffffffffffffffffffff169063891aab749060240160006040518083038186803b1580156107b057600080fd5b505afa1580156107c4573d6000803e3d6000fd5b5050505061085f565b7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc973ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190611c9f565b90505b81158015610883575073ffffffffffffffffffffffffffffffffffffffff81811614155b1561093e573373ffffffffffffffffffffffffffffffffffffffff82161461093e5760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6109466114cb565b86146109e05760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a401610935565b426109e961106f565b1115610a5d5760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e207468652066757475726500000000000000000000006064820152608401610935565b86610ad05760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f2068617368000000006064820152608401610935565b8415801590610adf5750834015155b15610b805784844014610b805760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a401610935565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909201919091559051879185918a917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610cd991815260200190565b60405180910390a48115610d8c576040517fbe119347000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b173ffffffffffffffffffffffffffffffffffffffff169063be11934790602401600060405180830381600087803b158015610d6f57600080fd5b505af1158015610d83573d6000803e3d6000fd5b50505050610e74565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663d38dc7ee84610df37f000000000000000000000000000000000000000000000000000000000000007842611cbc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b505050505b50505050505050565b60035460009061065c90600190611c30565b6000610e996105ee565b821115610f345760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a401610935565b600354610fcf5760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a401610935565b6003546000905b808210156110685760006002610fec8385611cbc565b610ff69190611cd4565b9050846003828154811061100c5761100c611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16101561105e57611057816001611cbc565b9250611062565b8091505b50610fd6565b5092915050565b600061065c61107c6114cb565b610536906001611cbc565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663ad36d6cc6110ce600184611c30565b6040518263ffffffff1660e01b81526004016110ec91815260200190565b602060405180830381865afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d9190611c76565b15611208573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146112035760405162461bcd60e51b815260206004820152605660248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f72206d616e6167657220636f6e74726163742063616e20736574206e65787460648201527f2066696e616c697a65206f757470757420696e64657800000000000000000000608482015260a401610935565b600455565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146112035760405162461bcd60e51b815260206004820152605360248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f7220706f6f6c20636f6e74726163742063616e20736574206e65787420666960648201527f6e616c697a65206f757470757420696e64657800000000000000000000000000608482015260a401610935565b6040805160808101825260008082526020820181905291810182905260608101919091526003828154811061131057611310611c47565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f0000000000000000000000000000000000000000000000000000000000000078600383815481106113cc576113cc611c47565b60009182526020909120600260039092020101546113fc91906fffffffffffffffffffffffffffffffff16611cbc565b92915050565b60006003828154811061141757611417611c47565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b604080516080810182526000808252602082018190529181018290526060810191909152600361147383610e8f565b8154811061131057611310611c47565b60007f0000000000000000000000000000000000000000000000000000000000000002600154836114b49190611c30565b6114be9190611d0f565b6002546113fc9190611cbc565b60035460009015611509577f00000000000000000000000000000000000000000000000000000000000000046114ff6105ee565b61065c9190611cbc565b61065c6105ee565b600054610100900460ff16158080156115315750600054600160ff909116105b8061154b5750303b15801561154b575060005460ff166001145b6115bd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610935565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561161b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156116b85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a401610935565b60028290556001839055801561172557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78816146117fb5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a401610935565b73ffffffffffffffffffffffffffffffffffffffff81166118845760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f000000000000000000000000000000006064820152608401610935565b60035483106119215760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a401610935565b60006003848154811061193657611936611c47565b6000918252602090912060039091020160028101549091507f00000000000000000000000000000000000000000000000000000000000000789061198c906fffffffffffffffffffffffffffffffff1642611c30565b10611a255760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a401610935565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184815285907f1ec0d63ba3dd4b277ece3e578c4c9587edfa0d855192704c88f9a1d74316624f9060200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208284031215611ad557600080fd5b5035919050565b600060208083528351808285015260005b81811015611b0957858101830151858201604001528201611aed565b81811115611b1b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060008060808587031215611b6557600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611b9457600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611bc557600080fd5b50565b600080600060608486031215611bdd57600080fd5b83359250602084013591506040840135611bf681611ba3565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611c4257611c42611c01565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611c8857600080fd5b81518015158114611c9857600080fd5b9392505050565b600060208284031215611cb157600080fd5b8151611c9881611ba3565b60008219821115611ccf57611ccf611c01565b500190565b600082611d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d4757611d47611c01565b50029056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01" }, @@ -326,27 +333,20 @@ "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806312e64a7214610046578063c423b1e81461006e578063dc8b50381461008f575b600080fd5b6100596100543660046117b2565b6100db565b60405190151581526020015b60405180910390f35b61008161007c366004611827565b6101a6565b6040516100659291906118f1565b6100b67f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b6040517fc423b1e800000000000000000000000000000000000000000000000000000000815260009081908190309063c423b1e890610122908a908990899060040161190c565b600060405180830381865afa15801561013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610185919081019061199c565b9150915081801561019b575061019b868261074b565b979650505050505050565b600060606002845110156102275760405162461bcd60e51b815260206004820152602960248201527f5a4b4d65726b6c65547269653a2070726f76696465642070726f6f662069732060448201527f746f6f2073686f7274000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61027e84600186516102399190611a5d565b8151811061024957610249611a74565b602002602001015180516020909101207f950654da67865a81bc70e45f3230f5179f08e29c66184bf746f71050f117b3b81490565b6102f05760405162461bcd60e51b815260206004820152602d60248201527f5a4b4d65726b6c65547269653a20746865206c617374206974656d206973206e60448201527f6f74206d61676963206861736800000000000000000000000000000000000000606482015260840161021e565b60006102fb86610767565b9050600061030886610846565b90506103526040805161010081019091528060008152600060208201819052604082018190526060808301829052608083015260a0820181905260c0820181905260e09091015290565b60408051602081019091526000808252835190918291829190829061037990600290611a5d565b90505b86818151811061038e5761038e611a74565b6020026020010151602001519550600060038111156103af576103af611aa3565b865160038111156103c2576103c2611aa3565b036104a05760006103d38983610939565b90508015610433578660200151861461042e5760405162461bcd60e51b815260206004820152601b60248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b6579204c0000000000604482015260640161021e565b610486565b866040015186146104865760405162461bcd60e51b815260206004820152601b60248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b657920520000000000604482015260640161021e565b61049887602001518860400151610996565b9550506106b5565b6001865160038111156104b5576104b5611aa3565b0361061857831580156104c6575082155b6105385760405162461bcd60e51b815260206004820152602660248201527f5a4b4d65726b6c65547269653a206475706c696361746564207465726d696e6160448201527f6c206e6f64650000000000000000000000000000000000000000000000000000606482015260840161021e565b87866060015114935083156107385761056b600160001b87606001516105668960a001518a60800151610a63565b610bff565b6080870151805160208102825260e0890151929750909350839115610611578e8860e00151148061059f5750898860e00151145b6106115760405162461bcd60e51b815260206004820152602260248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b657920707265696d6160448201527f6765000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b50506106b5565b60028651600381111561062d5761062d611aa3565b036106b5578315801561063e575082155b6106b05760405162461bcd60e51b815260206004820152602660248201527f5a4b4d65726b6c65547269653a206475706c696361746564207465726d696e6160448201527f6c206e6f64650000000000000000000000000000000000000000000000000000606482015260840161021e565b600192505b80600003610711578a851461070c5760405162461bcd60e51b815260206004820152601960248201527f5a4b4d65726b65547269653a20696e76616c696420726f6f7400000000000000604482015260640161021e565b610738565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161037c565b50919b919a509098505050505050505050565b6000818051906020012083805190602001201490505b92915050565b600080600061077584610d77565b6040805180820182528381526020810183905290517f299e566000000000000000000000000000000000000000000000000000000000815292945090925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae169163299e5660916107fd91600401611ad2565b602060405180830381865afa15801561081a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083e9190611b03565b949350505050565b805160609060008167ffffffffffffffff811115610866576108666115f9565b60405190808252806020026020018201604052801561089f57816020015b61088c61159a565b8152602001906001900390816108845790505b50905060005b6108b0600184611a5d565b8110156109315760006108db8683815181106108ce576108ce611a74565b6020026020010151610d9f565b905060405180604001604052808784815181106108fa576108fa611a74565b602002602001015181526020018281525083838151811061091d5761091d611a74565b6020908102919091010152506001016108a5565b509392505050565b6000610100821061098c5760405162461bcd60e51b815260206004820152601c60248201527f5a4b4d65726b6c65547269653a20746f6f206c6f6e6720646570746800000000604482015260640161021e565b506001901b161590565b6040805180820182528381526020810183905290517f299e566000000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae169163299e566091610a1b91600401611ad2565b602060405180830381865afa158015610a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5c9190611b03565b9392505050565b6000600182511015610add5760405162461bcd60e51b815260206004820152602b60248201527f5a4b547269654861736865723a20746f6f206665772076616c75657320666f7260448201527f205f76616c756548617368000000000000000000000000000000000000000000606482015260840161021e565b6000825167ffffffffffffffff811115610af957610af96115f9565b604051908082528060200260200182016040528015610b22578160200160208202803683370190505b50905060005b8351811015610bc8576001811b851663ffffffff1615610b8757610b64848281518110610b5757610b57611a74565b6020026020010151610767565b828281518110610b7657610b76611a74565b602002602001018181525050610bc0565b838181518110610b9957610b99611a74565b6020026020010151828281518110610bb357610bb3611a74565b6020026020010181815250505b600101610b28565b50600283511015610bf65780600081518110610be657610be6611a74565b6020026020010151915050610761565b61083e81611122565b6040805180820182528481526020810184905290517f299e56600000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae9173ffffffffffffffffffffffffffffffffffffffff83169163299e566091610c879190600401611ad2565b602060405180830381865afa158015610ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc89190611b03565b6040805180820182528281526020810186905290517f299e566000000000000000000000000000000000000000000000000000000000815291965073ffffffffffffffffffffffffffffffffffffffff83169163299e566091610d2d91600401611ad2565b602060405180830381865afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190611b03565b95945050505050565b60008082608081901b610d8a8260801c90565b610d948260801c90565b935093505050915091565b60408051610100810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c0810182905260e081019190915260408051610100810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c0810182905260e08101919091526000610e53846040805180820182526060815260006020918201528151808301909252828101825291519181019190915290565b90506000610e608261130c565b60ff16905080610e8b57610e7382611393565b6020840152610e8182611393565b60408401526110de565b6001810361101857610e9c82611393565b6060840152600080610ead84611431565b60ff16915091508163ffffffff166001148015610eca5750806001145b80610ee657508163ffffffff166004148015610ee65750806004145b610f585760405162461bcd60e51b815260206004820152602360248201527f4e6f64655265616465723a20696e76616c696420636f6d70726573736564466c60448201527f6167730000000000000000000000000000000000000000000000000000000000606482015260840161021e565b63ffffffff821660a08601528067ffffffffffffffff811115610f7d57610f7d6115f9565b604051908082528060200260200182016040528015610fa6578160200160208202803683370190505b50608086015260005b81811015610fe957610fc085611393565b86608001518281518110610fd657610fd6611a74565b6020908102919091010152600101610faf565b506000610ff58561130c565b60ff16905080156110105761100a85826114cb565b60e08701525b5050506110de565b600281146110de57600381036110965760405162461bcd60e51b815260206004820152602560248201527f4e6f64655265616465723a20756e657870656374656420726f6f74206e6f646560448201527f2074797065000000000000000000000000000000000000000000000000000000606482015260840161021e565b60405162461bcd60e51b815260206004820152601d60248201527f4e6f64655265616465723a20696e76616c6964206e6f64652074797065000000604482015260640161021e565b8060038111156110f0576110f0611aa3565b8390600381111561110357611103611aa3565b9081600381111561111657611116611aa3565b90525091949350505050565b600060048251101561119c5760405162461bcd60e51b815260206004820152602b60248201527f5a4b547269654861736865723a20746f6f206665772076616c75657320666f7260448201527f205f68617368456c656d73000000000000000000000000000000000000000000606482015260840161021e565b81517f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae9060009081906001906002905b808310156112e457600094505b808510156112d6578285019350808410156112cd578573ffffffffffffffffffffffffffffffffffffffff1663299e566060405180604001604052808b898151811061122757611227611a74565b602002602001015181526020018b888151811061124657611246611a74565b60200260200101518152506040518263ffffffff1660e01b815260040161126d9190611ad2565b602060405180830381865afa15801561128a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ae9190611b03565b8886815181106112c0576112c0611a74565b6020026020010181815250505b938101936111d9565b909150600182901b906111cc565b876000815181106112f7576112f7611a74565b60200260200101519650505050505050919050565b60006001826020015110156113635760405162461bcd60e51b815260206004820152601f60248201527f4e6f64655265616465723a20746f6f2073686f727420666f722075696e743800604482015260640161021e565b81518051600180830180865260208601805191949360f81c9291611388908390611a5d565b905250949350505050565b60006020826020015110156114105760405162461bcd60e51b815260206004820152602160248201527f4e6f64655265616465723a20746f6f2073686f727420666f722062797465733360448201527f3200000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b81518051602080830180865281860180519194939291611388908390611a5d565b6000806004836020015110156114895760405162461bcd60e51b815260206004820181905260248201527f4e6f64655265616465723a20746f6f2073686f727420666f722075696e743332604482015260640161021e565b8251805160048083018087526020870180519194939260f084901c9260f885901c92906114b7908390611a5d565b90525060ff90911697909650945050505050565b600081836020015110156115475760405162461bcd60e51b815260206004820152602160248201527f4e6f64655265616465723a20746f6f2073686f727420666f72206e206279746560448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b825160609060008061155a866008611b1c565b61156690610100611a5d565b8351848801808a5260208a01805191975091831c9450919250879161158c908390611a5d565b905250909695505050505050565b6040518060400160405280606081526020016115f46040805161010081019091528060008152600060208201819052604082018190526060808301829052608083015260a0820181905260c0820181905260e09091015290565b905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561166f5761166f6115f9565b604052919050565b600067ffffffffffffffff821115611691576116916115f9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126116ce57600080fd5b81356116e16116dc82611677565b611628565b8181528460208386010111156116f657600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261172457600080fd5b8135602067ffffffffffffffff80831115611741576117416115f9565b8260051b611750838201611628565b938452858101830193838101908886111561176a57600080fd5b84880192505b858310156117a6578235848111156117885760008081fd5b6117968a87838c01016116bd565b8352509184019190840190611770565b98975050505050505050565b600080600080608085870312156117c857600080fd5b84359350602085013567ffffffffffffffff808211156117e757600080fd5b6117f3888389016116bd565b9450604087013591508082111561180957600080fd5b5061181687828801611713565b949793965093946060013593505050565b60008060006060848603121561183c57600080fd5b83359250602084013567ffffffffffffffff81111561185a57600080fd5b61186686828701611713565b925050604084013590509250925092565b60005b8381101561189257818101518382015260200161187a565b838111156118a1576000848401525b50505050565b600081518084526118bf816020860160208601611877565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b821515815260406020820152600061083e60408301846118a7565b600060608201858352602060608185015281865180845260808601915060808160051b870101935082880160005b82811015611986577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808887030184526119748683516118a7565b9550928401929084019060010161193a565b5050505050604092909201929092529392505050565b600080604083850312156119af57600080fd5b825180151581146119bf57600080fd5b602084015190925067ffffffffffffffff8111156119dc57600080fd5b8301601f810185136119ed57600080fd5b80516119fb6116dc82611677565b818152866020838501011115611a1057600080fd5b611a21826020830160208601611877565b8093505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611a6f57611a6f611a2e565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408101818360005b6002811015611afa578151835260209283019290910190600101611adb565b50505092915050565b600060208284031215611b1557600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b5457611b54611a2e565b50029056fea164736f6c634300080f000a", "key": "0x82bbeea1b838affd4d92ca0d2b311b02fb5ed4b7666c5e3b7f08aaa3053c9809" }, - "0x73699c0f4f74d1b24108e888335732c3a58b61d4": { - "balance": "115792089237316195423570985008687907853269984665640564039455583849457825464927", - "nonce": 2, - "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "key": "0xe7b547586fcf107117aa59f02f431c6eec10681899c2658c4b822f87365ee9fb" - }, "0x7969c5ed335650692bc04293b07f5bf2e7a673c0": { "balance": "0", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xdbb384e7fd5370247780ce492f0bfa8f8373dbedc42a37e63017e6ced6eceb40", - "code": "0x608060405234801561001057600080fd5b50600436106102c75760003560e01c8063943e40051161017b578063b91b2723116100d8578063cdff5e191161008c578063dff221b511610071578063dff221b5146107dd578063e0cc26a21461080e578063e7816b7f1461084057600080fd5b8063cdff5e1914610799578063daec6770146107b657600080fd5b8063be119347116100bd578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b27231461034e578063bde022bb1461071b57600080fd5b8063a83871721161012f578063ac6c525111610114578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b02116101605780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102295780635bab847f116101dd57806368f10905116101c257806368f1090514610540578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105065780636874e0421461051957600080fd5b80634cca5e6c1161020e5780634cca5e6c1461044957806354fd4d501461047057806356b65e97146104b957600080fd5b80633ee4d4a3146103fb57806342223ae91461042257600080fd5b806322009af61161028057806330ccebb51161026557806330ccebb5146103ac5780633a549046146103cc5780633ca83045146103d457600080fd5b806322009af61461037d578063263a3402146103a457600080fd5b80630763fa7e116102b15780630763fa7e14610325578063110d60691461034e5780631796e52e1461035657600080fd5b80621c2ff6146102cc578063065643ea14610310575b600080fd5b6102f37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b61032361031e36600461505d565b610867565b005b61032d602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610307565b61032d606481565b61032d7f000000000000000000000000000000000000000000000000000000000000003281565b61032d7f000000000000000000000000000000000000000000000000000000000000001481565b610323610b1b565b6103bf6103ba3660046150a6565b610ba6565b60405161030791906150f2565b6102f3610e02565b61032d7f000000000000000000000000000000000000000000000000000000000000007881565b6102f37f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b61032d7f000000000000000000000000000000000000000000000000000000000000000281565b61032d7f000000000000000000000000000000000000000000000000000000000000000481565b6104ac6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103079190615133565b6104f66104c73660046150a6565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610307565b6103236105143660046151b4565b610f30565b6102f37f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701681565b61032361054e3660046150a6565b6110a5565b6103236105613660046150a6565b611248565b6103236105743660046150a6565b61135b565b6103236114bf565b61032d61058f3660046150a6565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b61032d7f000000000000000000000000000000000000000000000000000000000000007881565b6104f66105f13660046150a6565b61164c565b6103236106043660046151ed565b61167f565b6103236106173660046150a6565b611843565b61032361062a366004615208565b611976565b61068461063d3660046150a6565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610307565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b61032d7f000000000000000000000000000000000000000000000000000000000000006481565b61032d6107293660046150a6565b611c10565b61032361073c36600461522d565b611c74565b61032361074f366004615246565b611e53565b6107876107623660046150a6565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610307565b6107a1612226565b60405163ffffffff9091168152602001610307565b61032d7f000000000000000000000000000000000000000000000000000000000000003c81565b6107876107eb3660046150a6565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c3660046150a6565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032d7f000000000000000000000000000000000000000000000000000000000000000a81565b600061087233610ba6565b6005811115610883576108836150c3565b146108ba576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff161015610938576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610976576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016909116906319412a2090606401600060405180830381600087803b158015610a5c57600080fd5b505af1158015610a70573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000064811690851610801590610abc57610abc3361224b565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610b2633610ba6565b6005811115610b3757610b376150c3565b141580610b645750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610b9b576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba43361224b565b565b6001600160a01b03811660009081526004602052604081205460ff16610bce57506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063981cee5390602401602060405180830381865afa158015610c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca7919061526d565b6fffffffffffffffffffffffffffffffff161015610cc757506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000646fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690638abf0af090602401602060405180830381865afa158015610d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbc919061526d565b6fffffffffffffffffffffffffffffffff161015610deb5780610de25750600292915050565b50600492915050565b80610df95750600392915050565b50600592915050565b600080546001600160a01b031615610f0b5760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e98919061528a565b9050804210610efa576000610ead82426152d2565b90507f00000000000000000000000000000000000000000000000000000000000000046fffffffffffffffffffffffffffffffff16811115610ef8576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b6000610f3b83610ba6565b9050818015610f7657506001816005811115610f5957610f596150c3565b1480610f7657506004816005811115610f7457610f746150c3565b145b15610fd457610f86600184612343565b15610fcf57826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051610fc691815260200190565b60405180910390a25b505050565b6004816005811115610fe857610fe86150c3565b10610fcf576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015261109f9185917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015611072573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611096919061526d565b600191906124e5565b50505050565b6001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16611106576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614611148576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156111ae576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111b7816127fa565b6001600160a01b03811660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361122682610ba6565b6005811115611237576112376150c3565b03611245576112458161224b565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146112aa576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112b4610e02565b90506001600160a01b03808216148015906112e15750806001600160a01b0316826001600160a01b031614155b15611318576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113218261164c565b611357576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906152e9565b6001600160a01b0316336001600160a01b031614611427576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638c1516c7906024015b600060405180830381600087803b1580156114a457600080fd5b505af11580156114b8573d6000803e3d6000fd5b5050505050565b60026114ca33610ba6565b60058111156114db576114db6150c3565b10806115075750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b1561153e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61154733611c10565b6fffffffffffffffffffffffffffffffff16421015611592576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64910160405180910390a2505050565b6000600561165983610ba6565b600581111561166a5761166a6150c3565b0361167757506001919050565b506000919050565b600261168a33610ba6565b600581111561169b5761169b6150c3565b10806116c75750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156116fe576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff8316111561174b576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff620100009091048116908316819003611794576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a3079101610fc6565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c591906152e9565b6001600160a01b0316336001600160a01b03161461190f576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063a83871729060240161148a565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f891906152e9565b6001600160a01b0316336001600160a01b031614611a42576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063536afae4906024016020604051808303816000875af1158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec919061526d565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611bf183610ba6565b6005811115611c0257611c026150c3565b03610fcf57610fcf8261224b565b6001600160a01b038116600090815260046020526040812054611c6e907f00000000000000000000000000000000000000000000000000000000000000789064010000000090046fffffffffffffffffffffffffffffffff16615306565b92915050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614611cd6576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cde61285f565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8491906152e9565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690638c1516c790602401600060405180830381600087803b158015611e0557600080fd5b505af1158015611e19573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611e43905057611e3e816127fa565b611e4b565b611e4b612f95565b61135761306c565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed591906152e9565b6001600160a01b0316336001600160a01b031614611f1f576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690635636aabd906024016020604051808303816000875af1158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc9919061526d565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a3612029826000613306565b837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612088573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ac919061528a565b1161210457600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090911617905561109f565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063c42996d6906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c1919061526d565b90506121ce836000610f30565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122469063ffffffff64010000000082048116911661533a565b905090565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526122fd9183917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa1580156122d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f4919061526d565b600191906134bc565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a4260405161233891815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203612375576000915050611c6e565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff82161561248c5763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906123ea565b6124968684613a41565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff168082036125175760009150506127f3565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156126c75763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156126b75763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612616565b506126c287846141cd565b6127eb565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156127e05763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061273e565b506127eb87846143d9565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff1615611245576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e4919061528a565b905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296a919061528a565b90507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ee91906152e9565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612a1b91815260200190565b602060405180830381865afa158015612a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5c919061535f565b612a695760009250505090565b6000805b7f000000000000000000000000000000000000000000000000000000000000000a6fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612ac05750828411155b15612ed4576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015612b43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b67919061535f565b15612ed4576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0e91906152e9565b90506000806000612c1e84614804565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063ad42945190608401600060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612eb4576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063c42996d6906044016020604051808303816000875af1158015612e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e29919061526d565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612ebf856000610f30565b87600101975085600101955050505050612a6d565b6fffffffffffffffffffffffffffffffff821615612f8a576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b0316612fa757565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000026fffffffffffffffffffffffffffffffff1661010090910460ff161061301857600054610ba4906001600160a01b03166001613306565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561311b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313f919061528a565b90506000826effffffffffffffffffffffffffffff161180156131625750600081115b156132da5760006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae5576131a36001856152d2565b6040518263ffffffff1660e01b81526004016131c191815260200190565b608060405180830381865afa1580156131de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613202919061537c565b9050600083826020015143414460014361321c91906152d2565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c61328d919061544e565b905061329a600182614a6a565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055506113579050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b600081613333577f0000000000000000000000000000000000000000000000000000000000000078613355565b7f000000000000000000000000000000000000000000000000000000000000003c5b9050600061338c846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b61339f5761339a8242615306565b6133d5565b6001600160a01b0384166000908152600560205260409020546133d59083906fffffffffffffffffffffffffffffffff16615306565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a261346e600185612343565b1561109f57836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961426040516134ae91815260200190565b60405180910390a250505050565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff1660000361379757845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036138d35763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556138ca87846141cd565b50505050505050565b8054600160e01b900463ffffffff166000036139a95763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556138ca87846141cd565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613a29578054600160e01b900463ffffffff169150613a3b565b8054600160c01b900463ffffffff1691505b506137ac565b63ffffffff8082166000908152600184016020526040812080549092600160c01b909104169003613d24578054600160e01b900463ffffffff16600003613bd357805474010000000000000000000000000000000000000000900463ffffffff16600003613ad45782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613b8f565b600181015460ff1615613b3c57805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613b8f565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906141c7565b8054600160e01b900463ffffffff16600003613e8b57805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906141c7565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff6101009283900481169290910416111561405957805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116906141c7565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613a41565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff161580159061425b5750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561109f57815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120614208565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561462257600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610fcf57805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c16179055885486900487168086529282528385205490971684529590955290208054909516909217909355905404166143da565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610fcf57805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c16179055885486900487168086529282528385205490971684529590955290208054909516909217909355905404166143da565b6001600160a01b0381166000908152600460205260408120548190819062010000900460ff168161483486614c39565b90506000806148796fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000014850116856064614d6f565b90506148bc6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000001416606486810390614d6f565b91506148df6fffffffffffffffffffffffffffffffff8416606486810390614d6f565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063981cee5390602401602060405180830381865afa158015614964573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614988919061526d565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690636b9ffeac90602401602060405180830381865afa158015614a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a31919061526d565b90506000614a546fffffffffffffffffffffffffffffffff861684808501614d6f565b948590039b959a50505091019550909350505050565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614b035763ffffffff9081166000908152600185016020526040902054600160c01b900416614a82565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614b9c5763ffffffff1660009081526001840160205260409020546001600160a01b03169050611c6e565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff90811690940393848116700100000000000000000000000000000000909204161115614c2f5763ffffffff9081166000908152600185016020526040902054600160e01b900416614a82565b6000915050611c6e565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063913f1a9f90602401602060405180830381865afa158015614cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ce1919061526d565b90506000614d246fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000141660286064614d6f565b9050614d67816fffffffffffffffffffffffffffffffff1665010000000000614d60856fffffffffffffffffffffffffffffffff166064614e23565b9190614eea565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611614df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff168181614e1957614e1961541f565b0495945050505050565b6000808383108015614e3c5760018114614e4f57614e5e565b6501000000000085028490049150614e5e565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611c6e576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003614f4257838281614f3857614f3861541f565b04925050506127f3565b808411614fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f7700000000000000000000006044820152606401614def565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff8116811461124557600080fd5b803560ff8116811461504357600080fd5b919050565b6001600160a01b038116811461124557600080fd5b60008060006060848603121561507257600080fd5b833561507d81615014565b925061508b60208501615032565b9150604084013561509b81615048565b809150509250925092565b6000602082840312156150b857600080fd5b81356127f381615048565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061512d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561516057858101830151858201604001528201615144565b81811115615172576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b801515811461124557600080fd5b600080604083850312156151c757600080fd5b82356151d281615048565b915060208301356151e2816151a6565b809150509250929050565b6000602082840312156151ff57600080fd5b6127f382615032565b6000806040838503121561521b57600080fd5b8235915060208301356151e281615048565b60006020828403121561523f57600080fd5b5035919050565b60008060006060848603121561525b57600080fd5b83359250602084013561508b81615048565b60006020828403121561527f57600080fd5b81516127f381615014565b60006020828403121561529c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156152e4576152e46152a3565b500390565b6000602082840312156152fb57600080fd5b81516127f381615048565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615331576153316152a3565b01949350505050565b600063ffffffff83811690831681811015615357576153576152a3565b039392505050565b60006020828403121561537157600080fd5b81516127f3816151a6565b60006080828403121561538e57600080fd5b6040516080810181811067ffffffffffffffff821117156153d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516153e681615048565b815260208381015190820152604083015161540081615014565b6040820152606083015161541381615014565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680615497577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a", + "codeHash": "0xdd2e3ed8a89ebac3d8450987be6e6d99a48bb965d73a7fec73d29f23a865656d", + "code": "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461546c565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000003281565b6103387f000000000000000000000000000000000000000000000000000000000000001481565b61032e610ba0565b6103ca6103c53660046154b5565b610c2b565b6040516103129190615501565b6102fe610e87565b6103387f000000000000000000000000000000000000000000000000000000000000007881565b6102fe7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b6103387f000000000000000000000000000000000000000000000000000000000000000281565b6103387f000000000000000000000000000000000000000000000000000000000000000481565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103129190615542565b6105016104d23660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f3660046155c3565b610fb5565b6102fe7f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701681565b61032e61112a565b61032e6105613660046154b5565b61126d565b61032e6105743660046154b5565b611380565b61032e6114e4565b61033861058f3660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000007881565b6105016105f13660046154b5565b6116f5565b61032e6106043660046155fc565b611728565b61032e6106173660046154b5565b6118f4565b61032e61062a366004615617565b611a27565b61068461063d3660046154b5565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000006481565b6103386107293660046154b5565b611cc1565b61032e61073c36600461563c565b611d25565b61032e61074f366004615655565b611f04565b6107876107623660046154b5565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a16122d7565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000003c81565b6107876107eb3660046154b5565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c3660046154b5565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e3660046154b5565b6122fc565b6103387f000000000000000000000000000000000000000000000000000000000000000a81565b3332146108b3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156108ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108f733610c2b565b6005811115610908576109086154d2565b1461093f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156109bd576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff831611156109fb576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016909116906319412a2090606401600060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000064811690851610801590610b4157610b41336123c0565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610bab33610c2b565b6005811115610bbc57610bbc6154d2565b141580610be95750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610c20576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c29336123c0565b565b6001600160a01b03811660009081526004602052604081205460ff16610c5357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063981cee5390602401602060405180830381865afa158015610d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2c919061567c565b6fffffffffffffffffffffffffffffffff161015610d4c57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000646fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690638abf0af090602401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e41919061567c565b6fffffffffffffffffffffffffffffffff161015610e705780610e675750600292915050565b50600492915050565b80610e7e5750600392915050565b50600592915050565b600080546001600160a01b031615610f905760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190615699565b9050804210610f7f576000610f3282426156e1565b90507f00000000000000000000000000000000000000000000000000000000000000046fffffffffffffffffffffffffffffffff16811115610f7d576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b6000610fc083610c2b565b9050818015610ffb57506001816005811115610fde57610fde6154d2565b1480610ffb57506004816005811115610ff957610ff96154d2565b145b156110595761100b6001846124b8565b1561105457826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161104b91815260200190565b60405180910390a25b505050565b600481600581111561106d5761106d6154d2565b10611054576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111249185917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b919061567c565b6001919061265a565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611182576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156111df576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e83361296f565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361124e33610c2b565b600581111561125f5761125f6154d2565b03610c2957610c29336123c0565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146112cf576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d9610e87565b90506001600160a01b03808216148015906113065750806001600160a01b0316826001600160a01b031614155b1561133d576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346826116f5565b61137c576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906156f8565b6001600160a01b0316336001600160a01b03161461144c576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638c1516c7906024015b600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b5050505050565b60026114ef33610c2b565b6005811115611500576115006154d2565b108061152c5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611563576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061156e33611cc1565b90507f00000000000000000000000000000000000000000000000000000000000000786fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff16036115ed576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff16421015611639576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561170283610c2b565b6005811115611713576117136154d2565b0361172057506001919050565b506000919050565b600261173333610c2b565b6005811115611744576117446154d2565b10806117705750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156117a7576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff831611156117f4576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff62010000909104811690831681900361183d576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197691906156f8565b6001600160a01b0316336001600160a01b0316146119c0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063a8387172906024016114af565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa991906156f8565b6001600160a01b0316336001600160a01b031614611af3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063536afae4906024016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061567c565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611ca283610c2b565b6005811115611cb357611cb36154d2565b0361105457611054826123c0565b6001600160a01b038116600090815260046020526040812054611d1f907f00000000000000000000000000000000000000000000000000000000000000789064010000000090046fffffffffffffffffffffffffffffffff16615715565b92915050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614611d87576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8f6129d4565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906156f8565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690638c1516c790602401600060405180830381600087803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611ef4905057611eef8161296f565b611efc565b611efc61310a565b61137c6131e1565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906156f8565b6001600160a01b0316336001600160a01b031614611fd0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690635636aabd906024016020604051808303816000875af1158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a919061567c565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a36120da82600061347b565b837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190615699565b116121b557600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611124565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063c42996d6906044016020604051808303816000875af115801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061567c565b905061227f836000610fb5565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122f79063ffffffff640100000000820481169116615749565b905090565b336001600160a01b037f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016161461235e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361236982610c2b565b600581111561237a5761237a6154d2565b1480156123af57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b156123bd576123bd816123c0565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124729183917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612469919061567c565b60019190613623565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a426040516124ad91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff168082036124ea576000915050611d1f565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156126015763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061255f565b61260b8684613cf1565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361268c576000915050612968565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff851617909455935492909104169274010000000000000000000000000000000000000000909104169082101561283c5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff82161561282c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061278b565b506128378784614516565b612960565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156129555763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906128b3565b506129608784614722565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123bd576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190615699565b905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adf9190615699565b90507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906156f8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b9091815260200190565b602060405180830381865afa158015612bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd1919061576e565b612bde5760009250505090565b6000805b7f000000000000000000000000000000000000000000000000000000000000000a6fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612c355750828411155b15613049576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc919061576e565b15613049576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8391906156f8565b90506000806000612d9384614b4d565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063ad42945190608401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015613029576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063c42996d6906044016020604051808303816000875af1158015612f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9e919061567c565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b613034856000610fb5565b87600101975085600101955050505050612be2565b6fffffffffffffffffffffffffffffffff8216156130ff576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b1580156130dc57600080fd5b505af11580156130f0573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b031661311c57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000026fffffffffffffffffffffffffffffffff1661010090910460ff161061318d57600054610c29906001600160a01b0316600161347b565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b49190615699565b90506000826effffffffffffffffffffffffffffff161180156132d75750600081115b1561344f5760006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae5576133186001856156e1565b6040518263ffffffff1660e01b815260040161333691815260200190565b608060405180830381865afa158015613353573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613377919061578b565b9050600083826020015143414460014361339191906156e1565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613402919061585d565b905061340f600182614e7e565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061137c9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816134a8577f00000000000000000000000000000000000000000000000000000000000000786134ca565b7f000000000000000000000000000000000000000000000000000000000000003c5b90506000613501846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6135145761350f8242615715565b61354a565b6001600160a01b03841660009081526005602052604090205461354a9083906fffffffffffffffffffffffffffffffff16615715565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a26135e36001856124b8565b1561112457836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961426040516116e791815260200190565b6001600160a01b0382166136be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42616c616e636564576569676874547265653a207a65726f206164647265737360448201527f206e6f7420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260028401602052604090205463ffffffff161561376c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f42616c616e636564576569676874547265653a206e6f646520616c726561647960448201527f206578697374696e67000000000000000000000000000000000000000000000060648201526084016136b5565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff16600003613a4757845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b909104169003613b835763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b909102178155613b7a8784614516565b50505050505050565b8054600160e01b900463ffffffff16600003613c595763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b909102178155613b7a8784614516565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613cd9578054600160e01b900463ffffffff169150613ceb565b8054600160c01b900463ffffffff1691505b50613a5c565b63ffffffff81166000908152600183016020526040902080546001600160a01b0316613d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42616c616e636564576569676874547265653a206e6f6465206e6f742065786960448201527f737473000000000000000000000000000000000000000000000000000000000060648201526084016136b5565b8054600160c01b900463ffffffff1660000361406d578054600160e01b900463ffffffff16600003613f1c57805474010000000000000000000000000000000000000000900463ffffffff16600003613e1d5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613ed8565b600181015460ff1615613e8557805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613ed8565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b8054600160e01b900463ffffffff166000036141d457805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff610100928390048116929091041611156143a257805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613cf1565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906145a45750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561112457815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120614551565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561496b57600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b60008060007f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970166001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bd491906156f8565b6001600160a01b0316846001600160a01b031603614c1a5750600091508190507f0000000000000000000000000000000000000000000000000000000000000014614e77565b6001600160a01b03841660009081526004602052604081205462010000900460ff1690614c468661504d565b9050600080614c8b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000014850116856064615183565b9050614cce6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000001416606486810390615183565b9150614cf16fffffffffffffffffffffffffffffffff8416606486810390615183565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063981cee5390602401602060405180830381865afa158015614d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d9a919061567c565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690636b9ffeac90602401602060405180830381865afa158015614e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e43919061567c565b90506000614e666fffffffffffffffffffffffffffffffff861684808501615183565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614f175763ffffffff9081166000908152600185016020526040902054600160c01b900416614e96565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614fb05763ffffffff1660009081526001840160205260409020546001600160a01b03169050611d1f565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156150435763ffffffff9081166000908152600185016020526040902054600160e01b900416614e96565b6000915050611d1f565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063913f1a9f90602401602060405180830381865afa1580156150d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f5919061567c565b905060006151386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000141660286064615183565b905061517b816fffffffffffffffffffffffffffffffff1665010000000000615174856fffffffffffffffffffffffffffffffff166064615232565b91906152f9565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611615207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064016136b5565b826fffffffffffffffffffffffffffffffff1681816152285761522861582e565b0495945050505050565b600080838310801561524b576001811461525e5761526d565b650100000000008502849004915061526d565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611d1f576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615351578382816153475761534761582e565b0492505050612968565b8084116153ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016136b5565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff811681146123bd57600080fd5b803560ff8116811461545257600080fd5b919050565b6001600160a01b03811681146123bd57600080fd5b60008060006060848603121561548157600080fd5b833561548c81615423565b925061549a60208501615441565b915060408401356154aa81615457565b809150509250925092565b6000602082840312156154c757600080fd5b813561296881615457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061553c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561556f57858101830151858201604001528201615553565b81811115615581576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123bd57600080fd5b600080604083850312156155d657600080fd5b82356155e181615457565b915060208301356155f1816155b5565b809150509250929050565b60006020828403121561560e57600080fd5b61296882615441565b6000806040838503121561562a57600080fd5b8235915060208301356155f181615457565b60006020828403121561564e57600080fd5b5035919050565b60008060006060848603121561566a57600080fd5b83359250602084013561549a81615457565b60006020828403121561568e57600080fd5b815161296881615423565b6000602082840312156156ab57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156156f3576156f36156b2565b500390565b60006020828403121561570a57600080fd5b815161296881615457565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615740576157406156b2565b01949350505050565b600063ffffffff83811690831681811015615766576157666156b2565b039392505050565b60006020828403121561578057600080fd5b8151612968816155b5565b60006080828403121561579d57600080fd5b6040516080810181811067ffffffffffffffff821117156157e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516157f581615457565b815260208381015190820152604083015161580f81615423565b6040820152606083015161582281615423565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff808416806158a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a", "key": "0x60229d8572100b3ab5a8141d15bf4603349edc37075f6b048fb50d7c27fcb6a1" }, "0x82e01223d51eb87e16a03e24687edf0f294da6f1": { "balance": "0", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xd61cbceff4b748cf99abc12ae9e0bbcf684c23c81da7417fbf22e7bdc1581f78", - "code": "0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80638abf0af011610191578063b172597e116100e3578063c2d9b68411610097578063d706200511610071578063d706200514610826578063de7d4d6a1461084d578063fdbb3fd21461085757600080fd5b8063c2d9b684146107d4578063c42996d614610800578063c7ab2c071461081357600080fd5b8063b744d2f9116100c8578063b744d2f914610773578063bcacc70a14610786578063c0a63a79146107ad57600080fd5b8063b172597e1461074d578063b55cd78e1461076057600080fd5b8063a51c9ace11610145578063a85120e41161011f578063a85120e414610700578063ad42945114610713578063ae9483e01461072657600080fd5b8063a51c9ace146106d2578063a63b8d14146106da578063a8387172146106ed57600080fd5b8063913f1a9f11610176578063913f1a9f14610655578063960a08931461068a578063981cee531461069d57600080fd5b80638abf0af01461062f5780638c1516c71461064257600080fd5b806354469aea1161024a5780636b9ffeac116101fe578063833a333b116101d8578063833a333b146105c5578063842d0d3b146105d857806386d18a941461061c57600080fd5b80636b9ffeac1461053d5780637db41f971461057257806382dae3aa146105bd57600080fd5b80635636aabd1161022f5780635636aabd146104c757806356576b5b146104da5780635959b7651461050157600080fd5b806354469aea1461046b57806354fd4d501461047e57600080fd5b8063209a9694116102ac5780633608641711610286578063360864171461040657806340ce01f114610445578063536afae41461045857600080fd5b8063209a9694146103b5578063270a1644146103e057806331d8e007146103f357600080fd5b806319412a20116102dd57806319412a201461037c5780631e5d81781461038f5780631f86f4f1146103a257600080fd5b806308fab167146102f9578063150b7a021461030e575b600080fd5b61030c6103073660046136b1565b61087e565b005b61034661031c3660046136e4565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61030c61038a36600461377f565b610aa5565b61030c61039d3660046137c2565b610bdf565b61030c6103b0366004613848565b610f76565b6103c86103c33660046136b1565b61131f565b6040516001600160801b039091168152602001610373565b61030c6103ee366004613872565b611334565b61030c6104013660046137c2565b61140f565b61042d7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b6040516001600160a01b039091168152602001610373565b61030c610453366004613848565b6118a1565b6103c8610466366004613872565b611b5a565b61030c61047936600461388d565b611c48565b6104ba6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161037391906138d4565b6103c86104d5366004613872565b611dc3565b61042d7f000000000000000000000000ff000000000000000000000000000000000000ff81565b6103c861050f366004613872565b6001600160a01b0316600090815260208190526040902060020154600160801b90046001600160801b031690565b6103c861054b366004613872565b6001600160a01b03166000908152602081905260409020600301546001600160801b031690565b6103c8610580366004613925565b6001600160a01b0391821660009081526020818152604080832093909416825260069092019091522054600160801b90046001600160801b031690565b6103c8601481565b6103c86105d3366004613925565b611eae565b6103c86105e6366004613925565b6001600160a01b03918216600090815260208181526040808320939094168252600590920190915220546001600160801b031690565b6103c861062a36600461394f565b611f27565b6103c861063d366004613872565b611f98565b61030c610650366004613872565b611fd1565b6103c8610663366004613872565b6001600160a01b03166000908152602081905260409020600401546001600160801b031690565b6103c86106983660046136b1565b612178565b6103c86106ab366004613872565b6001600160a01b03166000908152602081905260409020600201546001600160801b031690565b6103c8606481565b6103c86106e8366004613872565b612184565b61030c6106fb366004613872565b6121d4565b6103c861070e3660046136b1565b6122f4565b61030c61072136600461398b565b61268b565b61042d7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b181565b6103c861075b366004613872565b612978565b6103c861076e366004613925565b6129b0565b61030c6107813660046136b1565b612a15565b6103c87f000000000000000000000000000000000000000000000000000000000000000a81565b61042d7f00000000000000000000000014dc79964da2c08b23698b3d3cc7ca32193d995581565b61042d6107e2366004613872565b6001600160a01b039081166000908152602081905260409020541690565b6103c861080e3660046136b1565b612d0d565b6103c8610821366004613925565b612ec6565b61042d7f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802981565b6103c8620f424081565b6103c87f000000000000000000000000000000000000000000000000000000000000007881565b6001600160a01b0382811660009081526020819052604090205483911633146108d3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160801b0316600003610916576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4261092084612184565b6001600160801b03161115610961576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61096b8383612f04565b6040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b1580156109ee57600080fd5b505af1158015610a02573d6000803e3d6000fd5b5050506001600160a01b03808516600090815260208190526040902054610a5892507f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029821691166001600160801b038516612fb7565b6040516001600160801b03831681526001600160a01b038416907fab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8906020015b60405180910390a2505050565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614610b07576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610b47576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03838116600090815260208190526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001692841692909217909155610b9b9084908490613083565b6040516001600160801b03831681526001600160a01b038416907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a4790602001610a98565b6000819003610c1a576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526006019091528120905b82811015610d7257816001016000858584818110610c6057610c606139df565b602090810292909201358352508101919091526040016000908120546001600160801b03169003610cbd576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610ce18633878786818110610cd557610cd56139df565b90506020020135611f27565b6001600160801b03161115610d22576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001016000858584818110610d3a57610d3a6139df565b6020908102929092013583525081019190915260400160002080546fffffffffffffffffffffffffffffffff19169055600101610c40565b506000610d7f85336131b9565b6001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b900382161790915533855260069091019092529091208054808316600160801b91829004841688900390931602919091179055905060005b83811015610ed3577f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b03166342842e0e3033888886818110610e4157610e416139df565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610eb057600080fd5b505af1158015610ec4573d6000803e3d6000fd5b50505050806001019050610df6565b506001600160801b03811615610f2057610f206001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416612fb7565b336001600160a01b0316856001600160a01b03167f6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb943868685604051610f6793929190613a5d565b60405180910390a35050505050565b8160026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa158015610ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101c9190613ab9565b600581111561102d5761102d613a8a565b10806110d757506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa1580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d79190613ae1565b1561110e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061111a84336131b9565b90506001600160801b038116156111b2576111686001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416612fb7565b6040516001600160801b038216815233906001600160a01b038616907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b0316906342842e0e90606401600060405180830381600087803b15801561123957600080fd5b505af115801561124d573d6000803e3d6000fd5b505050506001600160a01b038416600090815260208181526040808320338452600681018352818420600490910180546001600160801b03808216600190810182166fffffffffffffffffffffffffffffffff19938416179093558354600160801b808204831685018316029082161784558987529190920190935292208054429092169190921617905560405183815233906001600160a01b038616907f7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d906020015b60405180910390a350505050565b600061132b8383613258565b90505b92915050565b600061134082336131b9565b9050806001600160801b0316600003611385576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113c26001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416612fb7565b6040516001600160801b038216815233906001600160a01b038416907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35050565b8260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613ab9565b60058111156114c6576114c6613a8a565b108061157057506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa15801561154c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115709190613ae1565b156115a7576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290036115e2576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115ee85336131b9565b90506001600160801b038116156116865761163c6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416612fb7565b6040516001600160801b038216815233906001600160a01b038716907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6001600160a01b0385166000908152602081815260408083203384526006019091528120905b848110156117db577f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b03166342842e0e33308989868181106116f7576116f76139df565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561176657600080fd5b505af115801561177a573d6000803e3d6000fd5b5050505042826001016000888885818110611797576117976139df565b90506020020135815260200190815260200160002060006101000a8154816001600160801b0302191690836001600160801b031602179055508060010190506116ac565b506001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b0182161790915533855260069091019092529091208054808316600160801b918290048416880190931602919091179055336001600160a01b0316866001600160a01b03167fafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f18787604051611891929190613b03565b60405180910390a3505050505050565b6001600160a01b03821660009081526020818152604080832033845260060182528083208484526001810190925282205490916001600160801b039091169003611917576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42611923843385611f27565b6001600160801b03161115611964576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061197084336131b9565b9050611a248433856001600160a01b03928316600090815260208181526040808320949095168252600684018152848220600490940180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160801b03808316820181166fffffffffffffffffffffffffffffffff19938416179093558654600160801b808204851690920184169091029216919091178555928252600190930190925291902080549091169055565b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018490527f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b0316906342842e0e90606401600060405180830381600087803b158015611aab57600080fd5b505af1158015611abf573d6000803e3d6000fd5b505050506001600160801b03811615611b0f57611b0f6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416612fb7565b604080518481526001600160801b038316602082015233916001600160a01b038716917fd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab419101611311565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614611bbe576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180546fffffffffffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000a600160801b8084046001600160801b0390811683018116909102928316938116928116929092178101909116919091179091555b919050565b806001600160801b0316600003611c8b576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040517f30ccebb50000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b16001600160a01b0316906330ccebb590602401602060405180830381865afa158015611d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2e9190613ab9565b6005811115611d3f57611d3f613a8a565b03611d76576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8233826001613083565b6040516001600160801b038216815233907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a479060200160405180910390a250565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614611e27576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b808404821683900382160280821693821693909317829003166fffffffffffffffffffffffffffffffff199290921691909117909155919050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b9092048216918591611f00911683613b46565b8354611f1c9190600160801b90046001600160801b0316613b6e565b979650505050505050565b6001600160a01b03808416600090815260208181526040808320938616835260069093018152828220848352600101905290812054611f90907f0000000000000000000000000000000000000000000000000000000000000078906001600160801b0316613b9d565b949350505050565b6001600160a01b0381166000908152602081905260408120600281015460039091015461132e916001600160801b039081169116613b9d565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614612033576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152602081905260408120600201805490919061206f906001600160801b03600160801b820481169116613b46565b90507f000000000000000000000000000000000000000000000000000000000000000a6001600160801b0316816001600160801b031610156120dd576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546001600160801b03600160801b80830482167f000000000000000000000000000000000000000000000000000000000000000a9081018316909102919092161783556001600160a01b038416907f7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e906121588185613b46565b604080516001600160801b03938416815292909116602083015201610a98565b600061132b83836132d8565b6001600160a01b03811660009081526020819052604081206001015461132e907f0000000000000000000000000000000000000000000000000000000000000078906001600160801b0316613b9d565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614612236576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040902060020180547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b8084048216839003821681029382168481178087559596957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a956122cd94939091048316921617613b46565b604080516001600160801b0393841681529290911660208301520160405180910390a25050565b60008260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa158015612378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239c9190613ab9565b60058111156123ad576123ad613a8a565b108061245757506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa158015612433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124579190613ae1565b1561248e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160801b03166000036124d1576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61250f6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291633306001600160801b038716613347565b600061251b85856132d8565b6001600160a01b038616600090815260208181526040808320600381018054600160801b6fffffffffffffffffffffffffffffffff1982166001600160801b039283168d0183169081178290048316890183168202179092553386526005909201909352922080548316840183164290931690910291909117905590506040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152600060248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b5050604080516001600160801b038089168252851660208201523393506001600160a01b03891692507f334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328910160405180910390a3949350505050565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146126ed576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127627f00000000000000000000000014dc79964da2c08b23698b3d3cc7ca32193d9955308361271d8688613b9d565b6127279190613b9d565b6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029169291906001600160801b0316613347565b7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160a01b0316846001600160a01b0316036128135761280e7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e826127ca8587613b9d565b6127d49190613b9d565b6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291691906001600160801b0316612fb7565b612972565b6001600160a01b03841660009081526020819052604090206003810180546001600160801b03808216870181166fffffffffffffffffffffffffffffffff199283161790925560028301805480841686018416921691909117815560049092015416156128c85760028101546001600160801b039081169084168161289a5761289a613bc8565b6002830180546001600160801b0380821694909304600160801b918290048416019092169091029190911790555b80547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b8084048216839003821681029382168481178087556001600160a01b038b16957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a959461294d94909204821692911617613b46565b604080516001600160801b0393841681529290911660208301520160405180910390a2505b50505050565b6001600160a01b03811660009081526020819052604081206002015461132e906001600160801b03600160801b820481169116613b46565b6001600160a01b038281166000908152602081815260408083209385168352600590930190529081205461132b907f000000000000000000000000000000000000000000000000000000000000007890600160801b90046001600160801b0316613b9d565b806001600160801b0316600003612a58576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a6483836132d8565b9050806001600160801b0316600003612aa9576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526005019091529020546001600160801b039081169082161115612b14576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42612b1f84336129b0565b6001600160801b03161115612b60576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083206003810180546001600160801b03600160801b80830482168990038216028082169282169290921789900381166fffffffffffffffffffffffffffffffff1992831617909255338652600590920190935292208054808316859003909216919092161790556040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b158015612c6157600080fd5b505af1158015612c75573d6000803e3d6000fd5b50612cb89250506001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029169050336001600160801b038516612fb7565b604080516001600160801b0380851682528316602082015233916001600160a01b038616917f6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9910160405180910390a3505050565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614612d71576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038084166000818152602081905260409020600201917f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e169003612e1c57612e136001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029167f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160801b038616612fb7565b8291505061132e565b6000612e346001600160801b03851660146064613398565b9050612e936001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029167f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160801b038416612fb7565b81546fffffffffffffffffffffffffffffffff198116919094036001600160801b03948516810190941617905550919050565b6001600160a01b038083166000908152602081815260408083209385168352600590930190529081205461132b9084906001600160801b0316613258565b6001600160a01b03821660009081526020819052604090206002018054612f3d906001600160801b03600160801b820481169116613b46565b6001600160801b0316826001600160801b03161115612f88576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546fffffffffffffffffffffffffffffffff1981166001600160801b03918216939093031691909117905550565b6040516001600160a01b03831660248201526044810182905261307e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261343a565b505050565b6001600160a01b038084166000908152602081905260409020906130d4907f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291685306001600160801b038716613347565b6002810180546fffffffffffffffffffffffffffffffff198082166001600160801b039283168701831617909255600183018054909216429091161790558115612972576040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152600060248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b15801561319b57600080fd5b505af11580156131af573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b909204821691859161320b911683613b46565b83546132279190600160801b90046001600160801b0316613b6e565b83546fffffffffffffffffffffffffffffffff19166001600160801b03939093169290921790925595945050505050565b6001600160a01b03821660009081526020819052604081206003015461132b906001600160801b031661328c906001613b9d565b6001600160a01b038516600090815260208190526040902060030154620f424090600160801b90046001600160801b03166132c79190613b9d565b6001600160801b0385169190613398565b6001600160a01b03821660009081526020819052604081206003015461132b90620f424090600160801b90046001600160801b03166133179190613b9d565b6001600160a01b0385166000908152602081905260409020600301546001600160801b03166132c7906001613b9d565b6040516001600160a01b03808516602483015283166044820152606481018290526129729085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ffc565b6000838302608081901c6001600160801b03841611613418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826001600160801b0316818161343057613430613bc8565b0495945050505050565b600061348f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661353c9092919063ffffffff16565b90508051600014806134b05750808060200190518101906134b09190613ae1565b61307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161340f565b6060611f90848460008585600080866001600160a01b031685876040516135639190613bf7565b60006040518083038185875af1925050503d80600081146135a0576040519150601f19603f3d011682016040523d82523d6000602084013e6135a5565b606091505b5091509150611f1c878383876060831561363a578251600003613633576001600160a01b0385163b613633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161340f565b5081611f90565b611f90838381511561364f5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340f91906138d4565b80356001600160a01b0381168114611c4357600080fd5b80356001600160801b0381168114611c4357600080fd5b600080604083850312156136c457600080fd5b6136cd83613683565b91506136db6020840161369a565b90509250929050565b6000806000806000608086880312156136fc57600080fd5b61370586613683565b945061371360208701613683565b935060408601359250606086013567ffffffffffffffff8082111561373757600080fd5b818801915088601f83011261374b57600080fd5b81358181111561375a57600080fd5b89602082850101111561376c57600080fd5b9699959850939650602001949392505050565b60008060006060848603121561379457600080fd5b61379d84613683565b92506137ab6020850161369a565b91506137b960408501613683565b90509250925092565b6000806000604084860312156137d757600080fd5b6137e084613683565b9250602084013567ffffffffffffffff808211156137fd57600080fd5b818601915086601f83011261381157600080fd5b81358181111561382057600080fd5b8760208260051b850101111561383557600080fd5b6020830194508093505050509250925092565b6000806040838503121561385b57600080fd5b61386483613683565b946020939093013593505050565b60006020828403121561388457600080fd5b61132b82613683565b60006020828403121561389f57600080fd5b61132b8261369a565b60005b838110156138c35781810151838201526020016138ab565b838111156129725750506000910152565b60208152600082518060208401526138f38160408501602087016138a8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000806040838503121561393857600080fd5b61394183613683565b91506136db60208401613683565b60008060006060848603121561396457600080fd5b61396d84613683565b925061397b60208501613683565b9150604084013590509250925092565b600080600080608085870312156139a157600080fd5b6139aa85613683565b93506139b86020860161369a565b92506139c66040860161369a565b91506139d46060860161369a565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a4057600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613a71604083018587613a0e565b90506001600160801b0383166020830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215613acb57600080fd5b815160068110613ada57600080fd5b9392505050565b600060208284031215613af357600080fd5b81518015158114613ada57600080fd5b602081526000611f90602083018486613a0e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001600160801b0383811690831681811015613b6657613b66613b17565b039392505050565b60006001600160801b0380831681851681830481118215151615613b9457613b94613b17565b02949350505050565b60006001600160801b03808316818516808303821115613bbf57613bbf613b17565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008251613c098184602087016138a8565b919091019291505056fea164736f6c634300080f000a", + "codeHash": "0xa4b37949aa817c72c9ea8f35aaa82261866ca207b23f59257fc00dfe27de1d8d", + "code": "0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80638abf0af011610191578063b172597e116100e3578063c2d9b68411610097578063d706200511610071578063d706200514610826578063de7d4d6a1461084d578063fdbb3fd21461085757600080fd5b8063c2d9b684146107d4578063c42996d614610800578063c7ab2c071461081357600080fd5b8063b744d2f9116100c8578063b744d2f914610773578063bcacc70a14610786578063c0a63a79146107ad57600080fd5b8063b172597e1461074d578063b55cd78e1461076057600080fd5b8063a51c9ace11610145578063a85120e41161011f578063a85120e414610700578063ad42945114610713578063ae9483e01461072657600080fd5b8063a51c9ace146106d2578063a63b8d14146106da578063a8387172146106ed57600080fd5b8063913f1a9f11610176578063913f1a9f14610655578063960a08931461068a578063981cee531461069d57600080fd5b80638abf0af01461062f5780638c1516c71461064257600080fd5b806354469aea1161024a5780636b9ffeac116101fe578063833a333b116101d8578063833a333b146105c5578063842d0d3b146105d857806386d18a941461061c57600080fd5b80636b9ffeac1461053d5780637db41f971461057257806382dae3aa146105bd57600080fd5b80635636aabd1161022f5780635636aabd146104c757806356576b5b146104da5780635959b7651461050157600080fd5b806354469aea1461046b57806354fd4d501461047e57600080fd5b8063209a9694116102ac5780633608641711610286578063360864171461040657806340ce01f114610445578063536afae41461045857600080fd5b8063209a9694146103b5578063270a1644146103e057806331d8e007146103f357600080fd5b806319412a20116102dd57806319412a201461037c5780631e5d81781461038f5780631f86f4f1146103a257600080fd5b806308fab167146102f9578063150b7a021461030e575b600080fd5b61030c61030736600461382c565b61087e565b005b61034661031c366004613863565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61030c61038a3660046138fe565b610b8d565b61030c61039d366004613943565b610cc7565b61030c6103b03660046139c9565b61105e565b6103c86103c336600461382c565b611407565b6040516001600160801b039091168152602001610373565b61030c6103ee3660046139f3565b61141c565b61030c610401366004613943565b6114f7565b61042d7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b6040516001600160a01b039091168152602001610373565b61030c6104533660046139c9565b611989565b6103c86104663660046139f3565b611c42565b61030c610479366004613a0e565b611d30565b6104ba6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103739190613a5e565b6103c86104d53660046139f3565b611f3d565b61042d7f000000000000000000000000ff000000000000000000000000000000000000ff81565b6103c861050f3660046139f3565b6001600160a01b0316600090815260208190526040902060020154600160801b90046001600160801b031690565b6103c861054b3660046139f3565b6001600160a01b03166000908152602081905260409020600301546001600160801b031690565b6103c8610580366004613aaf565b6001600160a01b0391821660009081526020818152604080832093909416825260069092019091522054600160801b90046001600160801b031690565b6103c8601481565b6103c86105d3366004613aaf565b612028565b6103c86105e6366004613aaf565b6001600160a01b03918216600090815260208181526040808320939094168252600590920190915220546001600160801b031690565b6103c861062a366004613ae2565b6120a1565b6103c861063d3660046139f3565b612112565b61030c6106503660046139f3565b61214b565b6103c86106633660046139f3565b6001600160a01b03166000908152602081905260409020600401546001600160801b031690565b6103c861069836600461382c565b6122f2565b6103c86106ab3660046139f3565b6001600160a01b03166000908152602081905260409020600201546001600160801b031690565b6103c8606481565b6103c86106e83660046139f3565b6122fe565b61030c6106fb3660046139f3565b61234e565b6103c861070e36600461382c565b61246e565b61030c610721366004613b1e565b612805565b61042d7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b181565b6103c861075b3660046139f3565b612af2565b6103c861076e366004613aaf565b612b2a565b61030c61078136600461382c565b612b8f565b6103c87f000000000000000000000000000000000000000000000000000000000000000a81565b61042d7f00000000000000000000000023618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f81565b61042d6107e23660046139f3565b6001600160a01b039081166000908152602081905260409020541690565b6103c861080e36600461382c565b612e87565b6103c8610821366004613aaf565b613040565b61042d7f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802981565b6103c8620f424081565b6103c87f000000000000000000000000000000000000000000000000000000000000007881565b6001600160a01b0382811660009081526020819052604090205483911633146108d3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160801b0316600003610916576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610920846122fe565b6001600160801b03161115610961576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f970531c10000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015242917f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b19091169063970531c190602401602060405180830381865afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190613b78565b6001600160801b03161115610a49576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a53838361307e565b6040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b158015610ad657600080fd5b505af1158015610aea573d6000803e3d6000fd5b5050506001600160a01b03808516600090815260208190526040902054610b4092507f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029821691166001600160801b038516613131565b6040516001600160801b03831681526001600160a01b038416907fab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8906020015b60405180910390a2505050565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614610bef576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610c2f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03838116600090815260208190526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001692841692909217909155610c8390849084906131fd565b6040516001600160801b03831681526001600160a01b038416907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a4790602001610b80565b6000819003610d02576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526006019091528120905b82811015610e5a57816001016000858584818110610d4857610d48613b95565b602090810292909201358352508101919091526040016000908120546001600160801b03169003610da5576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610dc98633878786818110610dbd57610dbd613b95565b905060200201356120a1565b6001600160801b03161115610e0a576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001016000858584818110610e2257610e22613b95565b6020908102929092013583525081019190915260400160002080546fffffffffffffffffffffffffffffffff19169055600101610d28565b506000610e678533613333565b6001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b900382161790915533855260069091019092529091208054808316600160801b91829004841688900390931602919091179055905060005b83811015610fbb577f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b03166342842e0e3033888886818110610f2957610f29613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610f9857600080fd5b505af1158015610fac573d6000803e3d6000fd5b50505050806001019050610ede565b506001600160801b03811615611008576110086001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b336001600160a01b0316856001600160a01b03167f6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb94386868560405161104f93929190613c13565b60405180910390a35050505050565b8160026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa1580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190613c6f565b600581111561111557611115613c40565b10806111bf57506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190613c90565b156111f6576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112028433613333565b90506001600160801b0381161561129a576112506001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038616907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b0316906342842e0e90606401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b505050506001600160a01b038416600090815260208181526040808320338452600681018352818420600490910180546001600160801b03808216600190810182166fffffffffffffffffffffffffffffffff19938416179093558354600160801b808204831685018316029082161784558987529190920190935292208054429092169190921617905560405183815233906001600160a01b038616907f7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d906020015b60405180910390a350505050565b600061141383836133d2565b90505b92915050565b60006114288233613333565b9050806001600160801b031660000361146d576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114aa6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038416907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35050565b8260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190613c6f565b60058111156115ae576115ae613c40565b108061165857506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190613c90565b1561168f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290036116ca576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116d68533613333565b90506001600160801b0381161561176e576117246001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038716907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6001600160a01b0385166000908152602081815260408083203384526006019091528120905b848110156118c3577f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b03166342842e0e33308989868181106117df576117df613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b505050504282600101600088888581811061187f5761187f613b95565b90506020020135815260200190815260200160002060006101000a8154816001600160801b0302191690836001600160801b03160217905550806001019050611794565b506001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b0182161790915533855260069091019092529091208054808316600160801b918290048416880190931602919091179055336001600160a01b0316866001600160a01b03167fafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f18787604051611979929190613cb2565b60405180910390a3505050505050565b6001600160a01b03821660009081526020818152604080832033845260060182528083208484526001810190925282205490916001600160801b0390911690036119ff576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42611a0b8433856120a1565b6001600160801b03161115611a4c576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a588433613333565b9050611b0c8433856001600160a01b03928316600090815260208181526040808320949095168252600684018152848220600490940180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160801b03808316820181166fffffffffffffffffffffffffffffffff19938416179093558654600160801b808204851690920184169091029216919091178555928252600190930190925291902080549091169055565b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018490527f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b0316906342842e0e90606401600060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050506001600160801b03811615611bf757611bf76001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b604080518481526001600160801b038316602082015233916001600160a01b038716917fd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab4191016113f9565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614611ca6576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180546fffffffffffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000a600160801b8084046001600160801b0390811683018116909102928316938116928116929092178101909116919091179091555b919050565b806001600160801b0316600003611d73576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040517f30ccebb50000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b16001600160a01b0316906330ccebb590602401602060405180830381865afa158015611df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e169190613c6f565b6005811115611e2757611e27613c40565b03611e5e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e6a338260016131fd565b6040516001600160801b038216815233907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a479060200160405180910390a26040517fe428c2f40000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b16001600160a01b03169063e428c2f490602401600060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b5050505050565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614611fa1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b808404821683900382160280821693821693909317829003166fffffffffffffffffffffffffffffffff199290921691909117909155919050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b909204821691859161207a911683613cf5565b83546120969190600160801b90046001600160801b0316613d1d565b979650505050505050565b6001600160a01b0380841660009081526020818152604080832093861683526006909301815282822084835260010190529081205461210a907f0000000000000000000000000000000000000000000000000000000000000078906001600160801b0316613d4c565b949350505050565b6001600160a01b03811660009081526020819052604081206002810154600390910154611416916001600160801b039081169116613d4c565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146121ad576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260208190526040812060020180549091906121e9906001600160801b03600160801b820481169116613cf5565b90507f000000000000000000000000000000000000000000000000000000000000000a6001600160801b0316816001600160801b03161015612257576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546001600160801b03600160801b80830482167f000000000000000000000000000000000000000000000000000000000000000a9081018316909102919092161783556001600160a01b038416907f7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e906122d28185613cf5565b604080516001600160801b03938416815292909116602083015201610b80565b60006114138383613452565b6001600160a01b038116600090815260208190526040812060010154611416907f0000000000000000000000000000000000000000000000000000000000000078906001600160801b0316613d4c565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146123b0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040902060020180547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b8084048216839003821681029382168481178087559596957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9561244794939091048316921617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a25050565b60008260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125169190613c6f565b600581111561252757612527613c40565b10806125d157506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa1580156125ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d19190613c90565b15612608576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160801b031660000361264b576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126896001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291633306001600160801b0387166134c1565b60006126958585613452565b6001600160a01b038616600090815260208181526040808320600381018054600160801b6fffffffffffffffffffffffffffffffff1982166001600160801b039283168d0183169081178290048316890183168202179092553386526005909201909352922080548316840183164290931690910291909117905590506040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152600060248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b5050604080516001600160801b038089168252851660208201523393506001600160a01b03891692507f334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328910160405180910390a3949350505050565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614612867576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dc7f00000000000000000000000023618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f30836128978688613d4c565b6128a19190613d4c565b6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029169291906001600160801b03166134c1565b7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160a01b0316846001600160a01b03160361298d576129887f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e826129448587613d4c565b61294e9190613d4c565b6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291691906001600160801b0316613131565b612aec565b6001600160a01b03841660009081526020819052604090206003810180546001600160801b03808216870181166fffffffffffffffffffffffffffffffff19928316179092556002830180548084168601841692169190911781556004909201541615612a425760028101546001600160801b0390811690841681612a1457612a14613d77565b6002830180546001600160801b0380821694909304600160801b918290048416019092169091029190911790555b80547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b8084048216839003821681029382168481178087556001600160a01b038b16957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9594612ac794909204821692911617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a2505b50505050565b6001600160a01b038116600090815260208190526040812060020154611416906001600160801b03600160801b820481169116613cf5565b6001600160a01b0382811660009081526020818152604080832093851683526005909301905290812054611413907f000000000000000000000000000000000000000000000000000000000000007890600160801b90046001600160801b0316613d4c565b806001600160801b0316600003612bd2576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bde8383613452565b9050806001600160801b0316600003612c23576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526005019091529020546001600160801b039081169082161115612c8e576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42612c998433612b2a565b6001600160801b03161115612cda576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083206003810180546001600160801b03600160801b80830482168990038216028082169282169290921789900381166fffffffffffffffffffffffffffffffff1992831617909255338652600590920190935292208054808316859003909216919092161790556040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b158015612ddb57600080fd5b505af1158015612def573d6000803e3d6000fd5b50612e329250506001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029169050336001600160801b038516613131565b604080516001600160801b0380851682528316602082015233916001600160a01b038616917f6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9910160405180910390a3505050565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614612eeb576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038084166000818152602081905260409020600201917f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e169003612f9657612f8d6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029167f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160801b038616613131565b82915050611416565b6000612fae6001600160801b03851660146064613512565b905061300d6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029167f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160801b038416613131565b81546fffffffffffffffffffffffffffffffff198116919094036001600160801b03948516810190941617905550919050565b6001600160a01b03808316600090815260208181526040808320938516835260059093019052908120546114139084906001600160801b03166133d2565b6001600160a01b038216600090815260208190526040902060020180546130b7906001600160801b03600160801b820481169116613cf5565b6001600160801b0316826001600160801b03161115613102576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546fffffffffffffffffffffffffffffffff1981166001600160801b03918216939093031691909117905550565b6040516001600160a01b0383166024820152604481018290526131f89084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135b4565b505050565b6001600160a01b0380841660009081526020819052604090209061324e907f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291685306001600160801b0387166134c1565b6002810180546fffffffffffffffffffffffffffffffff198082166001600160801b039283168701831617909255600183018054909216429091161790558115612aec576040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152600060248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b15801561331557600080fd5b505af1158015613329573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b9092048216918591613385911683613cf5565b83546133a19190600160801b90046001600160801b0316613d1d565b83546fffffffffffffffffffffffffffffffff19166001600160801b03939093169290921790925595945050505050565b6001600160a01b038216600090815260208190526040812060030154611413906001600160801b0316613406906001613d4c565b6001600160a01b038516600090815260208190526040902060030154620f424090600160801b90046001600160801b03166134419190613d4c565b6001600160801b0385169190613512565b6001600160a01b03821660009081526020819052604081206003015461141390620f424090600160801b90046001600160801b03166134919190613d4c565b6001600160a01b0385166000908152602081905260409020600301546001600160801b0316613441906001613d4c565b6040516001600160a01b0380851660248301528316604482015260648101829052612aec9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613176565b6000838302608081901c6001600160801b03841611613592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826001600160801b031681816135aa576135aa613d77565b0495945050505050565b6000613609826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136b69092919063ffffffff16565b905080516000148061362a57508080602001905181019061362a9190613c90565b6131f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401613589565b606061210a848460008585600080866001600160a01b031685876040516136dd9190613da6565b60006040518083038185875af1925050503d806000811461371a576040519150601f19603f3d011682016040523d82523d6000602084013e61371f565b606091505b509150915061209687838387606083156137b45782516000036137ad576001600160a01b0385163b6137ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401613589565b508161210a565b61210a83838151156137c95781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135899190613a5e565b80356001600160a01b0381168114611d2b57600080fd5b6001600160801b038116811461382957600080fd5b50565b6000806040838503121561383f57600080fd5b613848836137fd565b9150602083013561385881613814565b809150509250929050565b60008060008060006080868803121561387b57600080fd5b613884866137fd565b9450613892602087016137fd565b935060408601359250606086013567ffffffffffffffff808211156138b657600080fd5b818801915088601f8301126138ca57600080fd5b8135818111156138d957600080fd5b8960208285010111156138eb57600080fd5b9699959850939650602001949392505050565b60008060006060848603121561391357600080fd5b61391c846137fd565b9250602084013561392c81613814565b915061393a604085016137fd565b90509250925092565b60008060006040848603121561395857600080fd5b613961846137fd565b9250602084013567ffffffffffffffff8082111561397e57600080fd5b818601915086601f83011261399257600080fd5b8135818111156139a157600080fd5b8760208260051b85010111156139b657600080fd5b6020830194508093505050509250925092565b600080604083850312156139dc57600080fd5b6139e5836137fd565b946020939093013593505050565b600060208284031215613a0557600080fd5b611413826137fd565b600060208284031215613a2057600080fd5b8135613a2b81613814565b9392505050565b60005b83811015613a4d578181015183820152602001613a35565b83811115612aec5750506000910152565b6020815260008251806020840152613a7d816040850160208701613a32565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215613ac257600080fd5b613acb836137fd565b9150613ad9602084016137fd565b90509250929050565b600080600060608486031215613af757600080fd5b613b00846137fd565b9250613b0e602085016137fd565b9150604084013590509250925092565b60008060008060808587031215613b3457600080fd5b613b3d856137fd565b93506020850135613b4d81613814565b92506040850135613b5d81613814565b91506060850135613b6d81613814565b939692955090935050565b600060208284031215613b8a57600080fd5b8151613a2b81613814565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613bf657600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613c27604083018587613bc4565b90506001600160801b0383166020830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215613c8157600080fd5b815160068110613a2b57600080fd5b600060208284031215613ca257600080fd5b81518015158114613a2b57600080fd5b60208152600061210a602083018486613bc4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001600160801b0383811690831681811015613d1557613d15613cc6565b039392505050565b60006001600160801b0380831681851681830481118215151615613d4357613d43613cc6565b02949350505050565b60006001600160801b03808316818516808303821115613d6e57613d6e613cc6565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008251613db8818460208701613a32565b919091019291505056fea164736f6c634300080f000a", "key": "0xc130247092931d8c66bf63db8788c6b72a7a8fcc5f0c53a0424bd8390131805e" }, "0x8a791620dd6260079bf849dc5567adc3f2fdc318": { @@ -429,8 +429,8 @@ "balance": "0", "nonce": 1, "root": "0xa5123c1d51dd7986375df921b012df36448f6a7bb8122d860ba0700556b38e16", - "codeHash": "0x90ede0e3d759e3fc13b4a1dba94dd6e3af3b878c31c5d9c8680f354f6a63bd6f", - "code": "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c8063887c560f116100ee578063cfb4474d11610097578063e39a219c11610071578063e39a219c1461053f578063e58932b314610552578063e9371a2c14610572578063fc9d84df1461059257600080fd5b8063cfb4474d146104ca578063d2ee3075146104f1578063d5145ebc1461051857600080fd5b8063a41483e3116100c8578063a41483e314610491578063a6ade11f146104a4578063b8b1a27c146104b757600080fd5b8063887c560f146104305780638f3a6c88146104435780639ded39521461046a57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d057806362fc00db146103f75780636fe0e5591461040a57806380ab13131461041d57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614f17565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614f45565b6105a5565b005b6102aa61024c366004614f45565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b6040519081526020016101ed565b61021961035b366004614f17565b610628565b61033f7f000000000000000000000000000000000000000000000000000000000000006481565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614fd1565b6101d97f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed81565b61023c610405366004614fe4565b610703565b61023c610418366004615108565b610d75565b61023c61042b3660046151ea565b61101d565b61021961043e366004614f45565b611a89565b61033f7f000000000000000000000000000000000000000000000000000000000000006481565b6101d97f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b61023c61049f366004614f17565b611abd565b61023c6104b236600461529b565b611b2e565b61033f6104c5366004615305565b611eda565b61033f7f000000000000000000000000000000000000000000000000000000000000000481565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b61033f7fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f781565b61023c61054d366004614f17565b611f41565b610565610560366004614f45565b61248d565b6040516101ed9190615328565b610585610580366004614f45565b61259a565b6040516101ed9190615407565b61023c6105a0366004615448565b6125c5565b600360008381526002602090815260408083206001600160a01b038616845290915290206105d290613053565b60058111156105e3576105e36153d8565b1461061a576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106248282613139565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000647f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161069a91815260200190565b608060405180830381865afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906154ac565b604001516fffffffffffffffffffffffffffffffff166106fb9190615553565b101592915050565b336001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614610765576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610809919061556b565b15610840576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82610877576040517f646194d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091c91906154ac565b6020015114610957576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fe664672300000000000000000000000000000000000000000000000000000000815260048101879052602481018490526001600160a01b0385811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b158015610a1557600080fd5b505af1158015610a29573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061558d565b6001600160a01b031663ad36d6cc876040518263ffffffff1660e01b8152600401610adc91815260200190565b602060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d919061556b565b15610d29577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba4919061558d565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b038681166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610c0957600080fd5b505af1158015610c1d573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca3919061558d565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0386811660248301528781166044830152919091169063be995dc290606401600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050505b846001600160a01b0316867fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610d6591815260200190565b60405180910390a3505050505050565b600054610100900460ff1615808015610d955750600054600160ff909116105b80610daf5750303b158015610daf575060005460ff166001145b610e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e9e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610eac91906155d9565b15610ee3576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b8351811015610f5c57838181518110610f0357610f036155ed565b602002602001015160016000838152602001908152602001600020819055506001848281518110610f3657610f366155ed565b6020026020010151610f48919061561c565b610f529083615633565b9150600101610ee8565b507f00000000000000000000000000000000000000000000000000000000000000048114610fb6576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50801561062457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810188905287907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c1919061556b565b156110f8576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260026020908152604080832033845290915281209061111b82613053565b6001830154909150611138908b906001600160a01b03168361378d565b15611144575050611a7f565b6005816005811115611158576111586153d8565b1415801561117857506004816005811115611175576111756153d8565b14155b156111af576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c86111c3368b90038b018b615670565b613cac565b905060006111e16111c3368c90038c0160a08d01615670565b90506111f48b8584848e60a08101613d9b565b61121d8a60a0810161120a6101408301836156e0565b6112186101608f018f61571e565b613ea3565b61124f61122e6101c08c018c615752565b8c61018001358d6101a001358e60a001604001358f60a00160200135613f6f565b600061126c60208c01356112676101408e018e6156e0565b6140ac565b60008181526003602052604090205490915060ff16156112b8576040517fda2cdb7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc3181690634292dc3e90611325908d908d908d908d908890600401615809565b602060405180830381865afa158015611342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611366919061556b565b61139c576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908e907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018e90526000906001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063a25ae55790602401608060405180830381865afa158015611454573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147891906154ac565b905060006362fc00db60e01b8f338960000160099054906101000a90046001600160a01b03168560200151876040516024016114e29594939291909485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e169263080b91ee926115b49291908690600401615843565b600060405180830381600087803b1580156115ce57600080fd5b505af11580156115e2573d6000803e3d6000fd5b5050505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166a919061558d565b6001600160a01b031663ad36d6cc8e6040518263ffffffff1660e01b815260040161169791815260200190565b602060405180830381865afa1580156116b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d8919061556b565b156117f6577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f919061558d565b6001600160a01b031663be995dc28e338860000160099054906101000a90046001600160a01b03166040518463ffffffff1660e01b81526004016117bf939291909283526001600160a01b03918216602084015216604082015260600190565b600060405180830381600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b505050506118f4565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611878919061558d565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018f90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b505050505b60016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008e81526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549067ffffffffffffffff02191690556000820160096101000a8154906001600160a01b0302191690556001820160006101000a8154906001600160a01b0302191690556002820160006119ca9190614e99565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018f905260248201523360448201526001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b5050505050505050505b5050505050505050565b60008281526002602090815260408083206001600160a01b03851684529091528120611ab490614167565b90505b92915050565b600081815260026020908152604080832033845290915290206001810154611af89083906001600160a01b0316611af384613053565b61378d565b610624576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015611bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd2919061556b565b15611c09576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008681526002602090815260408083206001600160a01b0389168452909152812090611c3582613053565b6001830154909150611c529089906001600160a01b03168361378d565b15611c5e575050611ed2565b60006001826005811115611c7457611c746153d8565b03611c8d575060018201546001600160a01b0316611cc0565b6002826005811115611ca157611ca16153d8565b03611cc057508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611d02576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611d159060ff16600161587d565b9050611da081856002018a81548110611d3057611d306155ed565b9060005260206000200154866002018b6001611d4c9190615553565b81548110611d5c57611d5c6155ed565b90600052602060002001548a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b6000611dab8561426d565b90506000611db9828b615633565b8660040154611dc89190615553565b9050611e0b868a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925087915061429a9050565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8416178655611e3f866142c4565b6040805160ff851681524260208201526001600160a01b038d16918e917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e9086614167565b611ecb576040516001600160a01b038c16908d907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b5050505050505b505050505050565b6000600160ff83161015611f1a576040517f8c29db9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016000611f2882856158a2565b60ff168152602001908152602001600020549050919050565b336001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614611fa3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810182905281907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015612023573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612047919061556b565b1561207e576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156120ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212391906154ac565b6020810151909150612161576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101849052600060248201526001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b15801561220b57600080fd5b505af115801561221f573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a5919061558d565b6001600160a01b031663ad36d6cc846040518263ffffffff1660e01b81526004016122d291815260200190565b602060405180830381865afa1580156122ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612313919061556b565b15612440577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239a919061558d565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81166024830152918216604482015291169063be995dc290606401600060405180830381600087803b15801561242757600080fd5b505af115801561243b573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316837fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161248091815260200190565b60405180910390a3505050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c081019190915260008381526002602081815260408084206001600160a01b03808816865290835293819020815160e081018352815460ff8116825267ffffffffffffffff6101008204168286015269010000000000000000009004861681840152600182015490951660608601529283018054825181850281018501909352808352608086019383018282801561257557602002820191906000526020600020905b815481526020019060010190808311612561575b5050505050815260200160038201548152602001600482015481525050905092915050565b60008281526002602090815260408083206001600160a01b03851684529091528120611ab490613053565b846000036125ff576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561265d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612681919061558d565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b81526004016126ae91815260200190565b602060405180830381865afa1580156126cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ef919061556b565b1561282f577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612752573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612776919061558d565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa1580156127d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f9919061556b565b61282f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106128b357600361286182613053565b6005811115612872576128726153d8565b146128a9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128b38633613139565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015612934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295891906154ac565b9050427f000000000000000000000000000000000000000000000000000000000000006482604001516fffffffffffffffffffffffffffffffff1661299d9190615553565b10156129d5576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612a10576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03163303612a53576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590612a625750844015155b15612aa15785854014612aa1576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae557612add60018b61561c565b6040518263ffffffff1660e01b8152600401612afb91815260200190565b608060405180830381865afa158015612b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3c91906154ac565b6020810151909150612baa57612ba5600186866000818110612b6057612b606155ed565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b612bf2565b612bf260018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061417b92505050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c74919061558d565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612ca191815260200190565b602060405180830381865afa158015612cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce2919061556b565b15612de2577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d69919061558d565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612dc557600080fd5b505af1158015612dd9573d6000803e3d6000fd5b50505050612ee0565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e64919061558d565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612ec757600080fd5b505af1158015612edb573d6000803e3d6000fd5b505050505b612f7f8386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612f5991507f0000000000000000000000000000000000000000000000000000000000000004906fffffffffffffffffffffffffffffffff1661561c565b7f000000000000000000000000000000000000000000000000000000000000000461429a565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612ff7836142c4565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff909116101561306d57506000919050565b81546000906130819060029060ff166158c5565b835460ff91909116159150610100900467ffffffffffffffff1642111561310d5780156130b15750600392915050565b82546130f6906130f1907f000000000000000000000000000000000000000000000000000000000000001e90610100900467ffffffffffffffff16615553565b421190565b156131045750600392915050565b50600492915050565b61311683614167565b6131235750600592915050565b8061312f576002613132565b60015b9392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905591906131b990830182614e99565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff0514260405161320791815260200190565b60405180910390a37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561326d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613291919061558d565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b81526004016132be91815260200190565b602060405180830381865afa1580156132db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ff919061556b565b156134a1577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613362573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613386919061558d565b6001600160a01b031663be995dc2837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b0ea09a8866040518263ffffffff1660e01b81526004016133e391815260200190565b602060405180830381865afa158015613400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613424919061558d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561348d57600080fd5b505af1158015611ed2573d6000803e3d6000fd5b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa15801561351f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613543919061556b565b156136bb577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ca919061558d565b6001600160a01b03166336b8346983837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b0ea09a8876040518263ffffffff1660e01b815260040161362891815260200190565b602060405180830381865afa158015613645573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613669919061558d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401613473565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373d919061558d565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d90604401613473565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015613810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383491906154ac565b602001511461384557506000613132565b336001600160a01b03841614613887576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082600581111561389b5761389b6153d8565b14806138b8575060038260058111156138b6576138b66153d8565b145b156138ef576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061396690830182614e99565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2f919061558d565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b8152600401613a5c91815260200190565b602060405180830381865afa158015613a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9d919061556b565b15613b9d577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b24919061558d565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613b8057600080fd5b505af1158015613b94573d6000803e3d6000fd5b50505050613ca2565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c1f919061558d565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613c8957600080fd5b505af1158015613c9d573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613d0e5781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ab7565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610e37565b919050565b83856002018781548110613db157613db16155ed565b906000526020600020015414613df3576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dfc85614167565b613e62578260028601613e10886001615553565b81548110613e2057613e206155ed565b906000526020600020015403613e62576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060600135826080013514611ed2576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613ee4576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613f0f57613f0a613efc84615965565b613f0584615abf565b614365565b613f29565b613f29613f1b84615965565b613f2484615abf565b614409565b905080856080013514613f68576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed6001600160a01b0316906312e64a729061402c907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615c60565b602060405180830381865afa158015614049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406d919061556b565b6140a3576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050565b600060607f00000000000000000000000000000000000000000000000000000000000000646140df610120850185615752565b9050101561414c576141497fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f7614119610120860186615752565b61414491507f000000000000000000000000000000000000000000000000000000000000006461561c565b61451a565b90505b61415f8461415985615965565b836145a6565b949350505050565b600060016141748361426d565b1192915050565b80518061418786611eda565b146141be576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000815181106141d1576141d16155ed565b60200260200101518414614211576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8161421d60018361561c565b8151811061422d5761422d6155ed565b60200260200101518303613f68576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000906001906142819060ff16611eda565b61428b919061561c565b8260030154611ab79190615d3b565b82516142af9060028601906020860190614eb7565b50600484019190915560039092019190915550565b6142cd81614167565b614338576142fb7f000000000000000000000000000000000000000000000000000000000000001e42615553565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6142fb7f000000000000000000000000000000000000000000000000000000000000001e42615553565b50565b6040805160118082526102408201909252600091829190816020015b60608152602001906001900390816143815790505090506143a3848483614618565b6143d28461010001516040516020016143be91815260200190565b6040516020818303038152906040526148cb565b816010815181106143e5576143e56155ed565b60200260200101819052506143f98161493a565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b6060815260200190600190039081614425579050509050614447848483614618565b6144628461010001516040516020016143be91815260200190565b81601081518110614475576144756155ed565b602002602001018190525061449884610140015167ffffffffffffffff1661497e565b816011815181106144ab576144ab6155ed565b60200260200101819052506144ce84610160015167ffffffffffffffff1661497e565b816012815181106144e1576144e16155ed565b60200260200101819052506145078461018001516040516020016143be91815260200190565b816013815181106143e5576143e56155ed565b606060008267ffffffffffffffff81111561453757614537615036565b604051908082528060200260200182016040528015614560578160200160208202803683370190505b50905060005b8381101561459e5784828281518110614581576145816155ed565b60209081029190910101528061459681615d4f565b915050614566565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016145f99c9b9a99989796959493929190615dba565b6040516020818303038152906040528051906020012090509392505050565b61463283602001516040516020016143be91815260200190565b81600081518110614645576146456155ed565b6020026020010181905250816000015181600181518110614668576146686155ed565b602002602001018190525081602001518160028151811061468b5761468b6155ed565b60200260200101819052506146b08360e001516040516020016143be91815260200190565b816003815181106146c3576146c36155ed565b60200260200101819052506146e88360c001516040516020016143be91815260200190565b816004815181106146fb576146fb6155ed565b602002602001018190525081604001518160058151811061471e5761471e6155ed565b6020026020010181905250816060015181600681518110614741576147416155ed565b6020026020010181905250816080015181600781518110614764576147646155ed565b6020026020010181905250614786836060015167ffffffffffffffff1661497e565b81600881518110614799576147996155ed565b60200260200101819052506147bb836080015167ffffffffffffffff1661497e565b816009815181106147ce576147ce6155ed565b60200260200101819052508160a0015181600a815181106147f1576147f16155ed565b6020026020010181905250614813836040015167ffffffffffffffff1661497e565b81600b81518110614826576148266155ed565b60200260200101819052508160c0015181600c81518110614849576148496155ed565b60200260200101819052508160e0015181600d8151811061486c5761486c6155ed565b602002602001018190525081610100015181600e81518110614890576148906155ed565b60200260200101819052506148a88360a0015161497e565b81600f815181106148bb576148bb6155ed565b6020026020010181905250505050565b606080825160011480156148f957506080836000815181106148ef576148ef6155ed565b016020015160f81c105b15614905575081611ab7565b61491183516080614991565b83604051602001614923929190615e73565b604051602081830303815290604052905092915050565b6060600061494783614b87565b9050614955815160c0614991565b81604051602001614967929190615e73565b604051602081830303815290604052915050919050565b6060611ab761498c83614cbf565b6148cb565b6060806038841015614a1057604080516001808252818301909252906020820181803683370190505090506149c6838561587d565b60f81b816000815181106149dc576149dc6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ab4565b600060015b614a1f8187615d3b565b15614a455781614a2e81615d4f565b9250614a3e905061010082615633565b9050614a15565b614a50826001615553565b67ffffffffffffffff811115614a6857614a68615036565b6040519080825280601f01601f191660200182016040528015614a92576020820181803683370190505b509250614a9f858361587d565b614aaa90603761587d565b60f81b83600081518110614ac057614ac06155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614b7e57610100614b08828461561c565b614b1490610100615fc2565b614b1e9088615d3b565b614b2891906155d9565b60f81b838281518110614b3d57614b3d6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614b7681615d4f565b915050614af4565b50509392505050565b60608151600003614ba657505060408051600081526020810190915290565b6000805b8351811015614bed57838181518110614bc557614bc56155ed565b60200260200101515182614bd99190615553565b915080614be581615d4f565b915050614baa565b60008267ffffffffffffffff811115614c0857614c08615036565b6040519080825280601f01601f191660200182016040528015614c32576020820181803683370190505b50600092509050602081015b8551831015614cb6576000868481518110614c5b57614c5b6155ed565b602002602001015190506000602082019050614c7983828451614e1e565b878581518110614c8b57614c8b6155ed565b60200260200101515183614c9f9190615553565b925050508280614cae90615d4f565b935050614c3e565b50949350505050565b6060600082604051602001614cd691815260200190565b604051602081830303815290604052905060005b6020811015614d4557818181518110614d0557614d056155ed565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614d455780614d3d81615d4f565b915050614cea565b6000614d5282602061561c565b67ffffffffffffffff811115614d6a57614d6a615036565b6040519080825280601f01601f191660200182016040528015614d94576020820181803683370190505b50905060005b8151811015614cb6578383614dae81615d4f565b945081518110614dc057614dc06155ed565b602001015160f81c60f81b828281518110614ddd57614ddd6155ed565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614e1681615d4f565b915050614d9a565b8282825b60208110614e5a5781518352614e39602084615553565b9250614e46602083615553565b9150614e5360208261561c565b9050614e22565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906143629190614f02565b828054828255906000526020600020908101928215614ef2579160200282015b82811115614ef2578251825591602001919060010190614ed7565b50614efe929150614f02565b5090565b5b80821115614efe5760008155600101614f03565b600060208284031215614f2957600080fd5b5035919050565b6001600160a01b038116811461436257600080fd5b60008060408385031215614f5857600080fd5b823591506020830135614f6a81614f30565b809150509250929050565b60005b83811015614f90578181015183820152602001614f78565b83811115614f9f576000848401525b50505050565b60008151808452614fbd816020860160208601614f75565b601f01601f19169290920160200192915050565b602081526000611ab46020830184614fa5565b600080600080600060a08688031215614ffc57600080fd5b85359450602086013561500e81614f30565b9350604086013561501e81614f30565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff8111828210171561508957615089615036565b60405290565b604051610120810167ffffffffffffffff8111828210171561508957615089615036565b604051601f8201601f1916810167ffffffffffffffff811182821017156150dc576150dc615036565b604052919050565b600067ffffffffffffffff8211156150fe576150fe615036565b5060051b60200190565b6000602080838503121561511b57600080fd5b823567ffffffffffffffff81111561513257600080fd5b8301601f8101851361514357600080fd5b8035615156615151826150e4565b6150b3565b81815260059190911b8201830190838101908783111561517557600080fd5b928401925b828410156151935783358252928401929084019061517a565b979650505050505050565b60008083601f8401126151b057600080fd5b50813567ffffffffffffffff8111156151c857600080fd5b6020830191508360208260051b85010111156151e357600080fd5b9250929050565b600080600080600080600060a0888a03121561520557600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561522b57600080fd5b908901906101e0828c03121561524057600080fd5b9095506060890135908082111561525657600080fd5b6152628b838c0161519e565b909650945060808a013591508082111561527b57600080fd5b506152888a828b0161519e565b989b979a50959850939692959293505050565b6000806000806000608086880312156152b357600080fd5b8535945060208601356152c581614f30565b935060408601359250606086013567ffffffffffffffff8111156152e857600080fd5b6152f48882890161519e565b969995985093965092949392505050565b60006020828403121561531757600080fd5b813560ff81168114611ab457600080fd5b60006020808352610100830160ff8551168285015267ffffffffffffffff8286015116604085015260408501516001600160a01b0380821660608701528060608801511660808701525050608085015160e060a0860152818151808452610120870191508483019350600092505b808310156153b65783518252928401926001929092019190840190615396565b5060a087015160c087015260c087015160e08701528094505050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615442577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060008060006080868803121561546057600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156152e857600080fd5b80516fffffffffffffffffffffffffffffffff81168114613d9657600080fd5b6000608082840312156154be57600080fd5b6040516080810181811067ffffffffffffffff821117156154e1576154e1615036565b60405282516154ef81614f30565b8152602083810151908201526155076040840161548c565b60408201526155186060840161548c565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561556657615566615524565b500190565b60006020828403121561557d57600080fd5b81518015158114611ab457600080fd5b60006020828403121561559f57600080fd5b8151611ab481614f30565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826155e8576155e86155aa565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008282101561562e5761562e615524565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561566b5761566b615524565b500290565b600060a0828403121561568257600080fd5b60405160a0810181811067ffffffffffffffff821117156156a5576156a5615036565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261571457600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261571457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261578757600080fd5b83018035915067ffffffffffffffff8211156157a257600080fd5b6020019150600581901b36038213156151e357600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156157ec57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60608152600061581d6060830187896157ba565b82810360208401526158308186886157ba565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006158746060830184614fa5565b95945050505050565b600060ff821660ff84168060ff0382111561589a5761589a615524565b019392505050565b600060ff821660ff8416808210156158bc576158bc615524565b90039392505050565b600060ff8316806158d8576158d86155aa565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613d9657600080fd5b600082601f83011261591057600080fd5b81356020615920615151836150e4565b82815260059290921b8401810191818101908684111561593f57600080fd5b8286015b8481101561595a5780358352918301918301615943565b509695505050505050565b60006101a0823603121561597857600080fd5b615980615065565b823581526020830135602082015261599a604084016158e7565b60408201526159ab606084016158e7565b60608201526159bc608084016158e7565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff811115615a0757600080fd5b615a13368287016158ff565b828401525050610140615a278185016158e7565b90820152610160615a398482016158e7565b9082015261018092830135928101929092525090565b600082601f830112615a6057600080fd5b813567ffffffffffffffff811115615a7a57615a7a615036565b615a8d6020601f19601f840116016150b3565b818152846020838601011115615aa257600080fd5b816020850160208301376000918101602001919091529392505050565b60006101208236031215615ad257600080fd5b615ada61508f565b823567ffffffffffffffff80821115615af257600080fd5b615afe36838701615a4f565b83526020850135915080821115615b1457600080fd5b615b2036838701615a4f565b60208401526040850135915080821115615b3957600080fd5b615b4536838701615a4f565b60408401526060850135915080821115615b5e57600080fd5b615b6a36838701615a4f565b60608401526080850135915080821115615b8357600080fd5b615b8f36838701615a4f565b608084015260a0850135915080821115615ba857600080fd5b615bb436838701615a4f565b60a084015260c0850135915080821115615bcd57600080fd5b615bd936838701615a4f565b60c084015260e0850135915080821115615bf257600080fd5b615bfe36838701615a4f565b60e084015261010091508185013581811115615c1957600080fd5b615c2536828801615a4f565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615c7a6080840188614fa5565b8381036040850152858152818101600587901b820183018860005b89811015615d2257601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615cd857600080fd5b8b01868101903567ffffffffffffffff811115615cf457600080fd5b803603821315615d0357600080fd5b615d0e858284615c35565b958801959450505090850190600101615c95565b5050809450505050508260608301529695505050505050565b600082615d4a57615d4a6155aa565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615d8057615d80615524565b5060010190565b60008151602080840160005b83811015615daf57815187529582019590820190600101615d93565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615e61615e5b60da840186615d87565b84615d87565b9e9d5050505050505050505050505050565b60008351615e85818460208801614f75565b835190830190615e99818360208801614f75565b01949350505050565b600181815b80851115615efb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615ee157615ee1615524565b80851615615eee57918102915b93841c9390800290615ea7565b509250929050565b600082615f1257506001611ab7565b81615f1f57506000611ab7565b8160018114615f355760028114615f3f57615f5b565b6001915050611ab7565b60ff841115615f5057615f50615524565b50506001821b611ab7565b5060208310610133831016604e8410600b8410161715615f7e575081810a611ab7565b615f888383615ea2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615fba57615fba615524565b029392505050565b6000611ab48383615f0356fea164736f6c634300080f000a", + "codeHash": "0xde8699da477e68252347489b18e5598e14dd1c762a1de948b20ebce547e1b2ef", + "code": "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c806380ab1313116100ee578063b3e7766d11610097578063d5145ebc11610071578063d5145ebc146105d7578063e39a219c146105fe578063e9371a2c14610611578063fc9d84df1461063157600080fd5b8063b3e7766d14610569578063cfb4474d14610589578063d2ee3075146105b057600080fd5b80639ded3952116100c85780639ded39521461051c578063a41483e314610543578063a6ade11f1461055657600080fd5b806380ab1313146104c25780638f3a6c88146104d55780638f86c803146104fc57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d05780635a6b011f146103f757806362fc00db1461049c5780636fe0e559146104af57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614e01565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614e2f565b610644565b005b6102aa61024c366004614e2f565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b6040519081526020016101ed565b61021961035b366004614e01565b6106c7565b61033f7f000000000000000000000000000000000000000000000000000000000000006481565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614eb7565b6101d97f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed81565b61045a610405366004614e01565b6004602052600090815260409020805460018201546002909201546001600160a01b0390911691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b604080516001600160a01b03909516855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080016101ed565b61023c6104aa366004614eca565b6107a2565b61023c6104bd366004614fee565b610e96565b61023c6104d03660046150d0565b61113e565b61033f7f000000000000000000000000000000000000000000000000000000000000006481565b61033f61050a366004614e01565b60016020526000908152604090205481565b6101d97f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b61023c610551366004614e01565b611b3e565b61023c610564366004615181565b611baf565b61057c610577366004614e2f565b611e82565b6040516101ed91906151eb565b61033f7f000000000000000000000000000000000000000000000000000000000000000481565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b61033f7fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f781565b61023c61060c366004614e01565b611efa565b61062461061f366004614e2f565b612319565b6040516101ed919061525e565b61023c61063f36600461529f565b61234b565b600360008381526002602090815260408083206001600160a01b0386168452909152902061067190612dd9565b60058111156106825761068261522f565b146106b9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282612eb7565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000647f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161073991815260200190565b608060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190615303565b604001516fffffffffffffffffffffffffffffffff1661079a91906153aa565b101592915050565b6107aa613513565b6107b385613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190615303565b6020015114610893576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090206001015482146108dd576040517f90e78fa500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906153c2565b6001600160a01b0316846001600160a01b03161415806109b957506000858152600460205260409020546001600160a01b03848116911614155b156109f0576040517f8036a47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526003602052604090205460ff16610a38576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905587835260049182905280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002019290925590517fe6646723000000000000000000000000000000000000000000000000000000008152908101869052602481018390526001600160a01b0384811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd191906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b8152600401610bfe91815260200190565b602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f91906153df565b15610e4b577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906153c2565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038581166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc591906153c2565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0385811660248301528681166044830152919091169063be995dc290606401600060405180830381600087803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b505050505b836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610e8791815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610eb65750600054600160ff909116105b80610ed05750303b158015610ed0575060005460ff166001145b610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fbf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610fcd9190615430565b15611004576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b835181101561107d5783818151811061102457611024615444565b60200260200101516001600083815260200190815260200160002081905550600184828151811061105757611057615444565b60200260200101516110699190615473565b611073908361548a565b9150600101611009565b507f000000000000000000000000000000000000000000000000000000000000000481146110d7576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5080156106c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61114787613577565b600087815260026020908152604080832033845290915281209061116a82612dd9565b6001830154909150611187908a906001600160a01b031683613653565b15611193575050611b35565b60058160058111156111a7576111a761522f565b141580156111c7575060048160058111156111c4576111c461522f565b14155b156111fe576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611239888361121a611215368c90038c018c6154c7565b613b72565b61122f611215368d90038d0160a08e016154c7565b8b60a08101613c61565b6112628760a0810161124f610140830183615537565b61125d6101608c018c615575565b613d69565b61128e6112736101c08901896155a9565b6101808a01356101a08b013560e08c013560c08d0135613e2e565b60006112ab60208901356112a66101408b018b615537565b613f62565b60008181526003602052604090205490915060ff16156112f7576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc3181690634292dc3e90611364908a908a908a908a908890600401615660565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a591906153df565b6113db576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908b907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018b90526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190615303565b84546020820151604051602481018f905233604482015269010000000000000000009092046001600160a01b03166064830152608482015260a481018490529091506000907f62fc00db000000000000000000000000000000000000000000000000000000009060c40160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e169263080b91ee926115f3929190869060040161569a565b600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50505060008d815260046020818152604092839020865181546001600160a01b039182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255828801516001830155848801516060909801516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000298169790971760029091015582517fb98debbf00000000000000000000000000000000000000000000000000000000815292517f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c99096169563b98debbf9550838301945090929091908290030181865afa158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906153c2565b6001600160a01b031663ad36d6cc8b6040518263ffffffff1660e01b815260040161177991815260200190565b602060405180830381865afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba91906153df565b156118d6577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906153c2565b83546040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018d90523360248201526001600160a01b0369010000000000000000009092048216604482015291169063be995dc290606401600060405180830381600087803b1580156118b957600080fd5b505af11580156118cd573d6000803e3d6000fd5b505050506119d4565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195891906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018c90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156119bb57600080fd5b505af11580156119cf573d6000803e3d6000fd5b505050505b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558d8452600280845282852033865290935290832080547fffffff000000000000000000000000000000000000000000000000000000000016815590810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190611a8290830182614d83565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018c905260248201523360448201527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063e664672390606401600060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050505050505b50505050505050565b600081815260026020908152604080832033845290915290206001810154611b799083906001600160a01b0316611b7484612dd9565b613653565b6106c3576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885613577565b60008581526002602090815260408083206001600160a01b0388168452909152812090611be482612dd9565b6001830154909150611c019088906001600160a01b031683613653565b15611c0d575050611e7b565b60006001826005811115611c2357611c2361522f565b03611c3c575060018201546001600160a01b0316611c6f565b6002826005811115611c5057611c5061522f565b03611c6f57508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611cb1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611cc49060ff1660016156d4565b9050611d4f81856002018981548110611cdf57611cdf615444565b9060005260206000200154866002018a6001611cfb91906153aa565b81548110611d0b57611d0b615444565b906000526020600020015489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b6000611d5a8561412e565b9050611db585888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611da092508691508d905061548a565b8860040154611daf91906153aa565b84614173565b84547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316178555611de98561419d565b6040805160ff841681524260208201526001600160a01b038b16918c917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e3a8561423b565b611e75576040516001600160a01b038a16908b907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b50505050505b5050505050565b60008281526002602081815260408084206001600160a01b0386168552825292839020909101805483518184028101840190945280845260609392830182828015611eec57602002820191906000526020600020905b815481526020019060010190808311611ed8575b505050505090505b92915050565b611f02613513565b611f0b81613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190615303565b6020810151909150611fee576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101839052600060248201526001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b15801561209857600080fd5b505af11580156120ac573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213291906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161215f91815260200190565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906153df565b156122cd577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222791906153c2565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81166024830152918216604482015291169063be995dc290606401600060405180830381600087803b1580156122b457600080fd5b505af11580156122c8573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316827fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161230d91815260200190565b60405180910390a35050565b60008281526002602090815260408083206001600160a01b0385168452909152812061234490612dd9565b9392505050565b84600003612385576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240791906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b815260040161243491815260200190565b602060405180830381865afa158015612451573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247591906153df565b156125b5577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc91906153c2565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f91906153df565b6125b5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106126395760036125e782612dd9565b60058111156125f8576125f861522f565b1461262f576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126398633612eb7565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190615303565b9050427f000000000000000000000000000000000000000000000000000000000000006482604001516fffffffffffffffffffffffffffffffff1661272391906153aa565b101561275b576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612796576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b031633036127d9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015906127e85750844015155b156128275785854014612827576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae55761286360018b615473565b6040518263ffffffff1660e01b815260040161288191815260200190565b608060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c29190615303565b60208101519091506129305761292b6001868660008181106128e6576128e6615444565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b612978565b61297860018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa91906153c2565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612a2791815260200190565b602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6891906153df565b15612b68577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef91906153c2565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612b4b57600080fd5b505af1158015612b5f573d6000803e3d6000fd5b50505050612c66565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bea91906153c2565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612c4d57600080fd5b505af1158015612c61573d6000803e3d6000fd5b505050505b612d058386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612cdf91507f0000000000000000000000000000000000000000000000000000000000000004906fffffffffffffffffffffffffffffffff16615473565b7f0000000000000000000000000000000000000000000000000000000000000004614173565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612d7d8361419d565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612df357506000919050565b8154600090612e079060029060ff166156f9565b835460ff91909116159150610100900467ffffffffffffffff16421115612e8c578015612e375750600392915050565b8254612e73907f000000000000000000000000000000000000000000000000000000000000001e90610100900467ffffffffffffffff166153aa565b421115612e835750600392915050565b50600492915050565b612e958361423b565b612ea25750600592915050565b80612eae576002612344565b60019392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612f3790830182614d83565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612f8591815260200190565b60405180910390a37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f91906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161303c91815260200190565b602060405180830381865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d91906153df565b15613227577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310491906153c2565b6001600160a01b031663be995dc2837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b0ea09a8866040518263ffffffff1660e01b815260040161316191815260200190565b602060405180830381865afa15801561317e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a291906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050505050565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa1580156132a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c991906153df565b15613441577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335091906153c2565b6001600160a01b03166336b8346983837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b0ea09a8876040518263ffffffff1660e01b81526004016133ae91815260200190565b602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef91906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b0391821660248401521660448201526064016131f1565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c391906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d906044016131f1565b336001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614613575576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa1580156135f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361991906153df565b15613650576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156136d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fa9190615303565b602001511461370b57506000612344565b336001600160a01b0384161461374d576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260058111156137615761376161522f565b148061377e5750600382600581111561377c5761377c61522f565b145b156137b5576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061382c90830182614d83565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f591906153c2565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b815260040161392291815260200190565b602060405180830381865afa15801561393f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396391906153df565b15613a63577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea91906153c2565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613a4657600080fd5b505af1158015613a5a573d6000803e3d6000fd5b50505050613b68565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae591906153c2565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613bd45781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ef4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610f58565b919050565b83856002018781548110613c7757613c77615444565b906000526020600020015414613cb9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cc28561423b565b613d28578260028601613cd68860016153aa565b81548110613ce657613ce6615444565b906000526020600020015403613d28576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060013582608001351461321f576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613daa576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613dd557613dd0613dc284615799565b613dcb846158f3565b61424f565b613def565b613def613de184615799565b613dea846158f3565b6142f3565b905080856080013514611e7b576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed6001600160a01b0316906312e64a7290613eeb907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615a94565b602060405180830381865afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c91906153df565b611b35576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060607f0000000000000000000000000000000000000000000000000000000000000064613f956101208501856155a9565b9050101561400257613fff7fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f7613fcf6101208601866155a9565b613ffa91507f0000000000000000000000000000000000000000000000000000000000000064615473565b614404565b90505b6140158461400f85615799565b83614490565b949350505050565b80516001600061402d8288615b6f565b60ff1681526020019081526020016000205414614076576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008151811061408957614089615444565b602002602001015183146140c9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600182516140d89190615473565b815181106140e8576140e8615444565b60200260200101518203614128576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b80546000906001908190839061414890839060ff16615b6f565b60ff168152602001908152602001600020546141649190615473565b8260030154611ef49190615b92565b82516141889060028601906020860190614da1565b50600484019190915560039092019190915550565b6141a68161423b565b614211576141d47f000000000000000000000000000000000000000000000000000000000000001e426153aa565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6141d47f000000000000000000000000000000000000000000000000000000000000001e426153aa565b600060016142488361412e565b1192915050565b6040805160118082526102408201909252600091829190816020015b606081526020019060019003908161426b57905050905061428d848483614502565b6142bc8461010001516040516020016142a891815260200190565b6040516020818303038152906040526147b5565b816010815181106142cf576142cf615444565b60200260200101819052506142e381614824565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b606081526020019060019003908161430f579050509050614331848483614502565b61434c8461010001516040516020016142a891815260200190565b8160108151811061435f5761435f615444565b602002602001018190525061438284610140015167ffffffffffffffff16614868565b8160118151811061439557614395615444565b60200260200101819052506143b884610160015167ffffffffffffffff16614868565b816012815181106143cb576143cb615444565b60200260200101819052506143f18461018001516040516020016142a891815260200190565b816013815181106142cf576142cf615444565b606060008267ffffffffffffffff81111561442157614421614f1c565b60405190808252806020026020018201604052801561444a578160200160208202803683370190505b50905060005b83811015614488578482828151811061446b5761446b615444565b60209081029190910101528061448081615ba6565b915050614450565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016144e39c9b9a99989796959493929190615c11565b6040516020818303038152906040528051906020012090509392505050565b61451c83602001516040516020016142a891815260200190565b8160008151811061452f5761452f615444565b602002602001018190525081600001518160018151811061455257614552615444565b602002602001018190525081602001518160028151811061457557614575615444565b602002602001018190525061459a8360e001516040516020016142a891815260200190565b816003815181106145ad576145ad615444565b60200260200101819052506145d28360c001516040516020016142a891815260200190565b816004815181106145e5576145e5615444565b602002602001018190525081604001518160058151811061460857614608615444565b602002602001018190525081606001518160068151811061462b5761462b615444565b602002602001018190525081608001518160078151811061464e5761464e615444565b6020026020010181905250614670836060015167ffffffffffffffff16614868565b8160088151811061468357614683615444565b60200260200101819052506146a5836080015167ffffffffffffffff16614868565b816009815181106146b8576146b8615444565b60200260200101819052508160a0015181600a815181106146db576146db615444565b60200260200101819052506146fd836040015167ffffffffffffffff16614868565b81600b8151811061471057614710615444565b60200260200101819052508160c0015181600c8151811061473357614733615444565b60200260200101819052508160e0015181600d8151811061475657614756615444565b602002602001018190525081610100015181600e8151811061477a5761477a615444565b60200260200101819052506147928360a00151614868565b81600f815181106147a5576147a5615444565b6020026020010181905250505050565b606080825160011480156147e357506080836000815181106147d9576147d9615444565b016020015160f81c105b156147ef575081611ef4565b6147fb8351608061487b565b8360405160200161480d929190615cca565b604051602081830303815290604052905092915050565b6060600061483183614a71565b905061483f815160c061487b565b81604051602001614851929190615cca565b604051602081830303815290604052915050919050565b6060611ef461487683614ba9565b6147b5565b60608060388410156148fa57604080516001808252818301909252906020820181803683370190505090506148b083856156d4565b60f81b816000815181106148c6576148c6615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612344565b600060015b6149098187615b92565b1561492f578161491881615ba6565b925061492890506101008261548a565b90506148ff565b61493a8260016153aa565b67ffffffffffffffff81111561495257614952614f1c565b6040519080825280601f01601f19166020018201604052801561497c576020820181803683370190505b50925061498985836156d4565b6149949060376156d4565b60f81b836000815181106149aa576149aa615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614a68576101006149f28284615473565b6149fe90610100615e19565b614a089088615b92565b614a129190615430565b60f81b838281518110614a2757614a27615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614a6081615ba6565b9150506149de565b50509392505050565b60608151600003614a9057505060408051600081526020810190915290565b6000805b8351811015614ad757838181518110614aaf57614aaf615444565b60200260200101515182614ac391906153aa565b915080614acf81615ba6565b915050614a94565b60008267ffffffffffffffff811115614af257614af2614f1c565b6040519080825280601f01601f191660200182016040528015614b1c576020820181803683370190505b50600092509050602081015b8551831015614ba0576000868481518110614b4557614b45615444565b602002602001015190506000602082019050614b6383828451614d08565b878581518110614b7557614b75615444565b60200260200101515183614b8991906153aa565b925050508280614b9890615ba6565b935050614b28565b50949350505050565b6060600082604051602001614bc091815260200190565b604051602081830303815290604052905060005b6020811015614c2f57818181518110614bef57614bef615444565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614c2f5780614c2781615ba6565b915050614bd4565b6000614c3c826020615473565b67ffffffffffffffff811115614c5457614c54614f1c565b6040519080825280601f01601f191660200182016040528015614c7e576020820181803683370190505b50905060005b8151811015614ba0578383614c9881615ba6565b945081518110614caa57614caa615444565b602001015160f81c60f81b828281518110614cc757614cc7615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614d0081615ba6565b915050614c84565b8282825b60208110614d445781518352614d236020846153aa565b9250614d306020836153aa565b9150614d3d602082615473565b9050614d0c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906136509190614dec565b828054828255906000526020600020908101928215614ddc579160200282015b82811115614ddc578251825591602001919060010190614dc1565b50614de8929150614dec565b5090565b5b80821115614de85760008155600101614ded565b600060208284031215614e1357600080fd5b5035919050565b6001600160a01b038116811461365057600080fd5b60008060408385031215614e4257600080fd5b823591506020830135614e5481614e1a565b809150509250929050565b60005b83811015614e7a578181015183820152602001614e62565b838111156141285750506000910152565b60008151808452614ea3816020860160208601614e5f565b601f01601f19169290920160200192915050565b6020815260006123446020830184614e8b565b600080600080600060a08688031215614ee257600080fd5b853594506020860135614ef481614e1a565b93506040860135614f0481614e1a565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b60405290565b604051610120810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b604051601f8201601f1916810167ffffffffffffffff81118282101715614fc257614fc2614f1c565b604052919050565b600067ffffffffffffffff821115614fe457614fe4614f1c565b5060051b60200190565b6000602080838503121561500157600080fd5b823567ffffffffffffffff81111561501857600080fd5b8301601f8101851361502957600080fd5b803561503c61503782614fca565b614f99565b81815260059190911b8201830190838101908783111561505b57600080fd5b928401925b8284101561507957833582529284019290840190615060565b979650505050505050565b60008083601f84011261509657600080fd5b50813567ffffffffffffffff8111156150ae57600080fd5b6020830191508360208260051b85010111156150c957600080fd5b9250929050565b600080600080600080600060a0888a0312156150eb57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561511157600080fd5b908901906101e0828c03121561512657600080fd5b9095506060890135908082111561513c57600080fd5b6151488b838c01615084565b909650945060808a013591508082111561516157600080fd5b5061516e8a828b01615084565b989b979a50959850939692959293505050565b60008060008060006080868803121561519957600080fd5b8535945060208601356151ab81614e1a565b935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b6151da88828901615084565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561522357835183529284019291840191600101615207565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615299577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000806000608086880312156152b757600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b80516fffffffffffffffffffffffffffffffff81168114613c5c57600080fd5b60006080828403121561531557600080fd5b6040516080810181811067ffffffffffffffff8211171561533857615338614f1c565b604052825161534681614e1a565b81526020838101519082015261535e604084016152e3565b604082015261536f606084016152e3565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156153bd576153bd61537b565b500190565b6000602082840312156153d457600080fd5b815161234481614e1a565b6000602082840312156153f157600080fd5b8151801515811461234457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261543f5761543f615401565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000828210156154855761548561537b565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154c2576154c261537b565b500290565b600060a082840312156154d957600080fd5b60405160a0810181811067ffffffffffffffff821117156154fc576154fc614f1c565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261556b57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261556b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155de57600080fd5b83018035915067ffffffffffffffff8211156155f957600080fd5b6020019150600581901b36038213156150c957600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561564357600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615674606083018789615611565b8281036020840152615687818688615611565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006156cb6060830184614e8b565b95945050505050565b600060ff821660ff84168060ff038211156156f1576156f161537b565b019392505050565b600060ff83168061570c5761570c615401565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613c5c57600080fd5b600082601f83011261574457600080fd5b8135602061575461503783614fca565b82815260059290921b8401810191818101908684111561577357600080fd5b8286015b8481101561578e5780358352918301918301615777565b509695505050505050565b60006101a082360312156157ac57600080fd5b6157b4614f4b565b82358152602083013560208201526157ce6040840161571b565b60408201526157df6060840161571b565b60608201526157f06080840161571b565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561583b57600080fd5b61584736828701615733565b82840152505061014061585b81850161571b565b9082015261016061586d84820161571b565b9082015261018092830135928101929092525090565b600082601f83011261589457600080fd5b813567ffffffffffffffff8111156158ae576158ae614f1c565b6158c16020601f19601f84011601614f99565b8181528460208386010111156158d657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561590657600080fd5b61590e614f75565b823567ffffffffffffffff8082111561592657600080fd5b61593236838701615883565b8352602085013591508082111561594857600080fd5b61595436838701615883565b6020840152604085013591508082111561596d57600080fd5b61597936838701615883565b6040840152606085013591508082111561599257600080fd5b61599e36838701615883565b606084015260808501359150808211156159b757600080fd5b6159c336838701615883565b608084015260a08501359150808211156159dc57600080fd5b6159e836838701615883565b60a084015260c0850135915080821115615a0157600080fd5b615a0d36838701615883565b60c084015260e0850135915080821115615a2657600080fd5b615a3236838701615883565b60e084015261010091508185013581811115615a4d57600080fd5b615a5936828801615883565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615aae6080840188614e8b565b8381036040850152858152818101600587901b820183018860005b89811015615b5657601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615b0c57600080fd5b8b01868101903567ffffffffffffffff811115615b2857600080fd5b803603821315615b3757600080fd5b615b42858284615a69565b958801959450505090850190600101615ac9565b5050809450505050508260608301529695505050505050565b600060ff821660ff841680821015615b8957615b8961537b565b90039392505050565b600082615ba157615ba1615401565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bd757615bd761537b565b5060010190565b60008151602080840160005b83811015615c0657815187529582019590820190600101615bea565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615cb8615cb260da840186615bde565b84615bde565b9e9d5050505050505050505050505050565b60008351615cdc818460208801614e5f565b835190830190615cf0818360208801614e5f565b01949350505050565b600181815b80851115615d5257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d3857615d3861537b565b80851615615d4557918102915b93841c9390800290615cfe565b509250929050565b600082615d6957506001611ef4565b81615d7657506000611ef4565b8160018114615d8c5760028114615d9657615db2565b6001915050611ef4565b60ff841115615da757615da761537b565b50506001821b611ef4565b5060208310610133831016604e8410600b8410161715615dd5575081810a611ef4565b615ddf8383615cf9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615e1157615e1161537b565b029392505050565b60006123448383615d5a56fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", "0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b": "03", @@ -575,7 +575,7 @@ "key": "0x798c6047767c10f653ca157a7f66a592a1d6ca550cae352912be0b0745336afd" }, "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": { - "balance": "798681065175756037", + "balance": "798018456049133529", "nonce": 58, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", diff --git a/kroma-validator/challenger.go b/kroma-validator/challenger.go index c79473dd8..6a404ef75 100644 --- a/kroma-validator/challenger.go +++ b/kroma-validator/challenger.go @@ -734,7 +734,26 @@ func (c *Challenger) IsOutputFinalized(ctx context.Context, outputIndex *big.Int func (c *Challenger) GetChallenge(ctx context.Context, outputIndex *big.Int, challenger common.Address) (bindings.TypesChallenge, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - return c.colosseumContract.GetChallenge(optsutils.NewSimpleCallOpts(cCtx), outputIndex, challenger) + + challenge, err := c.colosseumContract.Challenges(optsutils.NewSimpleCallOpts(cCtx), outputIndex, challenger) + if err != nil { + return bindings.TypesChallenge{}, fmt.Errorf("failed to fetch challenge data: %w", err) + } + + segments, err := c.colosseumContract.GetSegments(optsutils.NewSimpleCallOpts(cCtx), outputIndex, challenger) + if err != nil { + return bindings.TypesChallenge{}, fmt.Errorf("failed to fetch challenge segments data: %w", err) + } + + return bindings.TypesChallenge{ + Turn: challenge.Turn, + TimeoutAt: challenge.TimeoutAt, + Asserter: challenge.Asserter, + Challenger: challenge.Challenger, + Segments: segments, + SegSize: challenge.SegSize, + SegStart: challenge.SegStart, + }, nil } func (c *Challenger) OutputAtBlockSafe(ctx context.Context, blockNumber uint64) (*eth.OutputResponse, error) { @@ -863,7 +882,8 @@ func (c *Challenger) GetChallengeStatus(ctx context.Context, outputIndex *big.In func (c *Challenger) BuildSegments(ctx context.Context, turn uint8, segStart, segSize uint64) (*chal.Segments, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - sections, err := c.colosseumContract.GetSegmentsLength(optsutils.NewSimpleCallOpts(cCtx), turn) + + sections, err := c.colosseumContract.SegmentsLengths(optsutils.NewSimpleCallOpts(cCtx), big.NewInt(int64(turn-1))) if err != nil { return nil, fmt.Errorf("unable to get segments length of turn %d: %w", turn, err) } diff --git a/op-e2e/actions/l2_runtime.go b/op-e2e/actions/l2_runtime.go index 1c678e0e2..389f1f918 100644 --- a/op-e2e/actions/l2_runtime.go +++ b/op-e2e/actions/l2_runtime.go @@ -278,7 +278,7 @@ func (rt *Runtime) setupChallenge(challenger *L2Validator, version uint8) { require.Equal(rt.t, types.ReceiptStatusSuccessful, rt.receipt.Status, "failed to create challenge") // check challenge created - challenge, err := rt.colosseumContract.GetChallenge(nil, rt.outputIndex, challenger.address) + challenge, err := rt.colosseumContract.Challenges(nil, rt.outputIndex, challenger.address) require.NoError(rt.t, err) require.NotNil(rt.t, challenge, "challenge not found") diff --git a/op-e2e/system_test.go b/op-e2e/system_test.go index ba2a8b13b..fae85b51d 100644 --- a/op-e2e/system_test.go +++ b/op-e2e/system_test.go @@ -1740,7 +1740,6 @@ func TestChallenge(t *testing.T) { return } } - } } diff --git a/packages/contracts/.gas-snapshot b/packages/contracts/.gas-snapshot index db27e0055..e18438dcc 100644 --- a/packages/contracts/.gas-snapshot +++ b/packages/contracts/.gas-snapshot @@ -1,117 +1,120 @@ AssetManagerTest:test_bondValidatorKro_callerNotValMgr_reverts() (gas: 15598) AssetManagerTest:test_bondValidatorKro_insufficientAsset_reverts() (gas: 20521) -AssetManagerTest:test_bondValidatorKro_succeeds() (gas: 275007) -AssetManagerTest:test_claimKghReward_succeeds() (gas: 446791) -AssetManagerTest:test_claimKghReward_zeroBoostedReward_reverts() (gas: 420673) +AssetManagerTest:test_bondValidatorKro_succeeds() (gas: 275419) +AssetManagerTest:test_claimKghReward_succeeds() (gas: 447203) +AssetManagerTest:test_claimKghReward_zeroBoostedReward_reverts() (gas: 421085) AssetManagerTest:test_constructor_succeeds() (gas: 31906) AssetManagerTest:test_decreaseBalanceWithChallenge_callerNotValMgr_reverts() (gas: 15673) -AssetManagerTest:test_decreaseBalanceWithChallenge_succeeds() (gas: 281878) -AssetManagerTest:test_delegateKghBatch_claimBoostedReward_succeeds() (gas: 583901) -AssetManagerTest:test_delegateKghBatch_succeeds() (gas: 1041000) -AssetManagerTest:test_delegateKghBatch_validatorInJail_reverts() (gas: 301125) -AssetManagerTest:test_delegateKghBatch_validatorStatusExited_reverts() (gas: 276886) +AssetManagerTest:test_decreaseBalanceWithChallenge_succeeds() (gas: 282290) +AssetManagerTest:test_delegateKghBatch_claimBoostedReward_succeeds() (gas: 584313) +AssetManagerTest:test_delegateKghBatch_succeeds() (gas: 1041412) +AssetManagerTest:test_delegateKghBatch_validatorInJail_reverts() (gas: 301537) +AssetManagerTest:test_delegateKghBatch_validatorStatusExited_reverts() (gas: 277316) AssetManagerTest:test_delegateKghBatch_validatorStatusNone_reverts() (gas: 26662) -AssetManagerTest:test_delegateKghBatch_zeroTokenIds_reverts() (gas: 275648) -AssetManagerTest:test_delegateKgh_claimBoostedReward_succeeds() (gas: 518437) -AssetManagerTest:test_delegateKgh_succeeds() (gas: 434302) -AssetManagerTest:test_delegateKgh_validatorInJail_reverts() (gas: 300737) -AssetManagerTest:test_delegateKgh_validatorStatusExited_reverts() (gas: 276604) +AssetManagerTest:test_delegateKghBatch_zeroTokenIds_reverts() (gas: 276060) +AssetManagerTest:test_delegateKgh_claimBoostedReward_succeeds() (gas: 518849) +AssetManagerTest:test_delegateKgh_succeeds() (gas: 434714) +AssetManagerTest:test_delegateKgh_validatorInJail_reverts() (gas: 301149) +AssetManagerTest:test_delegateKgh_validatorStatusExited_reverts() (gas: 277035) AssetManagerTest:test_delegateKgh_validatorStatusNone_reverts() (gas: 26252) -AssetManagerTest:test_delegate_succeeds() (gas: 368292) -AssetManagerTest:test_delegate_validatorInJail_reverts() (gas: 302973) -AssetManagerTest:test_delegate_validatorStatusExited_reverts() (gas: 278374) +AssetManagerTest:test_delegate_succeeds() (gas: 368704) +AssetManagerTest:test_delegate_validatorInJail_reverts() (gas: 303385) +AssetManagerTest:test_delegate_validatorStatusExited_reverts() (gas: 278804) AssetManagerTest:test_delegate_validatorStatusNone_reverts() (gas: 28510) -AssetManagerTest:test_delegate_zeroAsset_reverts() (gas: 277866) +AssetManagerTest:test_delegate_zeroAsset_reverts() (gas: 278278) AssetManagerTest:test_depositToRegister_callerNotValMgr_reverts() (gas: 20052) AssetManagerTest:test_depositToRegister_succeeds() (gas: 146718) AssetManagerTest:test_depositToRegister_zeroWithdrawAcc_reverts() (gas: 20461) -AssetManagerTest:test_deposit_activate_succeeds() (gas: 303369) -AssetManagerTest:test_deposit_inJailNotActivate_succeeds() (gas: 235724) -AssetManagerTest:test_deposit_notActivate_succeeds() (gas: 208008) -AssetManagerTest:test_deposit_succeeds() (gas: 313665) +AssetManagerTest:test_deposit_activate_succeeds() (gas: 303781) +AssetManagerTest:test_deposit_inJailNotActivate_succeeds() (gas: 235882) +AssetManagerTest:test_deposit_notActivate_succeeds() (gas: 208166) +AssetManagerTest:test_deposit_succeeds() (gas: 314077) AssetManagerTest:test_deposit_validatorStatusNone_reverts() (gas: 28672) AssetManagerTest:test_deposit_zeroAsset_reverts() (gas: 13482) AssetManagerTest:test_increaseBalanceWithChallenge_callerNotValMgr_reverts() (gas: 15809) AssetManagerTest:test_increaseBalanceWithChallenge_succeeds() (gas: 113595) AssetManagerTest:test_increaseBalanceWithChallenge_winnerIsSC_succeeds() (gas: 64186) AssetManagerTest:test_increaseBalanceWithReward_callerNotValMgr_reverts() (gas: 15992) -AssetManagerTest:test_increaseBalanceWithReward_succeeds() (gas: 488681) +AssetManagerTest:test_increaseBalanceWithReward_succeeds() (gas: 489093) AssetManagerTest:test_increaseBalanceWithReward_validatorIsSC_succeeds() (gas: 80038) AssetManagerTest:test_revertDecreaseBalanceWithChallenge_callerNotValMgr_reverts() (gas: 15692) AssetManagerTest:test_revertDecreaseBalanceWithChallenge_succeeds() (gas: 46440) AssetManagerTest:test_unbondValidatorKro_callerNotValMgr_reverts() (gas: 15661) -AssetManagerTest:test_unbondValidatorKro_succeeds() (gas: 283121) +AssetManagerTest:test_unbondValidatorKro_succeeds() (gas: 283533) AssetManagerTest:test_undelegateKghBatch_invalidTokenIds_reverts() (gas: 18710) -AssetManagerTest:test_undelegateKghBatch_noBoostedReward_succeeds() (gas: 1062760) -AssetManagerTest:test_undelegateKghBatch_notElapsedMinDelegationPeriod_reverts() (gas: 500059) -AssetManagerTest:test_undelegateKghBatch_succeeds() (gas: 1117873) +AssetManagerTest:test_undelegateKghBatch_noBoostedReward_succeeds() (gas: 1063090) +AssetManagerTest:test_undelegateKghBatch_notElapsedMinDelegationPeriod_reverts() (gas: 500471) +AssetManagerTest:test_undelegateKghBatch_succeeds() (gas: 1118203) AssetManagerTest:test_undelegateKghBatch_zeroTokenIds_reverts() (gas: 16039) AssetManagerTest:test_undelegateKgh_invalidTokenIds_reverts() (gas: 18005) -AssetManagerTest:test_undelegateKgh_noBoostedReward_succeeds() (gas: 408822) -AssetManagerTest:test_undelegateKgh_notElapsedMinDelegationPeriod_reverts() (gas: 420520) -AssetManagerTest:test_undelegateKgh_severalDelegators_succeeds() (gas: 594083) -AssetManagerTest:test_undelegateKgh_succeeds() (gas: 449762) +AssetManagerTest:test_undelegateKgh_noBoostedReward_succeeds() (gas: 409152) +AssetManagerTest:test_undelegateKgh_notElapsedMinDelegationPeriod_reverts() (gas: 420932) +AssetManagerTest:test_undelegateKgh_severalDelegators_succeeds() (gas: 594495) +AssetManagerTest:test_undelegateKgh_succeeds() (gas: 450174) AssetManagerTest:test_undelegate_largeAsset_reverts() (gas: 21036) -AssetManagerTest:test_undelegate_notElapsedMinDelegationPeriod_reverts() (gas: 356431) -AssetManagerTest:test_undelegate_removedFromValidatorTree_succeeds() (gas: 337429) -AssetManagerTest:test_undelegate_severalDelegators_succeeds() (gas: 466183) -AssetManagerTest:test_undelegate_succeeds() (gas: 394595) +AssetManagerTest:test_undelegate_notElapsedMinDelegationPeriod_reverts() (gas: 356843) +AssetManagerTest:test_undelegate_removedFromValidatorTree_succeeds() (gas: 337860) +AssetManagerTest:test_undelegate_severalDelegators_succeeds() (gas: 466595) +AssetManagerTest:test_undelegate_succeeds() (gas: 395007) AssetManagerTest:test_undelegate_zeroAsset_reverts() (gas: 15713) -AssetManagerTest:test_withdraw_insufficientValidatorKro_reverts() (gas: 275768) -AssetManagerTest:test_withdraw_notElapsedMinDelegationPeriod_reverts() (gas: 269323) -AssetManagerTest:test_withdraw_notExpiredJailPeriod_reverts() (gas: 286180) -AssetManagerTest:test_withdraw_notWithdrawAcc_reverts() (gas: 267198) -AssetManagerTest:test_withdraw_succeeds() (gas: 269652) -AssetManagerTest:test_withdraw_validatorKroBonded_reverts() (gas: 278454) -AssetManagerTest:test_withdraw_zeroAsset_reverts() (gas: 268781) -ColosseumTest:test_bisect_cancelChallenge_senderNotChallenger_reverts() (gas: 2932265) -ColosseumTest:test_bisect_cancelChallenge_succeeds() (gas: 2716631) -ColosseumTest:test_bisect_finalizedOutput_reverts() (gas: 464917) -ColosseumTest:test_bisect_ifNotYourTurn_reverts() (gas: 462144) -ColosseumTest:test_bisect_succeeds() (gas: 438304) -ColosseumTest:test_bisect_whenAsserterTimedOut_reverts() (gas: 464467) -ColosseumTest:test_bisect_whenChallengerTimedOut_reverts() (gas: 460457) -ColosseumTest:test_bisect_withBadSegments_reverts() (gas: 486024) -ColosseumTest:test_cancelChallenge_noChallenge_reverts() (gas: 35361) -ColosseumTest:test_cancelChallenge_outputNotDeleted_reverts() (gas: 447352) -ColosseumTest:test_cancelChallenge_senderNotChallenger_reverts() (gas: 2935131) -ColosseumTest:test_cancelChallenge_succeeds() (gas: 2673630) -ColosseumTest:test_cancelChallenge_whenChallengerTimedOut_reverts() (gas: 2929470) -ColosseumTest:test_challengerNotCloseWhenAsserterTimeout_succeeds() (gas: 456139) -ColosseumTest:test_challengerTimeout_succeeds() (gas: 435847) -ColosseumTest:test_constructor_succeeds() (gas: 39323) -ColosseumTest:test_createChallenge_afterChallengeProven_reverts() (gas: 2449937) -ColosseumTest:test_createChallenge_afterChallengerTimedOut_succeeds() (gas: 718897) -ColosseumTest:test_createChallenge_afterCreationPeriod_reverts() (gas: 54371) -ColosseumTest:test_createChallenge_afterDismissed_succeeds() (gas: 2811745) -ColosseumTest:test_createChallenge_asAsserter_reverts() (gas: 55195) -ColosseumTest:test_createChallenge_existedChallenge_reverts() (gas: 453901) -ColosseumTest:test_createChallenge_genesisOutput_reverts() (gas: 21140) -ColosseumTest:test_createChallenge_notSubmittedOutput_reverts() (gas: 45325) -ColosseumTest:test_createChallenge_otherChallenger_succeeds() (gas: 863082) -ColosseumTest:test_createChallenge_succeeds() (gas: 440996) -ColosseumTest:test_createChallenge_withBadSegments_reverts() (gas: 135575) -ColosseumTest:test_createChallenge_wrongFork_reverts() (gas: 52856) -ColosseumTest:test_dismissChallenge_finalizedOutput_reverts() (gas: 585487) -ColosseumTest:test_dismissChallenge_notSecurityCouncil_reverts() (gas: 2441047) -ColosseumTest:test_dismissChallenge_outputNotDeleted_reverts() (gas: 28891) -ColosseumTest:test_dismissChallenge_succeeds() (gas: 2460527) -ColosseumTest:test_forceDeleteOutput_alreadyDeletedOutput_reverts() (gas: 598380) -ColosseumTest:test_forceDeleteOutput_finalizedOutput_reverts() (gas: 582830) -ColosseumTest:test_forceDeleteOutput_notSecurityCouncil_reverts() (gas: 15829) -ColosseumTest:test_forceDeleteOutput_succeeds() (gas: 592069) -ColosseumTest:test_initialize_succeeds() (gas: 35309) -ColosseumTest:test_isInCreationPeriod_succeeds() (gas: 43129) -ColosseumTest:test_proveFault_cancelChallenge_succeeds() (gas: 2889157) -ColosseumTest:test_proveFault_finalizedOutput_reverts() (gas: 656490) -ColosseumTest:test_proveFault_succeeds() (gas: 2437068) -Colosseum_ValidatorSystemUpgrade_Test:test_cancelChallenge_callValidatorManager_succeeds() (gas: 2757520) -Colosseum_ValidatorSystemUpgrade_Test:test_challengerTimeout_callValidatorManager_succeeds() (gas: 479093) -Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_callValidatorManager_succeeds() (gas: 441270) -Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_notSatisfyCondition_reverts() (gas: 77847) -Colosseum_ValidatorSystemUpgrade_Test:test_dismissChallenge_callValidatorManager_succeeds() (gas: 2791922) -Colosseum_ValidatorSystemUpgrade_Test:test_forceDeleteOutput_callValidatorManager_succeeds() (gas: 662290) -Colosseum_ValidatorSystemUpgrade_Test:test_proveFault_callValidatorManager_succeeds() (gas: 2479139) +AssetManagerTest:test_withdraw_insufficientValidatorKro_reverts() (gas: 276180) +AssetManagerTest:test_withdraw_notElapsedMinDelegationPeriod_reverts() (gas: 269735) +AssetManagerTest:test_withdraw_notExpiredJailPeriod_reverts() (gas: 286611) +AssetManagerTest:test_withdraw_notWithdrawAcc_reverts() (gas: 267610) +AssetManagerTest:test_withdraw_succeeds() (gas: 270082) +AssetManagerTest:test_withdraw_validatorKroBonded_reverts() (gas: 278884) +AssetManagerTest:test_withdraw_zeroAsset_reverts() (gas: 269193) +ColosseumTest:test_bisect_cancelChallenge_senderNotChallenger_reverts() (gas: 3046639) +ColosseumTest:test_bisect_cancelChallenge_succeeds() (gas: 2831053) +ColosseumTest:test_bisect_finalizedOutput_reverts() (gas: 465903) +ColosseumTest:test_bisect_ifNotYourTurn_reverts() (gas: 463101) +ColosseumTest:test_bisect_succeeds() (gas: 438785) +ColosseumTest:test_bisect_whenAsserterTimedOut_reverts() (gas: 465515) +ColosseumTest:test_bisect_whenChallengerTimedOut_reverts() (gas: 460604) +ColosseumTest:test_bisect_withBadSegments_reverts() (gas: 486727) +ColosseumTest:test_cancelChallenge_noChallenge_reverts() (gas: 35450) +ColosseumTest:test_cancelChallenge_outputNotDeleted_reverts() (gas: 448697) +ColosseumTest:test_cancelChallenge_senderNotChallenger_reverts() (gas: 3050503) +ColosseumTest:test_cancelChallenge_succeeds() (gas: 2781055) +ColosseumTest:test_cancelChallenge_whenChallengerTimedOut_reverts() (gas: 3043892) +ColosseumTest:test_challengerNotCloseWhenAsserterTimeout_succeeds() (gas: 457433) +ColosseumTest:test_challengerTimeout_succeeds() (gas: 436222) +ColosseumTest:test_constructor_succeeds() (gas: 39410) +ColosseumTest:test_createChallenge_afterChallengeProven_reverts() (gas: 2565549) +ColosseumTest:test_createChallenge_afterChallengerTimedOut_succeeds() (gas: 718692) +ColosseumTest:test_createChallenge_afterCreationPeriod_reverts() (gas: 54363) +ColosseumTest:test_createChallenge_afterDismissed_succeeds() (gas: 2851976) +ColosseumTest:test_createChallenge_asAsserter_reverts() (gas: 54916) +ColosseumTest:test_createChallenge_existedChallenge_reverts() (gas: 454878) +ColosseumTest:test_createChallenge_genesisOutput_reverts() (gas: 20894) +ColosseumTest:test_createChallenge_notSubmittedOutput_reverts() (gas: 45093) +ColosseumTest:test_createChallenge_otherChallenger_succeeds() (gas: 863698) +ColosseumTest:test_createChallenge_succeeds() (gas: 442407) +ColosseumTest:test_createChallenge_withBadSegments_reverts() (gas: 135055) +ColosseumTest:test_createChallenge_wrongFork_reverts() (gas: 52602) +ColosseumTest:test_dismissChallenge_finalizedOutput_reverts() (gas: 583918) +ColosseumTest:test_dismissChallenge_invalidAddressGiven_reverts() (gas: 2577707) +ColosseumTest:test_dismissChallenge_invalidOutputGiven_reverts() (gas: 2567255) +ColosseumTest:test_dismissChallenge_invalidPublicInput_reverts() (gas: 2571294) +ColosseumTest:test_dismissChallenge_notSecurityCouncil_reverts() (gas: 2556986) +ColosseumTest:test_dismissChallenge_outputNotDeleted_reverts() (gas: 37588) +ColosseumTest:test_dismissChallenge_succeeds() (gas: 2501391) +ColosseumTest:test_forceDeleteOutput_alreadyDeletedOutput_reverts() (gas: 596833) +ColosseumTest:test_forceDeleteOutput_finalizedOutput_reverts() (gas: 581327) +ColosseumTest:test_forceDeleteOutput_notSecurityCouncil_reverts() (gas: 15822) +ColosseumTest:test_forceDeleteOutput_succeeds() (gas: 590479) +ColosseumTest:test_initialize_succeeds() (gas: 34291) +ColosseumTest:test_isInCreationPeriod_succeeds() (gas: 43151) +ColosseumTest:test_proveFault_cancelChallenge_succeeds() (gas: 2978962) +ColosseumTest:test_proveFault_finalizedOutput_reverts() (gas: 698828) +ColosseumTest:test_proveFault_succeeds() (gas: 2552943) +Colosseum_ValidatorSystemUpgrade_Test:test_cancelChallenge_callValidatorManager_succeeds() (gas: 2851626) +Colosseum_ValidatorSystemUpgrade_Test:test_challengerTimeout_callValidatorManager_succeeds() (gas: 479816) +Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_callValidatorManager_succeeds() (gas: 440957) +Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_notSatisfyCondition_reverts() (gas: 77683) +Colosseum_ValidatorSystemUpgrade_Test:test_dismissChallenge_callValidatorManager_succeeds() (gas: 2822011) +Colosseum_ValidatorSystemUpgrade_Test:test_forceDeleteOutput_callValidatorManager_succeeds() (gas: 661517) +Colosseum_ValidatorSystemUpgrade_Test:test_proveFault_callValidatorManager_succeeds() (gas: 2587483) CrossDomainMessenger_BaseGas_Test:test_baseGas_succeeds() (gas: 11763) CrossDomainOwnable2_Test:test_onlyOwner_notMessenger_reverts() (gas: 8496) CrossDomainOwnable2_Test:test_onlyOwner_notOwner2_reverts() (gas: 57515) @@ -460,58 +463,60 @@ UpgradeGovernorTest:test_initialize_succeeds() (gas: 85053) UpgradeGovernorTest:test_queueProposal_succeeds() (gas: 280037) UpgradeGovernorTest:test_voteProposal_overPeriod_reverts() (gas: 152674) UpgradeGovernorTest:test_voteProposal_succeeds() (gas: 198054) -ValidatorManagerTest:test_activateValidator_alreadyActivated_reverts() (gas: 270511) -ValidatorManagerTest:test_activateValidator_exited_reverts() (gas: 225669) -ValidatorManagerTest:test_activateValidator_inJail_reverts() (gas: 981211) +ValidatorManagerTest:test_activateValidator_alreadyActivated_reverts() (gas: 270981) +ValidatorManagerTest:test_activateValidator_exited_reverts() (gas: 225821) +ValidatorManagerTest:test_activateValidator_inJail_reverts() (gas: 982149) ValidatorManagerTest:test_activateValidator_notValidator_reverts() (gas: 20006) -ValidatorManagerTest:test_activateValidator_registered_reverts() (gas: 177716) -ValidatorManagerTest:test_activatedValidatorTotalWeight_succeeds() (gas: 568880) -ValidatorManagerTest:test_afterSubmitL2Output_distributeRewardToSC_succeeds() (gas: 587669) -ValidatorManagerTest:test_afterSubmitL2Output_distributeReward_succeeds() (gas: 853584) -ValidatorManagerTest:test_afterSubmitL2Output_resetNoSubmissionCount_succeeds() (gas: 754262) +ValidatorManagerTest:test_activateValidator_registered_reverts() (gas: 177846) +ValidatorManagerTest:test_activatedValidatorTotalWeight_succeeds() (gas: 569692) +ValidatorManagerTest:test_afterSubmitL2Output_distributeRewardToSC_succeeds() (gas: 588075) +ValidatorManagerTest:test_afterSubmitL2Output_distributeReward_succeeds() (gas: 853990) +ValidatorManagerTest:test_afterSubmitL2Output_resetNoSubmissionCount_succeeds() (gas: 755074) ValidatorManagerTest:test_afterSubmitL2Output_senderNotL2OO_reverts() (gas: 15890) -ValidatorManagerTest:test_afterSubmitL2Output_tryJail_succeeds() (gas: 893738) -ValidatorManagerTest:test_afterSubmitL2Output_updatePriorityValidator_succeeds() (gas: 921450) -ValidatorManagerTest:test_bondValidatorKro_notColosseum_reverts() (gas: 276979) -ValidatorManagerTest:test_bondValidatorKro_succeeds() (gas: 286406) -ValidatorManagerTest:test_checkSubmissionEligibility_inJail_reverts() (gas: 904851) -ValidatorManagerTest:test_checkSubmissionEligibility_notSatisfyCondition_reverts() (gas: 22009) +ValidatorManagerTest:test_afterSubmitL2Output_tryJail_succeeds() (gas: 894676) +ValidatorManagerTest:test_afterSubmitL2Output_updatePriorityValidator_succeeds() (gas: 922262) +ValidatorManagerTest:test_bondValidatorKro_notColosseum_reverts() (gas: 277385) +ValidatorManagerTest:test_bondValidatorKro_succeeds() (gas: 286812) +ValidatorManagerTest:test_checkSubmissionEligibility_inJail_reverts() (gas: 905789) +ValidatorManagerTest:test_checkSubmissionEligibility_notSatisfyCondition_reverts() (gas: 22032) ValidatorManagerTest:test_checkSubmissionEligibility_notSelected_reverts() (gas: 66670) -ValidatorManagerTest:test_checkSubmissionEligibility_priorityRound_succeeds() (gas: 274097) -ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_inJail_reverts() (gas: 908007) +ValidatorManagerTest:test_checkSubmissionEligibility_priorityRound_succeeds() (gas: 274503) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_inJail_reverts() (gas: 908945) ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_notSatisfyCondition_reverts() (gas: 71117) -ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_succeeds() (gas: 323257) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_succeeds() (gas: 323663) ValidatorManagerTest:test_checkSubmissionEligibility_senderNotL2OO_reverts() (gas: 15560) -ValidatorManagerTest:test_constructor_smallMinActivateAmount_reverts() (gas: 64955) -ValidatorManagerTest:test_constructor_succeeds() (gas: 42956) -ValidatorManagerTest:test_finalizeCommissionChange_changeDelayNotElapsed_reverts() (gas: 290905) -ValidatorManagerTest:test_finalizeCommissionChange_exited_reverts() (gas: 273115) -ValidatorManagerTest:test_finalizeCommissionChange_inJail_reverts() (gas: 900136) -ValidatorManagerTest:test_finalizeCommissionChange_notInitiated_reverts() (gas: 273149) -ValidatorManagerTest:test_finalizeCommissionChange_succeeds() (gas: 307668) -ValidatorManagerTest:test_getStatus_registered_succeeds() (gas: 270107) -ValidatorManagerTest:test_initCommissionChange_exited_reverts() (gas: 266600) -ValidatorManagerTest:test_initCommissionChange_inJail_reverts() (gas: 900208) -ValidatorManagerTest:test_initCommissionChange_largeCommissionRate_reverts() (gas: 273010) -ValidatorManagerTest:test_initCommissionChange_sameCommissionRate_reverts() (gas: 274894) -ValidatorManagerTest:test_initCommissionChange_succeeds() (gas: 284127) -ValidatorManagerTest:test_registerValidator_active_succeeds() (gas: 288199) -ValidatorManagerTest:test_registerValidator_alreadyInitiated_reverts() (gas: 294182) -ValidatorManagerTest:test_registerValidator_largeCommissionRate_reverts() (gas: 54461) -ValidatorManagerTest:test_registerValidator_registered_succeeds() (gas: 188972) -ValidatorManagerTest:test_registerValidator_smallAsset_reverts() (gas: 54592) -ValidatorManagerTest:test_registerValidator_withdrawZeroAddr_reverts() (gas: 81167) +ValidatorManagerTest:test_constructor_smallMinActivateAmount_reverts() (gas: 65117) +ValidatorManagerTest:test_constructor_succeeds() (gas: 42979) +ValidatorManagerTest:test_finalizeCommissionChange_changeDelayNotElapsed_reverts() (gas: 291311) +ValidatorManagerTest:test_finalizeCommissionChange_exited_reverts() (gas: 273540) +ValidatorManagerTest:test_finalizeCommissionChange_inJail_reverts() (gas: 901074) +ValidatorManagerTest:test_finalizeCommissionChange_notInitiated_reverts() (gas: 273555) +ValidatorManagerTest:test_finalizeCommissionChange_succeeds() (gas: 308074) +ValidatorManagerTest:test_getStatus_registered_succeeds() (gas: 270532) +ValidatorManagerTest:test_initCommissionChange_exited_reverts() (gas: 267025) +ValidatorManagerTest:test_initCommissionChange_inJail_reverts() (gas: 901124) +ValidatorManagerTest:test_initCommissionChange_largeCommissionRate_reverts() (gas: 273416) +ValidatorManagerTest:test_initCommissionChange_sameCommissionRate_reverts() (gas: 275300) +ValidatorManagerTest:test_initCommissionChange_succeeds() (gas: 284533) +ValidatorManagerTest:test_registerValidator_active_succeeds() (gas: 288605) +ValidatorManagerTest:test_registerValidator_alreadyInitiated_reverts() (gas: 294740) +ValidatorManagerTest:test_registerValidator_differentOrigin_reverts() (gas: 22555) +ValidatorManagerTest:test_registerValidator_fromContract_reverts() (gas: 20535) +ValidatorManagerTest:test_registerValidator_largeCommissionRate_reverts() (gas: 54636) +ValidatorManagerTest:test_registerValidator_registered_succeeds() (gas: 189124) +ValidatorManagerTest:test_registerValidator_smallAsset_reverts() (gas: 54722) +ValidatorManagerTest:test_registerValidator_withdrawZeroAddr_reverts() (gas: 81319) ValidatorManagerTest:test_revertSlash_notColosseum_reverts() (gas: 24296) -ValidatorManagerTest:test_revertSlash_succeeds() (gas: 999350) +ValidatorManagerTest:test_revertSlash_succeeds() (gas: 1000668) ValidatorManagerTest:test_slash_notColosseum_reverts() (gas: 26416) -ValidatorManagerTest:test_slash_succeeds() (gas: 1118455) -ValidatorManagerTest:test_tryActivateValidator_succeeds() (gas: 316304) +ValidatorManagerTest:test_slash_succeeds() (gas: 1119519) +ValidatorManagerTest:test_tryActivateValidator_succeeds() (gas: 316710) ValidatorManagerTest:test_tryUnjail_notInJail_reverts() (gas: 18008) -ValidatorManagerTest:test_tryUnjail_periodNotElapsed_reverts() (gas: 896231) -ValidatorManagerTest:test_tryUnjail_senderNotSelf_reverts() (gas: 898081) -ValidatorManagerTest:test_tryUnjail_succeeds() (gas: 975629) -ValidatorManagerTest:test_unbondValidatorKro_notColosseum_reverts() (gas: 435415) -ValidatorManagerTest:test_unbondValidatorKro_succeeds() (gas: 440492) +ValidatorManagerTest:test_tryUnjail_periodNotElapsed_reverts() (gas: 897169) +ValidatorManagerTest:test_tryUnjail_senderNotSelf_reverts() (gas: 899019) +ValidatorManagerTest:test_tryUnjail_succeeds() (gas: 976821) +ValidatorManagerTest:test_unbondValidatorKro_notColosseum_reverts() (gas: 435821) +ValidatorManagerTest:test_unbondValidatorKro_succeeds() (gas: 440898) ValidatorPoolTest:test_addPendingBond_insufficientBalances_reverts() (gas: 301386) ValidatorPoolTest:test_addPendingBond_noBond_reverts() (gas: 29957) ValidatorPoolTest:test_addPendingBond_succeeds() (gas: 371365) diff --git a/packages/contracts/.storage-layout b/packages/contracts/.storage-layout index c68d56ea6..b829e5a58 100644 --- a/packages/contracts/.storage-layout +++ b/packages/contracts/.storage-layout @@ -13,6 +13,7 @@ | segmentsLengths | mapping(uint256 => uint256) | 1 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | | challenges | mapping(uint256 => mapping(address => struct Types.Challenge)) | 2 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | | verifiedPublicInputs | mapping(bytes32 => bool) | 3 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | +| deletedOutputs | mapping(uint256 => struct Types.CheckpointOutput) | 4 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | ======================= ➡ contracts/L1/SecurityCouncil.sol:SecurityCouncil diff --git a/packages/contracts/contracts/L1/AssetManager.sol b/packages/contracts/contracts/L1/AssetManager.sol index 134399950..b95333697 100644 --- a/packages/contracts/contracts/L1/AssetManager.sol +++ b/packages/contracts/contracts/L1/AssetManager.sol @@ -66,7 +66,7 @@ contract AssetManager is ISemver, IERC721Receiver, IAssetManager { uint128 public immutable MIN_DELEGATION_PERIOD; /** - * @notice The amount to bond. Can be updated via upgrade. + * @notice The amount to bond. */ uint128 public immutable BOND_AMOUNT; diff --git a/packages/contracts/contracts/L1/Colosseum.sol b/packages/contracts/contracts/L1/Colosseum.sol index 01179f877..3fe713306 100644 --- a/packages/contracts/contracts/L1/Colosseum.sol +++ b/packages/contracts/contracts/L1/Colosseum.sol @@ -121,7 +121,7 @@ contract Colosseum is Initializable, ISemver { /** * @notice Length of segment array for each turn. */ - mapping(uint256 => uint256) internal segmentsLengths; + mapping(uint256 => uint256) public segmentsLengths; /** * @notice A mapping of the challenge. @@ -133,6 +133,11 @@ contract Colosseum is Initializable, ISemver { */ mapping(bytes32 => bool) public verifiedPublicInputs; + /** + * @notice A mapping of deleted output index to the deleted output. + */ + mapping(uint256 => Types.CheckpointOutput) public deletedOutputs; + /** * @notice Emitted when the challenge is created. * @@ -262,6 +267,16 @@ contract Colosseum is Initializable, ISemver { */ error OutputNotDeleted(); + /** + * @notice Reverts when given output is invalid. + */ + error InvalidOutputGiven(); + + /** + * @notice Reverts when given address is invalid. + */ + error InvalidAddressGiven(); + /** * @notice Reverts when output is genesis output. */ @@ -288,9 +303,9 @@ contract Colosseum is Initializable, ISemver { error L1Reorged(); /** - * @notice Reverts when the public input has already been used to prove fault. + * @notice Reverts when the public input is invalid. */ - error AlreadyUsedPublicInput(); + error InvalidPublicInput(); /** * @notice Reverts when the ZK proof is invalid. @@ -343,29 +358,6 @@ contract Colosseum is Initializable, ISemver { */ error CannotCancelChallenge(); - /** - * @notice Reverts when try to rollback output to zero hash. - */ - error CannotRollbackOutputToZero(); - - /** - * @notice A modifier that only allows the security council to call - */ - modifier onlySecurityCouncil() { - if (msg.sender != SECURITY_COUNCIL) revert NotAllowedCaller(); - _; - } - - /** - * @notice Reverts if the output of given index is already finalized. - * - * @param _outputIndex Index of the L2 checkpoint output. - */ - modifier outputNotFinalized(uint256 _outputIndex) { - if (L2_ORACLE.isFinalized(_outputIndex)) revert OutputAlreadyFinalized(); - _; - } - /** * @notice Semantic version. * @custom:semver 1.1.0 @@ -524,7 +516,9 @@ contract Colosseum is Initializable, ISemver { address _challenger, uint256 _pos, bytes32[] calldata _segments - ) external outputNotFinalized(_outputIndex) { + ) external { + _checkOutputNotFinalized(_outputIndex); + Types.Challenge storage challenge = challenges[_outputIndex][_challenger]; ChallengeStatus status = _challengeStatus(challenge); @@ -550,9 +544,7 @@ contract Colosseum is Initializable, ISemver { ); uint256 segSize = _nextSegSize(challenge); - uint256 segStart = challenge.segStart + _pos * segSize; - - _updateSegments(challenge, _segments, segStart, segSize); + _updateSegments(challenge, _segments, challenge.segStart + _pos * segSize, segSize); challenge.turn = newTurn; _updateTimeout(challenge); @@ -581,7 +573,9 @@ contract Colosseum is Initializable, ISemver { Types.PublicInputProof calldata _proof, uint256[] calldata _zkproof, uint256[] calldata _pair - ) external outputNotFinalized(_outputIndex) { + ) external { + _checkOutputNotFinalized(_outputIndex); + Types.Challenge storage challenge = challenges[_outputIndex][msg.sender]; ChallengeStatus status = _challengeStatus(challenge); @@ -592,14 +586,11 @@ contract Colosseum is Initializable, ISemver { if (status != ChallengeStatus.READY_TO_PROVE && status != ChallengeStatus.ASSERTER_TIMEOUT) revert ImproperChallengeStatus(); - bytes32 srcOutputRoot = Hashing.hashOutputRootProof(_proof.srcOutputRootProof); - bytes32 dstOutputRoot = Hashing.hashOutputRootProof(_proof.dstOutputRootProof); - _validateOutputRootProof( _pos, challenge, - srcOutputRoot, - dstOutputRoot, + Hashing.hashOutputRootProof(_proof.srcOutputRootProof), + Hashing.hashOutputRootProof(_proof.dstOutputRootProof), _proof.srcOutputRootProof, _proof.dstOutputRootProof ); @@ -622,7 +613,7 @@ contract Colosseum is Initializable, ISemver { _proof.publicInput ); - if (verifiedPublicInputs[publicInputHash]) revert AlreadyUsedPublicInput(); + if (verifiedPublicInputs[publicInputHash]) revert InvalidPublicInput(); if (!ZK_VERIFIER.verify(_zkproof, _pair, publicInputHash)) revert InvalidZKProof(); emit Proven(_outputIndex, msg.sender, block.timestamp); @@ -646,6 +637,8 @@ contract Colosseum is Initializable, ISemver { output.l2BlockNumber, callbackData ); + + deletedOutputs[_outputIndex] = output; } // Switch validator system after validator pool contract terminated. @@ -710,11 +703,21 @@ contract Colosseum is Initializable, ISemver { address _asserter, bytes32 _outputRoot, bytes32 _publicInputHash - ) external onlySecurityCouncil outputNotFinalized(_outputIndex) { - if (_outputRoot == DELETED_OUTPUT_ROOT) revert CannotRollbackOutputToZero(); + ) external { + _checkSecurityCouncil(); + _checkOutputNotFinalized(_outputIndex); + if (L2_ORACLE.getL2Output(_outputIndex).outputRoot != DELETED_OUTPUT_ROOT) revert OutputNotDeleted(); + if (_outputRoot != deletedOutputs[_outputIndex].outputRoot) revert InvalidOutputGiven(); + if ( + _challenger != L2_ORACLE.getSubmitter(_outputIndex) || + _asserter != deletedOutputs[_outputIndex].submitter + ) revert InvalidAddressGiven(); + if (!verifiedPublicInputs[_publicInputHash]) revert InvalidPublicInput(); + verifiedPublicInputs[_publicInputHash] = false; + delete deletedOutputs[_outputIndex]; // Rollback output root. L2_ORACLE.replaceL2Output(_outputIndex, _outputRoot, _asserter); @@ -736,9 +739,10 @@ contract Colosseum is Initializable, ISemver { * * @param _outputIndex Index of the L2 checkpoint output. */ - function forceDeleteOutput( - uint256 _outputIndex - ) external onlySecurityCouncil outputNotFinalized(_outputIndex) { + function forceDeleteOutput(uint256 _outputIndex) external { + _checkSecurityCouncil(); + _checkOutputNotFinalized(_outputIndex); + // Check if the output is deleted. Types.CheckpointOutput memory output = L2_ORACLE.getL2Output(_outputIndex); if (output.outputRoot == DELETED_OUTPUT_ROOT) revert OutputAlreadyDeleted(); @@ -755,6 +759,22 @@ contract Colosseum is Initializable, ISemver { emit OutputForceDeleted(_outputIndex, output.submitter, block.timestamp); } + /** + * @notice Reverts if the caller is not security council. + */ + function _checkSecurityCouncil() internal view { + if (msg.sender != SECURITY_COUNCIL) revert NotAllowedCaller(); + } + + /** + * @notice Reverts if the output of given index is already finalized. + * + * @param _outputIndex Index of the L2 checkpoint output. + */ + function _checkOutputNotFinalized(uint256 _outputIndex) internal view { + if (L2_ORACLE.isFinalized(_outputIndex)) revert OutputAlreadyFinalized(); + } + /** * @notice Reverts if the given segments are invalid. * @@ -768,12 +788,10 @@ contract Colosseum is Initializable, ISemver { bytes32 _prevFirst, bytes32 _prevLast, bytes32[] memory _segments - ) private view { - uint256 segLen = _segments.length; - - if (getSegmentsLength(_turn) != segLen) revert InvalidSegmentsLength(); + ) internal view { + if (segmentsLengths[_turn - 1] != _segments.length) revert InvalidSegmentsLength(); if (_prevFirst != _segments[0]) revert FirstSegmentMismatched(); - if (_prevLast == _segments[segLen - 1]) revert LastSegmentMatched(); + if (_prevLast == _segments[_segments.length - 1]) revert LastSegmentMatched(); } /** @@ -823,7 +841,7 @@ contract Colosseum is Initializable, ISemver { bytes32 _l2ToL1MessagePasserCodeHash, bytes32 _messagePasserStorageRoot, bytes32 _stateRoot - ) private view { + ) internal view { // TODO(chokobole): Can we fix the codeHash? bytes memory l2ToL1MessagePasserAccount = abi.encodePacked( uint256(0), // nonce @@ -859,7 +877,7 @@ contract Colosseum is Initializable, ISemver { bytes32 _dstOutputRoot, Types.OutputRootProof calldata _srcOutputRootProof, Types.OutputRootProof calldata _dstOutputRootProof - ) private view { + ) internal view { if (_challenge.segments[_pos] != _srcOutputRoot) revert FirstSegmentMismatched(); // If asserter timeout, the bisection of segments may not have ended. @@ -886,7 +904,7 @@ contract Colosseum is Initializable, ISemver { Types.OutputRootProof calldata _dstOutputRootProof, Types.PublicInput calldata _publicInput, Types.BlockHeaderRLP calldata _rlps - ) private pure { + ) internal pure { // TODO(chokobole): check withdrawal storage root of _dstOutputRootProof against state root of _dstOutputRootProof. if (_publicInput.stateRoot != _dstOutputRootProof.stateRoot) revert StateRootMismatched(); @@ -983,7 +1001,7 @@ contract Colosseum is Initializable, ISemver { function _hashPublicInput( bytes32 _prevStateRoot, Types.PublicInput calldata _publicInput - ) private view returns (bytes32) { + ) internal view returns (bytes32) { bytes32[] memory dummyHashes; if (_publicInput.txHashes.length < MAX_TXS) { dummyHashes = Hashing.generateDummyHashes( @@ -1008,19 +1026,8 @@ contract Colosseum is Initializable, ISemver { * * @return The number of L2 blocks for the next turn. */ - function _nextSegSize(Types.Challenge storage _challenge) private view returns (uint256) { - return _challenge.segSize / (getSegmentsLength(_challenge.turn) - 1); - } - - /** - * @notice Determines whether a given timestamp is past. - * - * @param _sec The timestamp to check. - * - * @return Whether it's in the past. - */ - function _isPast(uint256 _sec) private view returns (bool) { - return block.timestamp > _sec; + function _nextSegSize(Types.Challenge storage _challenge) internal view returns (uint256) { + return _challenge.segSize / (segmentsLengths[_challenge.turn - 1] - 1); } /** @@ -1030,7 +1037,7 @@ contract Colosseum is Initializable, ISemver { * * @return Whether bisection is possible. */ - function _isAbleToBisect(Types.Challenge storage _challenge) private view returns (bool) { + function _isAbleToBisect(Types.Challenge storage _challenge) internal view returns (bool) { return _nextSegSize(_challenge) > 1; } @@ -1043,7 +1050,7 @@ contract Colosseum is Initializable, ISemver { */ function _challengeStatus( Types.Challenge storage _challenge - ) private view returns (ChallengeStatus) { + ) internal view returns (ChallengeStatus) { if (_challenge.turn < TURN_INIT) { return ChallengeStatus.NONE; } @@ -1053,7 +1060,7 @@ contract Colosseum is Initializable, ISemver { bool isChallengerTurn = _challenge.turn % 2 == 0; // Check if it's a timed out challenge. - if (_isPast(_challenge.timeoutAt)) { + if (block.timestamp > _challenge.timeoutAt) { // timeout on challenger turn if (isChallengerTurn) { return ChallengeStatus.CHALLENGER_TIMEOUT; @@ -1061,7 +1068,7 @@ contract Colosseum is Initializable, ISemver { // If the asserter times out and the challenger does not prove fault, // the challenger is assumed to have timed out. - if (_isPast(_challenge.timeoutAt + PROVING_TIMEOUT)) { + if (block.timestamp > _challenge.timeoutAt + PROVING_TIMEOUT) { return ChallengeStatus.CHALLENGER_TIMEOUT; } @@ -1078,18 +1085,18 @@ contract Colosseum is Initializable, ISemver { } /** - * @notice Returns the challenge corresponding to the given L2 output index. + * @notice Returns the challenge segments corresponding to the given L2 output index and challenger. * * @param _outputIndex Index of the L2 checkpoint output. * @param _challenger Address of the challenger. * - * @return The challenge data. + * @return The challenge segments data. */ - function getChallenge( + function getSegments( uint256 _outputIndex, address _challenger - ) external view returns (Types.Challenge memory) { - return challenges[_outputIndex][_challenger]; + ) external view returns (bytes32[] memory) { + return challenges[_outputIndex][_challenger].segments; } /** @@ -1107,31 +1114,6 @@ contract Colosseum is Initializable, ISemver { return _challengeStatus(challenges[_outputIndex][_challenger]); } - /** - * @notice Returns the segment length required for that turn. - * - * @param _turn The challenge turn. - * - * @return The segments length. - */ - function getSegmentsLength(uint8 _turn) public view returns (uint256) { - if (_turn < TURN_INIT) revert InvalidTurn(); - return segmentsLengths[_turn - 1]; - } - - /** - * @notice Determines whether bisection is possible in the challenge corresponding to the given - * L2 output index. - * - * @param _outputIndex Index of the L2 checkpoint output. - * @param _challenger Address of the challenger. - * - * @return Whether bisection is possible. - */ - function isAbleToBisect(uint256 _outputIndex, address _challenger) public view returns (bool) { - return _isAbleToBisect(challenges[_outputIndex][_challenger]); - } - /** * @notice Determines whether current timestamp is in challenge creation period corresponding to the given L2 output index. * diff --git a/packages/contracts/contracts/L1/ValidatorManager.sol b/packages/contracts/contracts/L1/ValidatorManager.sol index 12cbb3286..5183885ed 100644 --- a/packages/contracts/contracts/L1/ValidatorManager.sol +++ b/packages/contracts/contracts/L1/ValidatorManager.sol @@ -191,10 +191,9 @@ contract ValidatorManager is ISemver, IValidatorManager { uint8 commissionRate, address withdrawAccount ) external { + if (msg.sender.code.length > 0 || msg.sender != tx.origin) revert NotAllowedCaller(); if (getStatus(msg.sender) != ValidatorStatus.NONE) revert ImproperValidatorStatus(); - if (assets < MIN_REGISTER_AMOUNT) revert InsufficientAsset(); - if (commissionRate > COMMISSION_RATE_DENOM) revert MaxCommissionRateExceeded(); Validator storage validatorInfo = _validatorInfo[msg.sender]; @@ -246,9 +245,7 @@ contract ValidatorManager is ISemver, IValidatorManager { } // Select the next priority validator. - unchecked { - _updatePriorityValidator(); - } + _updatePriorityValidator(); } /** @@ -258,10 +255,9 @@ contract ValidatorManager is ISemver, IValidatorManager { if (getStatus(msg.sender) < ValidatorStatus.REGISTERED || inJail(msg.sender)) revert ImproperValidatorStatus(); - Validator storage validatorInfo = _validatorInfo[msg.sender]; - if (newCommissionRate > COMMISSION_RATE_DENOM) revert MaxCommissionRateExceeded(); + Validator storage validatorInfo = _validatorInfo[msg.sender]; uint8 oldCommissionRate = validatorInfo.commissionRate; if (newCommissionRate == oldCommissionRate) revert SameCommissionRate(); diff --git a/packages/contracts/contracts/libraries/BalancedWeightTree.sol b/packages/contracts/contracts/libraries/BalancedWeightTree.sol index ec172515d..44f744aae 100644 --- a/packages/contracts/contracts/libraries/BalancedWeightTree.sol +++ b/packages/contracts/contracts/libraries/BalancedWeightTree.sol @@ -50,14 +50,15 @@ library BalancedWeightTree { /** * @notice Inserts new node with the specified address and weight inside the tree. - * Note that the uniqueness of _addr is not being checked. Adding 2 entries with the - * same address causes an unexpected behavior. * * @param _tree The tree to insert the new node. * @param _addr The address that owns the new node. * @param _weight The weight of the new node. */ function insert(Tree storage _tree, address _addr, uint120 _weight) internal { + require(_addr != address(0), "BalancedWeightTree: zero address not allowed"); + require(_tree.nodeMap[_addr] == 0, "BalancedWeightTree: node already existing"); + Node memory newNode = Node({ addr: _addr, weight: _weight, @@ -347,6 +348,7 @@ library BalancedWeightTree { function _pullUp(Tree storage _tree, uint32 _index) private { while (true) { Node storage node = _tree.nodes[_index]; + require(node.addr != address(0), "BalancedWeightTree: node not exists"); if (node.leftChild == 0) { if (node.rightChild == 0) { diff --git a/packages/contracts/contracts/test/AssetManager.t.sol b/packages/contracts/contracts/test/AssetManager.t.sol index 422086498..63f44702d 100644 --- a/packages/contracts/contracts/test/AssetManager.t.sol +++ b/packages/contracts/contracts/test/AssetManager.t.sol @@ -112,7 +112,7 @@ contract AssetManagerTest is ValidatorSystemUpgrade_Initializer { } function _registerValidator(uint128 amount) internal { - vm.startPrank(validator); + vm.startPrank(validator, validator); assetToken.approve(address(assetMgr), amount); valMgr.registerValidator(amount, 0, withdrawAcc); vm.stopPrank(); diff --git a/packages/contracts/contracts/test/BalancedWeightTree.t.sol b/packages/contracts/contracts/test/BalancedWeightTree.t.sol index ae7aba39a..5b9a8a930 100644 --- a/packages/contracts/contracts/test/BalancedWeightTree.t.sol +++ b/packages/contracts/contracts/test/BalancedWeightTree.t.sol @@ -24,11 +24,14 @@ contract BalancedWeightTree_Test is Test { } function testFuzz_insert_succeeds(address _addr, uint120 _weight) external { - uint32 counter = tree.counter; + vm.assume(_addr != address(0)); + uint32 index = tree.nodeMap[_addr]; + vm.assume(index == 0); + uint32 counter = tree.counter; BalancedWeightTree.insert(tree, _addr, _weight); - uint32 index = tree.nodeMap[_addr]; + index = tree.nodeMap[_addr]; assertEq(tree.counter, counter + 1); assertEq(tree.nodes[index].addr, _addr); assertEq(tree.nodes[index].weight, _weight); diff --git a/packages/contracts/contracts/test/Colosseum.t.sol b/packages/contracts/contracts/test/Colosseum.t.sol index e649d93c5..02a020c0e 100644 --- a/packages/contracts/contracts/test/Colosseum.t.sol +++ b/packages/contracts/contracts/test/Colosseum.t.sol @@ -1,20 +1,71 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; - import { Types } from "../libraries/Types.sol"; import { IValidatorManager } from "../L1/interfaces/IValidatorManager.sol"; import { Colosseum } from "../L1/Colosseum.sol"; -import { SecurityCouncil } from "../L1/SecurityCouncil.sol"; +import { L2OutputOracle } from "../L1/L2OutputOracle.sol"; import { ValidatorPool } from "../L1/ValidatorPool.sol"; +import { ZKVerifier } from "../L1/ZKVerifier.sol"; +import { Hashing } from "../libraries/Hashing.sol"; import { Proxy } from "../universal/Proxy.sol"; import { ColosseumTestData } from "./testdata/ColosseumTestData.sol"; -import { Colosseum_Initializer, ValidatorSystemUpgrade_Initializer } from "./CommonTest.t.sol"; +import { Colosseum_Initializer } from "./CommonTest.t.sol"; import { MockL2OutputOracle } from "./ValidatorManager.t.sol"; +contract MockColosseum is Colosseum { + constructor( + L2OutputOracle _l2Oracle, + ZKVerifier _zkVerifier, + uint256 _submissionInterval, + uint256 _creationPeriodSeconds, + uint256 _bisectionTimeout, + uint256 _provingTimeout, + bytes32 _dummyHash, + uint256 _maxTxs, + uint256[] memory _segmentsLengths, + address _securityCouncil, + address _zkMerkleTrie + ) + Colosseum( + _l2Oracle, + _zkVerifier, + _submissionInterval, + _creationPeriodSeconds, + _bisectionTimeout, + _provingTimeout, + _dummyHash, + _maxTxs, + _segmentsLengths, + _securityCouncil, + _zkMerkleTrie + ) + {} + + function getChallenge( + uint256 _outputIndex, + address _challenger + ) external view returns (Types.Challenge memory) { + return challenges[_outputIndex][_challenger]; + } + + function isAbleToBisect( + uint256 _outputIndex, + address _challenger + ) external view returns (bool) { + return _isAbleToBisect(challenges[_outputIndex][_challenger]); + } + + function hashPublicInput( + Types.PublicInputProof calldata _proof + ) external view returns (bytes32) { + return _hashPublicInput(_proof.srcOutputRootProof.stateRoot, _proof.publicInput); + } +} + // Test the implementations of the Colosseum contract ColosseumTest is Colosseum_Initializer { + MockColosseum mockColosseum; uint256 internal targetOutputIndex; mapping(address => bool) internal isChallenger; @@ -27,6 +78,23 @@ contract ColosseumTest is Colosseum_Initializer { function setUp() public virtual override { super.setUp(); + MockColosseum mockColosseumImpl = new MockColosseum( + oracle, + zkVerifier, + submissionInterval, + creationPeriodSeconds, + bisectionTimeout, + provingTimeout, + DUMMY_HASH, + MAX_TXS, + segmentsLengths, + address(securityCouncil), + address(zkMerkleTrie) + ); + vm.prank(multisig); + Proxy(payable(address(colosseum))).upgradeTo(address(mockColosseumImpl)); + mockColosseum = MockColosseum(address(colosseum)); + vm.prank(trusted); pool.deposit{ value: trusted.balance }(); vm.prank(asserter); @@ -75,7 +143,7 @@ contract ColosseumTest is Colosseum_Initializer { uint256 _segStart, uint256 _segSize ) private view returns (bytes32[] memory) { - uint256 segLen = colosseum.getSegmentsLength(_turn); + uint256 segLen = colosseum.segmentsLengths(_turn - 1); bytes32[] memory arr = new bytes32[](segLen); @@ -95,7 +163,7 @@ contract ColosseumTest is Colosseum_Initializer { return 0; } - uint256 segLen = colosseum.getSegmentsLength(_challenge.turn); + uint256 segLen = colosseum.segmentsLengths(_challenge.turn - 1); uint256 start = _challenge.segStart; uint256 degree = _challenge.segSize / (segLen - 1); uint256 current = start + degree; @@ -139,22 +207,22 @@ contract ColosseumTest is Colosseum_Initializer { vm.prank(_challenger); colosseum.createChallenge(_outputIndex, bytes32(0), 0, segments); - Types.Challenge memory challenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(_outputIndex, _challenger); assertEq(challenge.asserter, targetOutput.submitter); assertEq(challenge.challenger, _challenger); assertEq(challenge.timeoutAt, block.timestamp + colosseum.BISECTION_TIMEOUT()); - assertEq(challenge.segments.length, colosseum.getSegmentsLength(1)); + assertEq(challenge.segments.length, colosseum.segmentsLengths(0)); assertEq(challenge.segStart, start); assertEq(challenge.segSize, end - start); assertEq(challenge.turn, 1); } function _bisect(uint256 _outputIndex, address _challenger, address _sender) private { - Types.Challenge memory challenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(_outputIndex, _challenger); uint256 position = _detectFault(challenge, _sender); - uint256 segSize = challenge.segSize / (colosseum.getSegmentsLength(challenge.turn) - 1); + uint256 segSize = challenge.segSize / (colosseum.segmentsLengths(challenge.turn - 1) - 1); uint256 segStart = challenge.segStart + position * segSize; bytes32[] memory segments = _newSegments(_sender, challenge.turn + 1, segStart, segSize); @@ -167,21 +235,24 @@ contract ColosseumTest is Colosseum_Initializer { } colosseum.bisect(_outputIndex, challenge.challenger, position, segments); - Types.Challenge memory newChallenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory newChallenge = mockColosseum.getChallenge(_outputIndex, _challenger); assertEq(newChallenge.turn, challenge.turn + 1); assertEq(newChallenge.segments.length, segments.length); assertEq(newChallenge.segStart, segStart); assertEq(newChallenge.segSize, segSize); } - function _proveFault(uint256 _outputIndex, address _challenger) private { + function _proveFault( + uint256 _outputIndex, + address _challenger + ) private returns (bytes32 publicInputHash) { // get previous snapshot Types.CheckpointOutput memory prevOutput = oracle.getL2Output(_outputIndex); - Types.Challenge memory challenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(_outputIndex, _challenger); uint256 position = _detectFault(challenge, challenge.challenger); - _doProveFault(challenge.challenger, _outputIndex, position); + publicInputHash = _doProveFault(challenge.challenger, _outputIndex, position); assertEq( uint256(colosseum.getStatus(_outputIndex, challenge.challenger)), @@ -196,7 +267,11 @@ contract ColosseumTest is Colosseum_Initializer { assertEq(prevOutput.l2BlockNumber, newOutput.l2BlockNumber); } - function _doProveFault(address _challenger, uint256 _outputIndex, uint256 _position) private { + function _doProveFault( + address _challenger, + uint256 _outputIndex, + uint256 _position + ) private returns (bytes32) { ( Types.OutputRootProof memory srcOutputRootProof, Types.OutputRootProof memory dstOutputRootProof @@ -221,6 +296,8 @@ contract ColosseumTest is Colosseum_Initializer { vm.prank(_challenger); colosseum.proveFault(_outputIndex, _position, proof, pp.proof, pp.pair); + + return mockColosseum.hashPublicInput(proof); } function _dismissChallenge(uint256 txId) private { @@ -250,10 +327,10 @@ contract ColosseumTest is Colosseum_Initializer { } function test_initialize_succeeds() external { - assertEq(colosseum.getSegmentsLength(1), segmentsLengths[0]); - assertEq(colosseum.getSegmentsLength(2), segmentsLengths[1]); - assertEq(colosseum.getSegmentsLength(3), segmentsLengths[2]); - assertEq(colosseum.getSegmentsLength(4), segmentsLengths[3]); + assertEq(colosseum.segmentsLengths(0), segmentsLengths[0]); + assertEq(colosseum.segmentsLengths(1), segmentsLengths[1]); + assertEq(colosseum.segmentsLengths(2), segmentsLengths[2]); + assertEq(colosseum.segmentsLengths(3), segmentsLengths[3]); } function test_createChallenge_succeeds() external { @@ -284,7 +361,7 @@ contract ColosseumTest is Colosseum_Initializer { } function test_createChallenge_genesisOutput_reverts() external { - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); vm.expectRevert(Colosseum.NotAllowedGenesisOutput.selector); @@ -294,7 +371,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_createChallenge_asAsserter_reverts() external { uint256 outputIndex = targetOutputIndex; Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(targetOutput.submitter); vm.expectRevert(Colosseum.NotAllowedCaller.selector); @@ -310,7 +387,7 @@ contract ColosseumTest is Colosseum_Initializer { uint256(Colosseum.ChallengeStatus.ASSERTER_TURN) ); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); vm.expectRevert(Colosseum.ImproperChallengeStatus.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, new bytes32[](segLen)); @@ -319,7 +396,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_createChallenge_withBadSegments_reverts() external { uint256 latestBlockNumber = oracle.latestBlockNumber(); uint256 outputIndex = oracle.getL2OutputIndexAfter(latestBlockNumber); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.startPrank(challenger); @@ -351,7 +428,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_createChallenge_notSubmittedOutput_reverts() external { uint256 outputIndex = targetOutputIndex; - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); vm.expectRevert(); @@ -367,7 +444,7 @@ contract ColosseumTest is Colosseum_Initializer { uint256(Colosseum.ChallengeStatus.NONE) ); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); vm.expectRevert(Colosseum.OutputAlreadyDeleted.selector); @@ -378,10 +455,10 @@ contract ColosseumTest is Colosseum_Initializer { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); _bisect(outputIndex, challenge.challenger, challenge.asserter); - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); vm.warp(challenge.timeoutAt + 1); assertEq( @@ -423,7 +500,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_createChallenge_wrongFork_reverts() external { uint256 outputIndex = targetOutputIndex; - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); vm.expectRevert(Colosseum.L1Reorged.selector); @@ -438,7 +515,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_succeeds() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); @@ -448,7 +525,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_finalizedOutput_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq( uint256(colosseum.getStatus(outputIndex, challenger)), @@ -458,7 +535,7 @@ contract ColosseumTest is Colosseum_Initializer { Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); vm.warp(targetOutput.timestamp + oracle.FINALIZATION_PERIOD_SECONDS() + 1); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.prank(challenge.asserter); vm.expectRevert(Colosseum.OutputAlreadyFinalized.selector); @@ -468,12 +545,12 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_withBadSegments_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); uint256 position = _detectFault(challenge, challenge.asserter); - uint256 segSize = challenge.segSize / (colosseum.getSegmentsLength(challenge.turn) - 1); + uint256 segSize = challenge.segSize / (colosseum.segmentsLengths(challenge.turn - 1) - 1); uint256 segStart = challenge.segStart + position * segSize; bytes32[] memory segments = _newSegments( @@ -503,11 +580,11 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_ifNotYourTurn_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.prank(challenge.challenger); vm.expectRevert(Colosseum.NotAllowedCaller.selector); @@ -517,11 +594,11 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_whenAsserterTimedOut_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.warp(challenge.timeoutAt + 1); vm.prank(challenge.asserter); @@ -537,16 +614,16 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_whenChallengerTimedOut_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); _bisect(outputIndex, challenge.challenger, challenge.asserter); // update challenge - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.warp(challenge.timeoutAt + 1); vm.prank(challenge.challenger); @@ -564,7 +641,7 @@ contract ColosseumTest is Colosseum_Initializer { address otherChallenger = _newChallenger("other challenger"); _createChallenge(outputIndex, otherChallenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); // Make it the challenger turn _bisect(outputIndex, otherChallenger, challenge.asserter); @@ -593,7 +670,7 @@ contract ColosseumTest is Colosseum_Initializer { address otherChallenger = _newChallenger("other challenger"); _createChallenge(outputIndex, otherChallenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); // Make it the challenger turn _bisect(outputIndex, otherChallenger, challenge.asserter); @@ -605,13 +682,15 @@ contract ColosseumTest is Colosseum_Initializer { colosseum.bisect(outputIndex, otherChallenger, 0, new bytes32[](0)); } - function test_proveFault_succeeds() public { + function test_proveFault_succeeds() public returns (bytes32 publicInputHash) { uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); + _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -620,16 +699,24 @@ contract ColosseumTest is Colosseum_Initializer { uint256(Colosseum.ChallengeStatus.READY_TO_PROVE) ); - _proveFault(outputIndex, challenge.challenger); + publicInputHash = _proveFault(outputIndex, challenge.challenger); + + (, bytes32 outputRoot, , ) = colosseum.deletedOutputs(outputIndex); + assertEq(outputRoot, targetOutput.outputRoot); + assertTrue(colosseum.verifiedPublicInputs(publicInputHash)); + assertEq( + uint256(colosseum.getStatus(outputIndex, challenger)), + uint256(Colosseum.ChallengeStatus.NONE) + ); } function test_proveFault_finalizedOutput_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -651,7 +738,7 @@ contract ColosseumTest is Colosseum_Initializer { // // _createChallenge(outputIndex, challenger); // - // Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + // Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); // // assertEq(nextSender(challenge), challenge.asserter); // @@ -670,9 +757,9 @@ contract ColosseumTest is Colosseum_Initializer { address otherChallenger = _newChallenger("other challenger"); _createChallenge(outputIndex, otherChallenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, otherChallenger); - while (colosseum.isAbleToBisect(outputIndex, otherChallenger)) { - challenge = colosseum.getChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); + while (mockColosseum.isAbleToBisect(outputIndex, otherChallenger)) { + challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); _bisect(outputIndex, otherChallenger, nextSender(challenge)); } @@ -701,7 +788,7 @@ contract ColosseumTest is Colosseum_Initializer { uint256 outputIndex = targetOutputIndex; Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); - test_proveFault_succeeds(); + bytes32 publicInputHash = test_proveFault_succeeds(); Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); vm.prank(address(securityCouncil)); @@ -710,8 +797,12 @@ contract ColosseumTest is Colosseum_Initializer { newOutput.submitter, output.submitter, output.outputRoot, - bytes32(0) + publicInputHash ); + + (, bytes32 outputRoot, , ) = colosseum.deletedOutputs(outputIndex); + assertEq(outputRoot, bytes32(0)); + assertFalse(colosseum.verifiedPublicInputs(publicInputHash)); } function test_dismissChallenge_notSecurityCouncil_reverts() external { @@ -724,17 +815,23 @@ contract ColosseumTest is Colosseum_Initializer { function test_dismissChallenge_outputNotDeleted_reverts() external { vm.prank(address(securityCouncil)); - vm.expectRevert(Colosseum.CannotRollbackOutputToZero.selector); - colosseum.dismissChallenge(0, address(0), address(0), bytes32(0), bytes32(0)); + vm.expectRevert(Colosseum.OutputNotDeleted.selector); + colosseum.dismissChallenge( + targetOutputIndex, + address(0), + address(0), + bytes32(0), + bytes32(0) + ); } function test_dismissChallenge_finalizedOutput_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -746,16 +843,80 @@ contract ColosseumTest is Colosseum_Initializer { colosseum.dismissChallenge(0, address(0), address(0), bytes32(0), bytes32(0)); } + function test_dismissChallenge_invalidOutputGiven_reverts() external { + uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); + + bytes32 publicInputHash = test_proveFault_succeeds(); + Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidOutputGiven.selector); + colosseum.dismissChallenge( + outputIndex, + newOutput.submitter, + output.submitter, + bytes32(0), + publicInputHash + ); + } + + function test_dismissChallenge_invalidAddressGiven_reverts() external { + uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); + + bytes32 publicInputHash = test_proveFault_succeeds(); + Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidAddressGiven.selector); + colosseum.dismissChallenge( + outputIndex, + address(0), + output.submitter, + output.outputRoot, + publicInputHash + ); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidAddressGiven.selector); + colosseum.dismissChallenge( + outputIndex, + newOutput.submitter, + address(0), + output.outputRoot, + publicInputHash + ); + } + + function test_dismissChallenge_invalidPublicInput_reverts() external { + uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); + + test_proveFault_succeeds(); + Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidPublicInput.selector); + colosseum.dismissChallenge( + outputIndex, + newOutput.submitter, + output.submitter, + output.outputRoot, + bytes32(0) + ); + } + function test_challengerTimeout_succeeds() public { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); _bisect(outputIndex, challenge.challenger, challenge.asserter); - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); vm.warp(challenge.timeoutAt + 1); // check the challenger timeout assertEq(nextSender(challenge), challenge.challenger); @@ -771,7 +932,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_challengerNotCloseWhenAsserterTimeout_succeeds() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); @@ -856,7 +1017,7 @@ contract ColosseumTest is Colosseum_Initializer { address otherChallenger = _newChallenger("other challenger"); _createChallenge(outputIndex, otherChallenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); _bisect(outputIndex, otherChallenger, challenge.asserter); vm.warp(challenge.timeoutAt + 1); @@ -873,10 +1034,10 @@ contract ColosseumTest is Colosseum_Initializer { _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -897,10 +1058,10 @@ contract ColosseumTest is Colosseum_Initializer { _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -916,10 +1077,10 @@ contract ColosseumTest is Colosseum_Initializer { _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -944,12 +1105,30 @@ contract ColosseumTest is Colosseum_Initializer { } contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { + MockColosseum mockColosseum; MockL2OutputOracle mockOracle; uint256 internal targetOutputIndex; function setUp() public override { super.setUp(); + MockColosseum mockColosseumImpl = new MockColosseum( + oracle, + zkVerifier, + submissionInterval, + creationPeriodSeconds, + bisectionTimeout, + provingTimeout, + DUMMY_HASH, + MAX_TXS, + segmentsLengths, + address(securityCouncil), + address(zkMerkleTrie) + ); + vm.prank(multisig); + Proxy(payable(address(colosseum))).upgradeTo(address(mockColosseumImpl)); + mockColosseum = MockColosseum(address(colosseum)); + address oracleAddress = address(oracle); MockL2OutputOracle mockOracleImpl = new MockL2OutputOracle( pool, @@ -1035,7 +1214,7 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { uint256 segStart, uint256 segSize ) private view returns (bytes32[] memory) { - uint256 segLen = colosseum.getSegmentsLength(turn); + uint256 segLen = colosseum.segmentsLengths(turn - 1); bytes32[] memory arr = new bytes32[](segLen); @@ -1058,10 +1237,10 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { } function _bisect(uint256 outputIndex, address _challenger, address sender) private { - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, _challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, _challenger); uint256 position = _detectFault(challenge, sender); - uint256 segSize = challenge.segSize / (colosseum.getSegmentsLength(challenge.turn) - 1); + uint256 segSize = challenge.segSize / (colosseum.segmentsLengths(challenge.turn - 1) - 1); uint256 segStart = challenge.segStart + position * segSize; bytes32[] memory segments = _newSegments(sender, challenge.turn + 1, segStart, segSize); @@ -1078,7 +1257,7 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { return 0; } - uint256 segLen = colosseum.getSegmentsLength(challenge.turn); + uint256 segLen = colosseum.segmentsLengths(challenge.turn - 1); uint256 start = challenge.segStart; uint256 degree = challenge.segSize / (segLen - 1); uint256 current = start + degree; @@ -1145,15 +1324,21 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { colosseum.createChallenge(targetOutputIndex, bytes32(0), 0, segments); } - function test_proveFault_callValidatorManager_succeeds() public { + function test_proveFault_callValidatorManager_succeeds() + public + returns (bytes32 publicInputHash) + { test_createChallenge_callValidatorManager_succeeds(); - Types.Challenge memory challenge = colosseum.getChallenge(targetOutputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge( + targetOutputIndex, + challenger + ); uint128 beforeAsserterKro = assetMgr.totalValidatorKro(challenge.asserter); - while (colosseum.isAbleToBisect(targetOutputIndex, challenger)) { + while (mockColosseum.isAbleToBisect(targetOutputIndex, challenger)) { _bisect(targetOutputIndex, challenger, _nextSender(challenge)); - challenge = colosseum.getChallenge(targetOutputIndex, challenger); + challenge = mockColosseum.getChallenge(targetOutputIndex, challenger); } (ColosseumTestData.ProofPair memory pp, Types.PublicInputProof memory proof) = _getProof(); @@ -1172,6 +1357,8 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { vm.prank(challenger); colosseum.proveFault(targetOutputIndex, position, proof, pp.proof, pp.pair); + publicInputHash = mockColosseum.hashPublicInput(proof); + assertEq(assetMgr.totalValidatorKro(challenge.asserter), beforeAsserterKro - bondAmount); assertEq(assetMgr.totalValidatorKro(challenger), minActivateAmount); } @@ -1180,7 +1367,7 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { Types.CheckpointOutput memory output = oracle.getL2Output(targetOutputIndex); uint128 beforeAsserterKro = assetMgr.totalValidatorKro(output.submitter); - test_proveFault_callValidatorManager_succeeds(); + bytes32 publicInputHash = test_proveFault_callValidatorManager_succeeds(); vm.expectCall( address(valMgr), @@ -1205,7 +1392,7 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { challenger, output.submitter, output.outputRoot, - bytes32(0) + publicInputHash ); assertEq(assetMgr.totalValidatorKro(output.submitter), beforeAsserterKro); @@ -1228,12 +1415,15 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { function test_forceDeleteOutput_callValidatorManager_succeeds() external { test_createChallenge_callValidatorManager_succeeds(); - Types.Challenge memory challenge = colosseum.getChallenge(targetOutputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge( + targetOutputIndex, + challenger + ); uint128 beforeAsserterKro = assetMgr.totalValidatorKro(challenge.asserter); - while (colosseum.isAbleToBisect(targetOutputIndex, challenger)) { + while (mockColosseum.isAbleToBisect(targetOutputIndex, challenger)) { _bisect(targetOutputIndex, challenger, _nextSender(challenge)); - challenge = colosseum.getChallenge(targetOutputIndex, challenger); + challenge = mockColosseum.getChallenge(targetOutputIndex, challenger); } vm.expectCall( @@ -1275,10 +1465,13 @@ contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { function test_challengerTimeout_callValidatorManager_succeeds() external { test_createChallenge_callValidatorManager_succeeds(); - Types.Challenge memory challenge = colosseum.getChallenge(targetOutputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge( + targetOutputIndex, + challenger + ); _bisect(targetOutputIndex, challenger, challenge.asserter); - challenge = colosseum.getChallenge(targetOutputIndex, challenger); + challenge = mockColosseum.getChallenge(targetOutputIndex, challenger); vm.warp(challenge.timeoutAt + 1); // check the challenger timeout diff --git a/packages/contracts/contracts/test/CommonTest.t.sol b/packages/contracts/contracts/test/CommonTest.t.sol index d86ba5c11..e9256162f 100644 --- a/packages/contracts/contracts/test/CommonTest.t.sol +++ b/packages/contracts/contracts/test/CommonTest.t.sol @@ -407,7 +407,7 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { } function _registerValidator(address validator, uint128 assets) internal { - vm.startPrank(validator); + vm.startPrank(validator, validator); assetToken.approve(address(assetMgr), uint256(assets)); valMgr.registerValidator(assets, 10, withdrawAcc); vm.stopPrank(); @@ -774,8 +774,7 @@ contract Colosseum_Initializer is Portal_Initializer { segmentsLengths.push(10); segmentsLengths.push(6); - Proxy proxy = new Proxy(multisig); - colosseum = Colosseum(payable(address(proxy))); + colosseum = Colosseum(payable(address(new Proxy(multisig)))); // Init L2OutputOracle after Colosseum contract deployment super.setUp(); @@ -803,9 +802,9 @@ contract Colosseum_Initializer is Portal_Initializer { _zkMerkleTrie: address(zkMerkleTrie) }); vm.prank(multisig); - proxy.upgradeToAndCall( + toProxy(address(colosseum)).upgradeToAndCall( address(colosseumImpl), - abi.encodeCall(Colosseum.initialize, (segmentsLengths)) + abi.encodeCall(Colosseum.initialize, segmentsLengths) ); } } diff --git a/packages/contracts/contracts/test/ValidatorManager.t.sol b/packages/contracts/contracts/test/ValidatorManager.t.sol index 346bad65b..b1183206a 100644 --- a/packages/contracts/contracts/test/ValidatorManager.t.sol +++ b/packages/contracts/contracts/test/ValidatorManager.t.sol @@ -198,7 +198,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { uint128 assets = minActivateAmount; uint8 commissionRate = 10; - vm.startPrank(trusted); + vm.startPrank(trusted, trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectEmit(true, false, false, true, address(valMgr)); emit ValidatorActivated(trusted, block.timestamp); @@ -223,7 +223,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { uint128 assets = minActivateAmount - 1; uint8 commissionRate = 10; - vm.startPrank(trusted); + vm.startPrank(trusted, trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectEmit(true, true, false, true, address(valMgr)); emit ValidatorRegistered(trusted, false, commissionRate, assets); @@ -235,12 +235,24 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { assertEq(valMgr.getWeight(trusted), 0); } + function test_registerValidator_fromContract_reverts() external { + vm.prank(address(oracle), address(oracle)); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.registerValidator(minActivateAmount, 10, withdrawAcc); + } + + function test_registerValidator_differentOrigin_reverts() external { + vm.prank(trusted, asserter); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.registerValidator(minActivateAmount, 10, withdrawAcc); + } + function test_registerValidator_alreadyInitiated_reverts() external { uint128 assets = minActivateAmount; _registerValidator(trusted, assets); - vm.startPrank(trusted); + vm.startPrank(trusted, trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); valMgr.registerValidator(assets, 10, withdrawAcc); @@ -249,7 +261,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { function test_registerValidator_smallAsset_reverts() external { uint128 assets = minRegisterAmount - 1; - vm.startPrank(trusted); + vm.startPrank(trusted, trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IValidatorManager.InsufficientAsset.selector); valMgr.registerValidator(assets, 10, withdrawAcc); @@ -258,7 +270,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { function test_registerValidator_largeCommissionRate_reverts() external { uint128 assets = minRegisterAmount; - vm.startPrank(trusted); + vm.startPrank(trusted, trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IValidatorManager.MaxCommissionRateExceeded.selector); valMgr.registerValidator(assets, 101, withdrawAcc); @@ -267,7 +279,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { function test_registerValidator_withdrawZeroAddr_reverts() external { uint128 assets = minRegisterAmount; - vm.startPrank(trusted); + vm.startPrank(trusted, trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IAssetManager.ZeroAddress.selector); valMgr.registerValidator(assets, 10, address(0));