1 tx
2 calls
constructor
constructor(address _protocolAdmin, address _shekelToken, address _shekelStakingContract, address _lockerFactory, address _cbBTCAddress, address deployer, uint256 initialCreationFee, uint256 initialStakingRequirement, uint256 initialPersonalFundCreationFee, uint256 initialPersonalFundStakingRequirement)
functions
getCbBTCAddress
viewfunction getCbBTCAddress() view returns (address)
getCreationFee
viewfunction getCreationFee() view returns (uint256)
getDeployer
viewfunction getDeployer() view returns (address)
getGlobalParams
viewfunction getGlobalParams() view returns (tuple)
getPersonalFundCreationFee
viewfunction getPersonalFundCreationFee() view returns (uint256)
getPersonalFundStakingRequirement
viewfunction getPersonalFundStakingRequirement() view returns (uint256)
getStakingRequirement
viewfunction getStakingRequirement() view returns (uint256)
isFundContract
viewfunction isFundContract(address contractAddress) view returns (bool)
owner
viewfunction owner() view returns (address)
createFund
nonpayablefunction createFund(uint256 fundraisingGoal, string name, string symbol, uint256 fundraisingDeadline, uint256 fundExpiry, address kosherManager, uint256 maxWhitelistAmount, uint256 maxPublicContributionAmount, bool isCbBTCFund, uint256 stakeRequiredPerContribution) returns (address)
createPersonalizedFunds
nonpayablefunction createPersonalizedFunds(bool isCbBTCFund, address aiWallet) returns (address)
renounceOwnership
nonpayablefunction renounceOwnership()
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updateCbBTCAddress
nonpayablefunction updateCbBTCAddress(address newCbBTCAddress)
updateCreationFee
nonpayablefunction updateCreationFee(uint256 newFee)
updateDeployer
nonpayablefunction updateDeployer(address newDeployer)
updateGlobalParams
nonpayablefunction updateGlobalParams(tuple newParams)
updateLockerFactory
nonpayablefunction updateLockerFactory(address newLockerFactory)
updatePersonalFundCreationFee
nonpayablefunction updatePersonalFundCreationFee(uint256 newFee)
updatePersonalFundStakingRequirement
nonpayablefunction updatePersonalFundStakingRequirement(uint256 newRequirement)
updateProtocolAdmin
nonpayablefunction updateProtocolAdmin(address newProtocolAdmin)
updateShekelStakingContract
nonpayablefunction updateShekelStakingContract(address newShekelStakingContract)
updateShekelToken
nonpayablefunction updateShekelToken(address newShekelToken)
updateStakingRequirement
nonpayablefunction updateStakingRequirement(uint256 newRequirement)
withdrawFees
nonpayablefunction withdrawFees()
events
CbBTCAddressUpdated
event CbBTCAddressUpdated(address newCbBTCAddress)
CreationFeeUpdated
event CreationFeeUpdated(uint256 oldFee, uint256 newFee)
DeployerUpdated
event DeployerUpdated(address oldDeployer, address newDeployer)
FundCreated
event FundCreated(address indexed fundAddress, string name, string symbol)
GlobalParamsUpdated
event GlobalParamsUpdated((address protocolAdmin, address shekelToken, address shekelStakingContract, address lockerFactory, address cbBTCAddress) newParams)
LockerFactoryUpdated
event LockerFactoryUpdated(address newLockerFactory)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PersonalFundCreated
event PersonalFundCreated(address indexed fundAddress, address indexed owner, bool isCbBTCFund)
PersonalFundCreationFeeUpdated
event PersonalFundCreationFeeUpdated(uint256 oldFee, uint256 newFee)
PersonalFundStakingRequirementUpdated
event PersonalFundStakingRequirementUpdated(uint256 oldRequirement, uint256 newRequirement)
ProtocolAdminUpdated
event ProtocolAdminUpdated(address newProtocolAdmin)
ShekelStakingContractUpdated
event ShekelStakingContractUpdated(address newShekelStakingContract)
ShekelTokenUpdated
event ShekelTokenUpdated(address newShekelToken)
StakingRequirementUpdated
event StakingRequirementUpdated(uint256 oldRequirement, uint256 newRequirement)
errors
DeploymentFailed
error DeploymentFailed()
FeeTransferFailed
error FeeTransferFailed()
FundAlreadyExists
error FundAlreadyExists()
InsufficientFee
error InsufficientFee()
InsufficientStake
error InsufficientStake()
InvalidAddress
error InvalidAddress()
InvalidDeadline
error InvalidDeadline()
InvalidFundExpiry
error InvalidFundExpiry()
InvalidFundraisingGoal
error InvalidFundraisingGoal()
InvalidStakeRequirement
error InvalidStakeRequirement()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
Unauthorized
error Unauthorized()
creation bytecode
0x608060405234801561001057600080fd5b5060405161627a38038061627a83398101604081905261002f91610264565b338061005557604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61005e816101f8565b50600180556001600160a01b038a1661008a5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0389166100b15760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0388166100d85760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0387166100ff5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101265760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03851661014d5760405163e6c4247b60e01b815260040160405180910390fd5b6040805160a0810182526001600160a01b039b8c168082529a8c1660208201819052998c16918101829052978b1660608901819052968b166080909801889052600280546001600160a01b0319908116909b179055600380548b16909917909855600480548a16909817909755600580548916909517909455600680548816909517909455600b80549096169190961617909355600793909355600892909255600955600a55610306565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811461025f57600080fd5b919050565b6000806000806000806000806000806101408b8d03121561028457600080fd5b61028d8b610248565b995061029b60208c01610248565b98506102a960408c01610248565b97506102b760608c01610248565b96506102c560808c01610248565b95506102d360a08c01610248565b60c08c015160e08d01516101008e0151610120909e01519c9f9b9e50999c989b979a919990989097909650945092505050565b615f65806103156000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80636fa23795116100de578063a20d837311610097578063ea264f7711610071578063ea264f77146103c4578063eb637b14146103d7578063f2d853ce146103ea578063f2fde38b146103fd57600080fd5b8063a20d8373146103a1578063c1d3be8b146103a9578063db07b68e146103bc57600080fd5b80636fa2379514610340578063715018a614610353578063718527101461035b578063726305311461036e5780638da5cb5b1461037f57806397871fa21461039057600080fd5b80634b25fb80116101305780634b25fb80146102265780634d413e7d1461023957806354eb31b21461024c578063644d466e1461025f57806365a7f0c0146102725780636b3222e61461027a57600080fd5b8063022fc40e146101785780630ceb1f671461018d57806318b07ca2146101ce5780633797389b146101e157806339d064a3146101f3578063476343ee1461021e575b600080fd5b61018b61018636600461126d565b610410565b005b6101b961019b36600461126d565b6001600160a01b03166000908152600c602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61018b6101dc36600461126d565b610494565b6009545b6040519081526020016101c5565b61020661020136600461134f565b610511565b6040516001600160a01b0390911681526020016101c5565b61018b61088f565b61018b61023436600461126d565b6109e9565b61018b61024736600461126d565b610a66565b61018b61025a36600461141b565b610af7565b61018b61026d36600461126d565b610b3d565b6008546101e5565b6102f16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526002546001600160a01b0390811682526003548116602083015260045481169282019290925260055482166060820152600654909116608082015290565b6040516101c5919081516001600160a01b039081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b61018b61034e36600461141b565b610bba565b61018b610c00565b61018b61036936600461141b565b610c14565b600b546001600160a01b0316610206565b6000546001600160a01b0316610206565b6006546001600160a01b0316610206565b600a546101e5565b61018b6103b736600461126d565b610c5a565b6007546101e5565b61018b6103d236600461141b565b610cd7565b6102066103e5366004611434565b610d1d565b61018b6103f836600461146d565b610ff5565b61018b61040b36600461126d565b611156565b610418611194565b6001600160a01b03811661043f5760405163e6c4247b60e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff557bdcdfe8b1184f10c6fe9ac7189955b6b8089703e203dfa50743216ade04a906020015b60405180910390a150565b61049c611194565b6001600160a01b0381166104c35760405163e6c4247b60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f9eede2b97f6e764caab5e2e33dfed38de6b083a3a863094daa0e868e3c6fae6b90602001610489565b600061051b6111c1565b8a60000361053c57604051632d47cb8f60e11b815260040160405180910390fd5b42881161055c57604051631da7447960e21b815260040160405180910390fd5b87871161057c57604051639ae7e6a760e01b815260040160405180910390fd5b8160000361059d5760405163c195a09760e01b815260040160405180910390fd5b6001600160a01b0386166105c45760405163e6c4247b60e01b815260040160405180910390fd5b600480546040516326d352ab60e11b815233928101929092526000916001600160a01b0390911690634da6a55690602401602060405180830381865afa158015610612573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106369190611488565b905060085481101561065b576040516378de4a6960e11b815260040160405180910390fd5b6003546007546040516323b872dd60e01b815233600482015230602482015260448101919091526000916001600160a01b0316906323b872dd906064016020604051808303816000875af11580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906114a1565b9050806106fb57604051634033e4e360e01b815260040160405180910390fd5b604080516101c0810182528e8152602081018e90528082018d9052606081018c9052608081018b90526001600160a01b03808b1660a083015260c082018a9052600254811660e08301526101008201899052871515610120830152610140820187905260035481166101608301526004548116610180830152600554166101a08201529051600090829061078e9061123b565b6107989190611504565b604051809103906000f0801580156107b4573d6000803e3d6000fd5b506001600160a01b0381166000908152600c602052604090205490915060ff16156107f25760405163065ddb1960e21b815260040160405180910390fd5b6001600c6000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550806001600160a01b03167faac40c8ecf116edb56b3915e304904e16086b229e0cc4d0db093edc816513c1d8f8f60405161086b929190611621565b60405180910390a2935050505061088160018055565b9a9950505050505050505050565b610897611194565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611488565b9050600081116109515760405162461bcd60e51b81526020600482015260136024820152724e6f206665657320746f20776974686472617760681b60448201526064015b60405180910390fd5b6003546001600160a01b031663a9059cbb6109746000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156109c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e591906114a1565b5050565b6109f1611194565b6001600160a01b038116610a185760405163e6c4247b60e01b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f85fd02827b52938b46618cf0daa3e7bb12d3d0685da78cbd4b7ca66edb6ce92890602001610489565b610a6e611194565b6001600160a01b038116610a955760405163e6c4247b60e01b815260040160405180910390fd5b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f4590909f6ea280ffff8f32337577f35ec6cbec73ab17ad9723c587bf0af57d6691015b60405180910390a15050565b610aff611194565b600880549082905560408051828152602081018490527f0c3453b502a059562b2bb38e06ab018bf9990d0ae002b05c34a5ba2d0cd539e79101610aeb565b610b45611194565b6001600160a01b038116610b6c5760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fcf408869205d9189df3f690f4cdd2c44ff53a360bbe7a26fe9f9cc890edbc7ed90602001610489565b610bc2611194565b600780549082905560408051828152602081018490527f5de302eeb1c80d4fb0c0953b692353f09ddf431411b8eb2034d5e857695619129101610aeb565b610c08611194565b610c1260006111eb565b565b610c1c611194565b600a80549082905560408051828152602081018490527ffc92e0edf16d7033d8d2906b76f3d270faa613855852c9e547318fd65cbe500d9101610aeb565b610c62611194565b6001600160a01b038116610c895760405163e6c4247b60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f1af81a401acf01a36af32532151690df1252f468decdeb32a9252e7e15d0a30f90602001610489565b610cdf611194565b600980549082905560408051828152602081018490527f89aa4e952160c521708c0f3e6f9264bb26645ef6c8914952ad0ff5531de78a189101610aeb565b6000610d276111c1565b6001600160a01b038216610d4e5760405163e6c4247b60e01b815260040160405180910390fd5b600480546040516326d352ab60e11b815233928101929092526000916001600160a01b0390911690634da6a55690602401602060405180830381865afa158015610d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc09190611488565b9050600a54811015610de5576040516378de4a6960e11b815260040160405180910390fd5b6003546009546040516323b872dd60e01b815233600482015230602482015260448101919091526000916001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6591906114a1565b905080610e8557604051634033e4e360e01b815260040160405180910390fd5b600b546002546006546040516361a16fb360e11b81523360048201526001600160a01b039283166024820152881515604482015287831660648201529082166084820152600092919091169063c342df669060a4016020604051808303816000875af1158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061164f565b90506001600160a01b038116610f4657604051633011642560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600c602052604090205460ff1615610f805760405163065ddb1960e21b815260040160405180910390fd5b6001600160a01b0381166000818152600c602052604090819020805460ff19166001179055513391907f3e610b94d8de02093025e922cd925a9bea9541f9a26f8ab80cf72a906ae65d2590610fda908a1515815260200190565b60405180910390a392505050610fef60018055565b92915050565b610ffd611194565b600061100c602083018361126d565b6001600160a01b0316036110335760405163e6c4247b60e01b815260040160405180910390fd5b6000611045604083016020840161126d565b6001600160a01b03160361106c5760405163e6c4247b60e01b815260040160405180910390fd5b600061107e606083016040840161126d565b6001600160a01b0316036110a55760405163e6c4247b60e01b815260040160405180910390fd5b60006110b7608083016060840161126d565b6001600160a01b0316036110de5760405163e6c4247b60e01b815260040160405180910390fd5b60006110f060a083016080840161126d565b6001600160a01b0316036111175760405163e6c4247b60e01b815260040160405180910390fd5b806002611124828261168c565b9050507fa7763c7b78f2d0fe8fa5dc853b07ffa5263a46325575b2d4a36359cfc82cee23816040516104899190611716565b61115e611194565b6001600160a01b03811661118857604051631e4fbdf760e01b815260006004820152602401610948565b611191816111eb565b50565b6000546001600160a01b03163314610c125760405163118cdaa760e01b8152336004820152602401610948565b6002600154036111e457604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b614785806117ab83390190565b6001600160a01b038116811461119157600080fd5b803561126881611248565b919050565b60006020828403121561127f57600080fd5b813561128a81611248565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126112b857600080fd5b813567ffffffffffffffff8111156112d2576112d2611291565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561130157611301611291565b60405281815283820160200185101561131957600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461119157600080fd5b803561126881611336565b6000806000806000806000806000806101408b8d03121561136f57600080fd5b8a35995060208b013567ffffffffffffffff81111561138d57600080fd5b6113998d828e016112a7565b99505060408b013567ffffffffffffffff8111156113b657600080fd5b6113c28d828e016112a7565b98505060608b0135965060808b013595506113df60a08c0161125d565b945060c08b0135935060e08b013592506113fc6101008c01611344565b915060006101208c01359050809150509295989b9194979a5092959850565b60006020828403121561142d57600080fd5b5035919050565b6000806040838503121561144757600080fd5b823561145281611336565b9150602083013561146281611248565b809150509250929050565b600060a082840312801561148057600080fd5b509092915050565b60006020828403121561149a57600080fd5b5051919050565b6000602082840312156114b357600080fd5b815161128a81611336565b6000815180845260005b818110156114e4576020818501810151868301820152016114c8565b506000602082860101526020601f19601f83011685010191505092915050565b6020815281516020820152600060208301516101c0604084015261152c6101e08401826114be565b90506040840151601f1984830301606085015261154982826114be565b91505060608401516080840152608084015160a084015260a084015161157a60c08501826001600160a01b03169052565b5060c084015160e084015260e08401516115a06101008501826001600160a01b03169052565b506101008401516101208401526101208401516115c261014085018215159052565b506101408401516101608401526101608401516115eb6101808501826001600160a01b03169052565b506101808401516001600160a01b0381166101a0850152506101a08401516001600160a01b0381166101c0850152509392505050565b60408152600061163460408301856114be565b828103602084015261164681856114be565b95945050505050565b60006020828403121561166157600080fd5b815161128a81611248565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561169781611248565b6116a1818361166c565b5060208201356116b081611248565b6116bd816001840161166c565b5060408201356116cc81611248565b6116d9816002840161166c565b5060608201356116e881611248565b6116f5816003840161166c565b50608082013561170481611248565b611711816004840161166c565b505050565b60a08101823561172581611248565b6001600160a01b03168252602083013561173e81611248565b6001600160a01b03166020830152604083013561175a81611248565b6001600160a01b03166040830152606083013561177681611248565b6001600160a01b03166060830152608083013561179281611248565b6001600160a01b03166080929092019190915291905056fe6101a060405262127500608052683635c9adc5dea0000060a05261271060c0526a52b7d2dcc80cd2e400000060e0526b033b2e3c9fd0803ce8000000610100526002805460ff60a01b1916604b60a01b17905534801561005e57600080fd5b5060405161478538038061478583398101604081905261007d916105f1565b60a08101516001600160a01b0381166100b057604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100b981610481565b506001805580516000036100e057604051632d47cb8f60e11b815260040160405180910390fd5b4281606001511161010457604051631da7447960e21b815260040160405180910390fd5b806060015181608001511161012c576040516302a0464f60e51b815260040160405180910390fd5b8061014001516000036101525760405163c195a09760e01b815260040160405180910390fd5b6101608101516001600160a01b031661017e5760405163e6c4247b60e01b815260040160405180910390fd5b6101808101516001600160a01b03166101aa5760405163e6c4247b60e01b815260040160405180910390fd5b6101a08101516001600160a01b03166101d65760405163e6c4247b60e01b815260040160405180910390fd5b610160808201516001600160a01b03908116610120526101808301518116610140526101a0830151169052602081015160119061021390826107c1565b50604081015160129061022690826107c1565b5080516005556060810151600755608081015160085560c0810151600a5560e0810151600380546001600160a01b0319166001600160a01b03909216919091179055610100810151600b55610120810151600d805460ff60a01b1916600160a01b92151583021790819055610140830151600c55336101805260ff91900416156102d157600280546001600160a01b03191673cbb7c0000ab88b473b1f5afd9ef808440eed33bf1790555b61016081015160035460085460405163fddaec4960e01b81526001600160a01b0393841660048201529290911660248301526044820152735ec25b96e14a050317d695ec44cde76c410c6b429063fddaec49906064016020604051808303816000875af1158015610346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036a919061087f565b600f80546001600160a01b0319166001600160a01b039290921691821790556040519081527f4d034e7999b73c980126bf84dde16d9a4c8432586a8e50e56c93bb965f4b974b9060200160405180910390a160e081015160c082015160a0830151604051631b36797d60e31b81526001600160a01b0393841660048201526024810192909252919091166044820152735ec25b96e14a050317d695ec44cde76c410c6b429063d9b3cbe8906064016020604051808303816000875af1158015610437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045b919061087f565b601080546001600160a01b0319166001600160a01b0392909216919091179055506108a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b6040516101c081016001600160401b038111828210171561050a5761050a6104d1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610538576105386104d1565b604052919050565b600082601f83011261055157600080fd5b81516001600160401b0381111561056a5761056a6104d1565b61057d601f8201601f1916602001610510565b81815284602083860101111561059257600080fd5b60005b828110156105b157602081860181015183830182015201610595565b506000918101602001919091529392505050565b80516001600160a01b03811681146105dc57600080fd5b919050565b805180151581146105dc57600080fd5b60006020828403121561060357600080fd5b81516001600160401b0381111561061957600080fd5b82016101c0818503121561062c57600080fd5b6106346104e7565b8151815260208201516001600160401b0381111561065157600080fd5b61065d86828501610540565b60208301525060408201516001600160401b0381111561067c57600080fd5b61068886828501610540565b60408301525060608281015190820152608080830151908201526106ae60a083016105c5565b60a082015260c082810151908201526106c960e083016105c5565b60e082015261010082810151908201526106e661012083016105e1565b610120820152610140828101519082015261070461016083016105c5565b61016082015261071761018083016105c5565b61018082015261072a6101a083016105c5565b6101a0820152949350505050565b600181811c9082168061074c57607f821691505b60208210810361076c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156107bc57806000526020600020601f840160051c810160208510156107995750805b601f840160051c820191505b818110156107b957600081556001016107a5565b50505b505050565b81516001600160401b038111156107da576107da6104d1565b6107ee816107e88454610738565b84610772565b6020601f821160018114610822576000831561080a5750848201515b600019600385901b1c1916600184901b1784556107b9565b600084815260208120601f198516915b828110156108525787850151825560209485019460019092019101610832565b50848210156108705786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561089157600080fd5b61089a826105c5565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051613e2e610957600039600081816106bb015261132a01526000612cd201526000611293015260008181611885015281816118d601528181611f2c01528181611fb801528181612663015281816129ed0152612b1d0152600081816116c601526127350152600081816126b60152612b82015260008181612a180152612b46015260006128de015260006128b80152613e2e6000f3fe6080604052600436106102555760003560e01c806375d8d68d11610139578063c1cbbca7116100b6578063d1e56e541161007a578063d1e56e541461071b578063d962904914610730578063ed3655eb1461074e578063f0c5d5491461076c578063f2fde38b14610781578063f4758686146107a157600080fd5b8063c1cbbca714610681578063c2b7d79f14610694578063c45a0155146106a9578063c6e5546c146106dd578063d07f8482146106fd57600080fd5b8063947fe812116100fd578063947fe8121461060257806395d89b41146106225780639f55029314610637578063bb2e37e51461064c578063c0b822d51461066157600080fd5b806375d8d68d1461056f5780638153f8f81461058457806383694cf0146105a457806384d4875e146105c45780638da5cb5b146105e457600080fd5b80633f2ff8bd116101d2578063590e1ae311610196578063590e1ae3146104d357806364e9a9b6146104e857806366a10368146104fd578063715018a61461051b57806372e041a01461053057806374c515ae1461055057600080fd5b80633f2ff8bd1461041e578063421aef3714610445578063541d45e71461047357806356e1b2cf1461048857806357fbcda51461049d57600080fd5b80632109db59116102195780632109db591461038a57806327c5425c146103aa5780632b517d21146103c95780632ea44681146103de5780633a008606146103fe57600080fd5b806306fdde031461029f578063150b7a02146102ca5780631aadcf461461030f5780631af1a502146103415780631b8df5861461036157600080fd5b3661029a57600654610100900460ff16158015610273575060075442105b80156102895750600d54600160a01b900460ff16155b156102985761029860006107b9565b005b600080fd5b3480156102ab57600080fd5b506102b4610b73565b6040516102c191906132b3565b60405180910390f35b3480156102d657600080fd5b506102f66102e53660046132db565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102c1565b34801561031b57600080fd5b50600f546001600160a01b03165b6040516001600160a01b0390911681526020016102c1565b34801561034d57600080fd5b5061029861035c36600461337c565b610c01565b34801561036d57600080fd5b50600654610100900460ff165b60405190151581526020016102c1565b34801561039657600080fd5b506102986103a536600461337c565b610cca565b3480156103b657600080fd5b50600d54600160a01b900460ff1661037a565b3480156103d557600080fd5b50610298610d9f565b3480156103ea57600080fd5b506102986103f936600461337c565b610e4b565b34801561040a57600080fd5b5061029861041936600461337c565b610f12565b34801561042a57600080fd5b50735ec25b96e14a050317d695ec44cde76c410c6b42610329565b34801561045157600080fd5b50610465610460366004613395565b6111c1565b6040519081526020016102c1565b34801561047f57600080fd5b50600854610465565b34801561049457600080fd5b50610298611328565b3480156104a957600080fd5b506104656104b8366004613395565b6001600160a01b031660009081526016602052604090205490565b3480156104df57600080fd5b5061029861153d565b3480156104f457600080fd5b50600754610465565b34801561050957600080fd5b50600d546001600160a01b0316610329565b34801561052757600080fd5b5061029861164a565b34801561053c57600080fd5b5061029861054b3660046133c1565b61165c565b34801561055c57600080fd5b50601054600160a01b900460ff1661037a565b34801561057b57600080fd5b5061029861174f565b34801561059057600080fd5b5061029861059f36600461337c565b6117d8565b3480156105b057600080fd5b506102986105bf36600461337c565b61183f565b3480156105d057600080fd5b506102986105df36600461337c565b6119ad565b3480156105f057600080fd5b506000546001600160a01b0316610329565b34801561060e57600080fd5b5061029861061d36600461344e565b6119f6565b34801561062e57600080fd5b506102b4611b9c565b34801561064357600080fd5b50600454610465565b34801561065857600080fd5b50610298611ba9565b34801561066d57600080fd5b5061029861067c36600461337c565b61207e565b61029861068f36600461337c565b6107b9565b3480156106a057600080fd5b50600554610465565b3480156106b557600080fd5b506103297f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e957600080fd5b506102986106f83660046134f4565b6121fc565b34801561070957600080fd5b506009546001600160a01b0316610329565b34801561072757600080fd5b50600c54610465565b34801561073c57600080fd5b506010546001600160a01b0316610329565b34801561075a57600080fd5b50600e546001600160a01b0316610329565b34801561077857600080fd5b50600b54610465565b34801561078d57600080fd5b5061029861079c366004613395565b612384565b3480156107ad57600080fd5b5060065460ff1661037a565b6107c16123bf565b600654610100900460ff16156107ea57604051631df969b760e01b815260040160405180910390fd5b600754421061080c5760405163e478792360e01b815260040160405180910390fd5b600d54600090600160a01b900460ff161561088057341561083f576040516248c6b960e61b815260040160405180910390fd5b816000036108605760405163244d19c360e21b815260040160405180910390fd5b50600254819061087b906001600160a01b03163330846123e9565b6108c3565b346000036108a15760405163652122d960e01b815260040160405180910390fd5b81156108c05760405163652122d960e01b815260040160405180910390fd5b50345b600a541561099657601054604051633af32abf60e01b81523360048201526001600160a01b0390911690633af32abf90602401602060405180830381865afa158015610913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109379190613516565b61095457604051630b094f2760e31b815260040160405180910390fd5b600a543360009081526016602052604090205461097290839061354e565b11156109915760405163a6bd512160e01b815260040160405180910390fd5b6109e2565b60006109a1336111c1565b3360009081526016602052604090205490915081906109c190849061354e565b11156109e05760405163613abeb360e11b815260040160405180910390fd5b505b6005546004548291906109f690839061354e565b1115610a7f57600454600554610a0c9190613561565b600d54909150600160a01b900460ff1615610a4757610a4233610a2f8385613561565b6002546001600160a01b03169190612456565b610a7f565b336108fc610a558385613561565b6040518115909202916000818181858888f19350505050158015610a7d573d6000803e3d6000fd5b505b336000908152601660205260408120549003610ad857601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b031916331790555b3360009081526016602052604081208054839290610af790849061354e565b925050819055508060046000828254610b10919061354e565b909155505060405181815233907f4d154d4aae216bed6d0926db77c00df2b57c6b5ba4eee05775de20facede3a7b9060200160405180910390a260055460045403610b65576006805461ff0019166101001790555b5050610b7060018055565b50565b60118054610b8090613574565b80601f0160208091040260200160405190810160405280929190818152602001828054610bac90613574565b8015610bf95780601f10610bce57610100808354040283529160200191610bf9565b820191906000526020600020905b815481529060010190602001808311610bdc57829003601f168201915b505050505081565b610c0961248c565b6008548111610c2b57604051639ae7e6a760e01b815260040160405180910390fd5b6008819055600d54604051630d78d28160e11b8152600481018390526001600160a01b0390911690631af1a50290602401600060405180830381600087803b158015610c7657600080fd5b505af1158015610c8a573d6000803e3d6000fd5b505050507f4e5dd36969507fae1e69607cd3b2492dafc0c3ae1bf1c50f921a5642847fa30981604051610cbf91815260200190565b60405180910390a150565b6000546001600160a01b03163314801590610cf057506003546001600160a01b03163314155b15610d0e5760405163ea8e4eb560e01b815260040160405180910390fd5b600654610100900460ff1615610d3757604051631df969b760e01b815260040160405180910390fd5b6007548111610d595760405163d71c2da560e01b815260040160405180910390fd5b600780549082905560408051828152602081018490527fcf8355056cd2d0cfbb80a34af77420d1e6eceacc85186e561d75a1a210179a9191015b60405180910390a15050565b610da76123bf565b610daf61248c565b600f546001600160a01b0316610dd85760405163a86ab33d60e01b815260040160405180910390fd5b600f60009054906101000a90046001600160a01b03166001600160a01b031663a69df4b56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e2857600080fd5b505af1158015610e3c573d6000803e3d6000fd5b50505050610e4960018055565b565b610e5361248c565b60065460ff1615610e7757604051631c6cb8d360e21b815260040160405180910390fd5b80600003610e9857604051632d47cb8f60e11b815260040160405180910390fd5b600454811015610ebb5760405163447f926160e01b815260040160405180910390fd5b60058054908290556004546006805461ff0019169184146101000291909117905560408051828152602081018490527f961c8b414cced5fba2600265359474975f844fcadb7ee9d50f7f9d19ff1711ea9101610d93565b610f1a6123bf565b600854421015610f3d5760405163f6bc0a2960e01b815260040160405180910390fd5b80600003610f5e57604051636c8dbc8560e01b815260040160405180910390fd5b6009546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd99190613516565b50600954604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104891906135ae565b6040516370a0823160e01b815230600482015290915060009073cbb7c0000ab88b473b1f5afd9ef808440eed33bf906370a0823190602401602060405180830381865afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c191906135ae565b90506000826110d083866135c7565b6110da91906135f4565b9050806000036110fd5760405163136cc93360e11b815260040160405180910390fd5b60405163a9059cbb60e01b81523360048201526024810182905273cbb7c0000ab88b473b1f5afd9ef808440eed33bf9063a9059cbb906044016020604051808303816000875af1158015611155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111799190613516565b50604080518581526020810183905233917f14a63150777b38b4fc5ed9116132ab2a2bc8357bbbc698378fd605b9eaa65907910160405180910390a2505050610b7060018055565b600a546000901561127157601054604051633af32abf60e01b81526001600160a01b03848116600483015290911690633af32abf90602401602060405180830381865afa158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a9190613516565b61124557600061126b565b6001600160a01b038216600090815260166020526040902054600a5461126b9190613561565b92915050565b6040516326d352ab60e11b81526001600160a01b0383811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690634da6a55690602401602060405180830381865afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130091906135ae565b90506000600c548261131291906135f4565b905061132081600b546124b9565b949350505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113aa9190613626565b6001600160a01b0316336001600160a01b0316146113db5760405163ea8e4eb560e01b815260040160405180910390fd5b60065460ff16156113ff5760405163475a253560e01b815260040160405180910390fd5b600d54600160a01b900460ff16156114a3576002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561145a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147e91906135ae565b90508015610b7057600354600254610b70916001600160a01b03918216911683612456565b6003546040516000916001600160a01b03169047908381818185875af1925050503d80600081146114f0576040519150601f19603f3d011682016040523d82523d6000602084013e6114f5565b606091505b5050905080610b705760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064015b60405180910390fd5b6115456123bf565b600654610100900460ff161561156e57604051630b4d698160e01b815260040160405180910390fd5b600754421161159057604051630b4d698160e01b815260040160405180910390fd5b3360009081526016602052604081205490036115bf576040516307e3a5c760e01b815260040160405180910390fd5b3360009081526016602052604081208054919055600d54600160a01b900460ff1615611601576002546115fc906001600160a01b03163383612456565b61160b565b61160b33826124cc565b60405181815233907fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d9060200160405180910390a250610e4960018055565b61165261248c565b610e49600061256a565b61166461248c565b600654610100900460ff1661168c576040516378c754c960e01b815260040160405180910390fd5b60065460ff16156116b05760405163475a253560e01b815260040160405180910390fd5b60006116bb826125ba565b6004549091506116f37f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a76400006135c7565b6116fd91906135f4565b6015556117098161280f565b6117148185856129c0565b604051600181527fe64f408051437053caebc2ec8b10a45148f5acee3a6922908871b997f80d335d906020015b60405180910390a150505050565b6117576123bf565b61175f61248c565b600f546001600160a01b03166117885760405163a86ab33d60e01b815260040160405180910390fd5b600f60009054906101000a90046001600160a01b03166001600160a01b031663c4c77bda6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e2857600080fd5b6117e061248c565b806000036118015760405163c195a09760e01b815260040160405180910390fd5b600c80549082905560408051828152602081018490527f290cd4e7df75ba05266ada6bd18ad0cf12aa3ff31e30c6af92166d26c27e267e9101610d93565b6118476123bf565b61184f61248c565b600f546001600160a01b03166118785760405163a86ab33d60e01b815260040160405180910390fd5b6118ad6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846123e9565b600f5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119459190613516565b50600f5460405163083694cf60e41b8152600481018390526001600160a01b03909116906383694cf090602401600060405180830381600087803b15801561198c57600080fd5b505af11580156119a0573d6000803e3d6000fd5b50505050610b7060018055565b6000546001600160a01b031633148015906119d357506003546001600160a01b03163314155b156119f15760405163ea8e4eb560e01b815260040160405180910390fd5b600b55565b6119fe61248c565b60065460ff16611a2157604051633e79acbd60e11b815260040160405180910390fd5b8483141580611a305750828114155b15611a4e57604051636ed7379360e11b815260040160405180910390fd5b60005b85811015611b93576000878783818110611a6d57611a6d613643565b9050602002016020810190611a829190613395565b6001600160a01b031603611aa95760405163e6c4247b60e01b815260040160405180910390fd5b6000878783818110611abd57611abd613643565b9050602002016020810190611ad29190613395565b6001600160a01b0316848484818110611aed57611aed613643565b90506020020135878785818110611b0657611b06613643565b9050602002810190611b189190613659565b604051611b269291906136a0565b60006040518083038185875af1925050503d8060008114611b63576040519150601f19603f3d011682016040523d82523d6000602084013e611b68565b606091505b5050905080611b8a57604051632b3f6d1160e21b815260040160405180910390fd5b50600101611a51565b50505050505050565b60128054610b8090613574565b611bb16123bf565b611bb961248c565b600854421015611bdc576040516360c1868d60e01b815260040160405180910390fd5b601054600160a01b900460ff1615611c07576040516356968a7d60e11b815260040160405180910390fd5b600d54604051632614965760e21b81527303a520b32c04bf3beef7beb72e919cf822ed34f160048201526000916001600160a01b031690639852595c90602401602060405180830381865afa158015611c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8891906135ae565b9050600d60009054906101000a90046001600160a01b03166001600160a01b03166386d1a69f6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611cda57600080fd5b505af1158015611cee573d6000803e3d6000fd5b505060405163133f757160e31b815260048101849052600092507303a520b32c04bf3beef7beb72e919cf822ed34f191506399fbab889060240161018060405180830381865afa158015611d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6a91906136e5565b50506040805160a0810182528d81526001600160801b038086166020830190815260008385018181526060850182815242608087019081529651630624e65f60e11b815295516004870152925190931660248501529151604484015251606483015291516084820152939b5099508998507303a520b32c04bf3beef7beb72e919cf822ed34f19750630c49ccbe96505060a49091019350611e0a92505050565b60408051808303816000875af1158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4c91906137c7565b6040805160808101825287815230602082019081526001600160801b0382840181815260608401828152945163fc6f786560e01b81529351600485015291516001600160a01b031660248401529051811660448301529151909116606482015291935091507303a520b32c04bf3beef7beb72e919cf822ed34f19063fc6f78659060840160408051808303816000875af1158015611eee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1291906137c7565b50506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9f91906135ae565b604051630852cd8d60e31b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561200457600080fd5b505af1158015612018573d6000803e3d6000fd5b50506010805460ff60a01b1916600160a01b179055505060408051868152602081018590529081018390527fdf0c1a545ab645f93aa68abd4aa321caaf9091cc92b18e72bd3d385cbaba62719060600160405180910390a15050505050610e4960018055565b6120866123bf565b61208e61248c565b60065460ff166120b157604051633e79acbd60e11b815260040160405180910390fd5b806000036120d25760405163652122d960e01b815260040160405180910390fd5b600e5460405163095ea7b360e01b81526001600160a01b0390911660048201526024810182905273cbb7c0000ab88b473b1f5afd9ef808440eed33bf9063095ea7b3906044016020604051808303816000875af1158015612137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215b9190613516565b50600e54604051633243c79160e01b8152600481018390526001600160a01b0390911690633243c79190602401600060405180830381600087803b1580156121a257600080fd5b505af11580156121b6573d6000803e3d6000fd5b505050507f918fcd597d13a672fda40edda9e86974522c0ddc44dc9668870a37d8e9456a0e816040516121eb91815260200190565b60405180910390a1610b7060018055565b6122046123bf565b60065460ff1661222757604051633e79acbd60e11b815260040160405180910390fd5b60155460000361224a5760405163438fb48f60e11b815260040160405180910390fd5b601354821061226c576040516392c4425960e01b815260040160405180910390fd5b60135481111561227b57506013545b80821061229b576040516392f1b43560e01b815260040160405180910390fd5b6009546001600160a01b0316825b82811015612375576000601382815481106122c6576122c6613643565b60009182526020808320909101546001600160a01b0316808352601490915260409091205490915060ff1661236c576015546001600160a01b0382166000908152601660205260408120549091670de0b6b3a76400009161232791906135c7565b61233191906135f4565b90506123476001600160a01b0385168383612456565b506001600160a01b0381166000908152601460205260409020805460ff191660011790555b506001016122a9565b505061238060018055565b5050565b61238c61248c565b6001600160a01b0381166123b657604051631e4fbdf760e01b815260006004820152602401611534565b610b708161256a565b6002600154036123e257604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6040516001600160a01b0384811660248301528381166044830152606482018390526124509186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612ecc565b50505050565b6040516001600160a01b0383811660248301526044820183905261248791859182169063a9059cbb9060640161241e565b505050565b6000546001600160a01b03163314610e495760405163118cdaa760e01b8152336004820152602401611534565b60008282188284100282185b9392505050565b804710156124f65760405163cf47918160e01b815247600482015260248101829052604401611534565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612543576040519150601f19603f3d011682016040523d82523d6000602084013e612548565b606091505b50509050806124875760405163d6bda27560e01b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405163bef8de1f60e01b81526000908190735ec25b96e14a050317d695ec44cde76c410c6b429063bef8de1f906125fc90601190601290889060040161388e565b6020604051808303816000875af115801561261b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263f9190613626565b600980546001600160a01b0319166001600160a01b038381169182179092559192507f000000000000000000000000000000000000000000000000000000000000000016116126a157604051631b97c67d60e21b815260040160405180910390fd5b6040516340c10f1960e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000602482015281906001600160a01b038216906340c10f1990604401600060405180830381600087803b15801561270a57600080fd5b505af115801561271e573d6000803e3d6000fd5b50506040516340c10f1960e01b81523060048201527f000000000000000000000000000000000000000000000000000000000000000060248201526001600160a01b03841692506340c10f199150604401600060405180830381600087803b15801561278957600080fd5b505af115801561279d573d6000803e3d6000fd5b50506006805460ff191660011790555050604080516338a80c5360e11b815290516001600160a01b0383169163715018a691600480830192600092919082900301818387803b1580156127ef57600080fd5b505af1158015612803573d6000803e3d6000fd5b50939695505050505050565b6000735ec25b96e14a050317d695ec44cde76c410c6b426001600160a01b031663aded63bb6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128899190613626565b604080516001600160a01b038516602482015273cbb7c0000ab88b473b1f5afd9ef808440eed33bf60448201527f000000000000000000000000000000000000000000000000000000000000000060648201527f00000000000000000000000000000000000000000000000000000000000000006084808301919091528251808303909101815260a490910182526020810180516001600160e01b031663eb990c5960e01b1790529051919250906000908390839061294790613260565b6129529291906138c4565b604051809103906000f08015801561296e573d6000803e3d6000fd5b50600e80546001600160a01b0319166001600160a01b0383169081179091556040519081529091507faf264c47e57edc70c48b9909cc631216bca721afc6cc9b5a3c1489731b1523b490602001611741565b60006129ce8360020b612f3d565b60405163a167129560e01b81526001600160a01b0380871660048301527f000000000000000000000000000000000000000000000000000000000000000016602482015262ffffff7f00000000000000000000000000000000000000000000000000000000000000001660448201529091506000907333128a8fc17869897dce68ed026d694621f6fdfd9063a1671295906064016020604051808303816000875af1158015612a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa59190613626565b60405163f637731d60e01b81526001600160a01b0384811660048301529192509082169063f637731d90602401600060405180830381600087803b158015612aec57600080fd5b505af1158015612b00573d6000803e3d6000fd5b505060408051610160810182526001600160a01b038981168083527f000000000000000000000000000000000000000000000000000000000000000090911660208301527f000000000000000000000000000000000000000000000000000000000000000062ffffff1682840152600289810b606084015288900b60808301527f000000000000000000000000000000000000000000000000000000000000000060a08301819052600060c0840181905260e084018190526101008401523061012084015242610140840152925163095ea7b360e01b81527303a520b32c04bf3beef7beb72e919cf822ed34f160048201526024810193909352909350915063095ea7b3906044016020604051808303816000875af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b9190613516565b50604051634418b22b60e11b81526000907303a520b32c04bf3beef7beb72e919cf822ed34f190638831645690612c869085906004016138e8565b6080604051808303816000875af1158015612ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc991906139ac565b505050905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166376b5c47d7303a520b32c04bf3beef7beb72e919cf822ed34f1612d266000546001600160a01b031690565b6008546002546040516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909216602484015267ffffffffffffffff1660448301526064820186905260ff600160a01b9091041660848201523060a482015260c4016020604051808303816000875af1158015612da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcb9190613626565b604051632142170760e11b81523060048201526001600160a01b0382166024820152604481018490529091507303a520b32c04bf3beef7beb72e919cf822ed34f1906342842e0e90606401600060405180830381600087803b158015612e3057600080fd5b505af1158015612e44573d6000803e3d6000fd5b50506040516367a4d1c360e01b8152600481018590526001600160a01b03841692506367a4d1c39150602401600060405180830381600087803b158015612e8a57600080fd5b505af1158015612e9e573d6000803e3d6000fd5b5050600d80546001600160a01b0319166001600160a01b039490941693909317909255505050505050505050565b600080602060008451602086016000885af180612eef576040513d6000823e3d81fd5b50506000513d91508115612f07578060011415612f14565b6001600160a01b0384163b155b1561245057604051635274afe760e01b81526001600160a01b0385166004820152602401611534565b60008060008360020b12612f54578260020b612f5c565b8260020b6000035b9050620d89e8811115612f82576040516315e4079d60e11b815260040160405180910390fd5b600081600116600003612f9957600160801b612fab565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612fdf576ffff97272373d413259a46990580e213a0260801c5b6004821615612ffe576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561301d576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b601082161561303c576fffcb9843d60f6159c9db58835c9266440260801c5b602082161561305b576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561307a576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615613099576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156130b9576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156130d9576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156130f9576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615613119576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613139576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613159576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613179576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613199576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156131ba576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156131da576e5d6af8dedb81196699c329225ee6040260801c5b620400008216156131f9576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615613216576b048a170391f7dc42444e8fa20260801c5b60008460020b1315613237578060001981613233576132336135de565b0490505b64010000000081061561324b57600161324e565b60005b60ff16602082901c0192505050919050565b610410806139e983390190565b6000815180845260005b8181101561329357602081850181015186830182015201613277565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006124c5602083018461326d565b6001600160a01b0381168114610b7057600080fd5b6000806000806000608086880312156132f357600080fd5b85356132fe816132c6565b9450602086013561330e816132c6565b935060408601359250606086013567ffffffffffffffff81111561333157600080fd5b8601601f8101881361334257600080fd5b803567ffffffffffffffff81111561335957600080fd5b88602082840101111561336b57600080fd5b959894975092955050506020019190565b60006020828403121561338e57600080fd5b5035919050565b6000602082840312156133a757600080fd5b81356124c5816132c6565b8060020b8114610b7057600080fd5b6000806000606084860312156133d657600080fd5b83356133e1816133b2565b925060208401356133f1816133b2565b929592945050506040919091013590565b60008083601f84011261341457600080fd5b50813567ffffffffffffffff81111561342c57600080fd5b6020830191508360208260051b850101111561344757600080fd5b9250929050565b6000806000806000806060878903121561346757600080fd5b863567ffffffffffffffff81111561347e57600080fd5b61348a89828a01613402565b909750955050602087013567ffffffffffffffff8111156134aa57600080fd5b6134b689828a01613402565b909550935050604087013567ffffffffffffffff8111156134d657600080fd5b6134e289828a01613402565b979a9699509497509295939492505050565b6000806040838503121561350757600080fd5b50508035926020909101359150565b60006020828403121561352857600080fd5b815180151581146124c557600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561126b5761126b613538565b8181038181111561126b5761126b613538565b600181811c9082168061358857607f821691505b6020821081036135a857634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156135c057600080fd5b5051919050565b808202811582820484141761126b5761126b613538565b634e487b7160e01b600052601260045260246000fd5b60008261361157634e487b7160e01b600052601260045260246000fd5b500490565b8051613621816132c6565b919050565b60006020828403121561363857600080fd5b81516124c5816132c6565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261367057600080fd5b83018035915067ffffffffffffffff82111561368b57600080fd5b60200191503681900382131561344757600080fd5b8183823760009101908152919050565b805162ffffff8116811461362157600080fd5b8051613621816133b2565b80516001600160801b038116811461362157600080fd5b6000806000806000806000806000806000806101808d8f03121561370857600080fd5b8c516bffffffffffffffffffffffff8116811461372457600080fd5b9b5061373260208e01613616565b9a5061374060408e01613616565b995061374e60608e01613616565b985061375c60808e016136b0565b975061376a60a08e016136c3565b965061377860c08e016136c3565b955061378660e08e016136ce565b6101008e01516101208f0151919650945092506137a66101408e016136ce565b91506137b56101608e016136ce565b90509295989b509295989b509295989b565b600080604083850312156137da57600080fd5b505080516020909101519092909150565b8054600090600181811c9082168061380457607f821691505b60208210810361382457634e487b7160e01b600052602260045260246000fd5b8186526020860181801561383f576001811461385557613883565b60ff198516825283151560051b82019550613883565b60008781526020902060005b8581101561387d57815484820152600190910190602001613861565b83019650505b505050505092915050565b6060815260006138a160608301866137eb565b82810360208401526138b381866137eb565b915050826040830152949350505050565b6001600160a01b03831681526040602082018190526000906113209083018461326d565b81516001600160a01b031681526101608101602083015161391460208401826001600160a01b03169052565b50604083015161392b604084018262ffffff169052565b506060830151613940606084018260020b9052565b506080830151613955608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015261012083015161399c6101208401826001600160a01b03169052565b5061014092830151919092015290565b600080600080608085870312156139c257600080fd5b845193506139d2602086016136ce565b604086015160609096015194979096509250505056fe608060405260405161041038038061041083398101604081905261002291610268565b61002c8282610033565b5050610358565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b919061033c565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b038111156102ae57600080fd5b8301601f810185136102bf57600080fd5b80516001600160401b038111156102d8576102d861022e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103065761030661022e565b60405281815282820160200187101561031e57600080fd5b61032f826020830160208601610244565b8093505050509250929050565b6000825161034e818460208701610244565b9190910192915050565b60aa806103666000396000f3fe6080604052600a600c565b005b60186014601a565b6051565b565b6000604c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015606f573d6000f35b3d6000fdfea2646970667358221220dcea5be7727728b321a6567a485cb0436c1c5ae9f51a138b242fa3b34ee7125c64736f6c634300081c0033a26469706673582212205b6d4c853319b461ac168a98a0d880a8f0d6a2ee448869bc5896355981fa420664736f6c634300081c0033a26469706673582212209354a0e40bce792897af4c19a61535937d29b9197fbdb02d43c7e2e4f660bdd264736f6c634300081c003300000000000000000000000058230e0c6918a018a28bf97185eff02c2edeb8600000000000000000000000005f6a682a58854c7fbe228712aeeffccde0008ac0000000000000000000000000ad5b6c09a4edabb2c1be1ff4ab98ea59c4071fff000000000000000000000000255fb6c2854a48f6ddedf508d57450b143e2c601000000000000000000000000cbb7c0000ab88b473b1f5afd9ef808440eed33bf0000000000000000000000005ec25b96e14a050317d695ec44cde76c410c6b42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000152d02c7e14af6800000