3 txs
4 calls
constructor
constructor(address _v2Router, address _v3Router, address _rewardsManager, address _feeRecipient, uint256 _feePercentage)
functions
getEligibleVoters
viewfunction getEligibleVoters(uint256 _vaultId) view returns (address[])
getMemberSharePercentage
viewfunction getMemberSharePercentage(uint256 _vaultId, address _memberAddress) view returns (uint256)
getMemberVaults
viewfunction getMemberVaults(address _user) view returns (uint256[])
getPendingJoinRequests
viewfunction getPendingJoinRequests(uint256 _vaultId) view returns (address[])
getTotalVaults
viewfunction getTotalVaults() view returns (uint256)
getVaultLeader
viewfunction getVaultLeader(uint256 _vaultId) view returns (address)
getVaultMembers
viewfunction getVaultMembers(uint256 _vaultId) view returns (address[])
getVaultPaymentProposals
viewfunction getVaultPaymentProposals(uint256 _vaultId) view returns (uint256[])
getVaultTokenBalance
viewfunction getVaultTokenBalance(uint256 _vaultId, address _tokenAddress) view returns (uint256)
getVaultTradeProposals
viewfunction getVaultTradeProposals(uint256 _vaultId) view returns (uint256[])
getVaultVotingSettings
viewfunction getVaultVotingSettings(uint256 _vaultId) view returns (uint256 votingPeriod, uint256 minVoterQuorum)
GLOBAL_VOTING_PERIOD
viewfunction GLOBAL_VOTING_PERIOD() view returns (uint256)
isVaultAdmin
viewfunction isVaultAdmin(uint256 _vaultId, address _user) view returns (bool)
memberOfVaults
viewfunction memberOfVaults(address, uint256) view returns (uint256)
memberPoints
viewfunction memberPoints(address) view returns (uint256)
migrationSource
viewfunction migrationSource() view returns (address)
owner
viewfunction owner() view returns (address)
paymentProposalCounter
viewfunction paymentProposalCounter() view returns (uint256)
paymentProposals
viewfunction paymentProposals(uint256) view returns (uint256 id, uint256 vaultId, address proposer, address recipient, address token, uint256 amount, string reason, uint256 votesFor, uint256 votesAgainst, bool executed, bool cancelled, uint256 deadline)
platformFeePercentage
viewfunction platformFeePercentage() view returns (uint256)
platformFeeRecipient
viewfunction platformFeeRecipient() view returns (address)
proposalCounter
viewfunction proposalCounter() view returns (uint256)
proposals
viewfunction proposals(uint256) view returns (uint256 id, uint256 vaultId, address proposer, address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, uint256 votesFor, uint256 votesAgainst, bool executed, bool cancelled, uint256 deadline, uint8 router, uint24 v3fee)
rewardsManager
viewfunction rewardsManager() view returns (address)
totalTrackedBalances
viewfunction totalTrackedBalances(address) view returns (uint256)
uniswapV2Router
viewfunction uniswapV2Router() view returns (address)
uniswapV3Router
viewfunction uniswapV3Router() view returns (address)
vaultCounter
viewfunction vaultCounter() view returns (uint256)
vaultNameExists
viewfunction vaultNameExists(string) view returns (bool)
vaults
viewfunction vaults(uint256) view returns (uint256 id, string name, address leader, uint256 totalEthValue, bool exists, uint256 rewardPool, uint256 votingPeriod, uint256 minVoterQuorum)
WETH
viewfunction WETH() view returns (address)
applyToJoin
nonpayablefunction applyToJoin(uint256 _vaultId)
cancelPaymentProposal
nonpayablefunction cancelPaymentProposal(uint256 _proposalId)
cancelTradeProposal
nonpayablefunction cancelTradeProposal(uint256 _proposalId)
claimVaultTradingRewards
nonpayablefunction claimVaultTradingRewards(uint256 _vaultId)
createPaymentProposal
nonpayablefunction createPaymentProposal(uint256 _vaultId, address _recipient, address _token, uint256 _amount, string _reason)
createTradeProposal
nonpayablefunction createTradeProposal(uint256 _vaultId, uint8 _router, address _tokenIn, address _tokenOut, uint256 _amountIn, uint256 _minAmountOut, uint24 _v3fee)
createVault
nonpayablefunction createVault(string _name)
deleteMember
nonpayablefunction deleteMember(uint256 _vaultId, address _memberToDelete)
demoteAdmin
nonpayablefunction demoteAdmin(uint256 _vaultId, address _admin)
depositETH
payablefunction depositETH(uint256 _vaultId) payable
executePaymentProposal
nonpayablefunction executePaymentProposal(uint256 _proposalId)
executeProposal
nonpayablefunction executeProposal(uint256 _proposalId)
processJoinRequest
nonpayablefunction processJoinRequest(uint256 _vaultId, address _applicant, bool _accept)
promoteToAdmin
nonpayablefunction promoteToAdmin(uint256 _vaultId, address _member)
setInitialVaultCounter
nonpayablefunction setInitialVaultCounter(uint256 _counter)
setMigrationSource
nonpayablefunction setMigrationSource(address _source)
setupMigratedVault
payablefunction setupMigratedVault(uint256 _oldVaultId, string _name, address _leader, uint256 _totalEthValue, uint256 _rewardPool, address[] _memberList, uint256[] _memberDeposits, bool[] _memberIsAdmin, address[] _tokens, uint256[] _balances) payable
setVaultVotingSettings
nonpayablefunction setVaultVotingSettings(uint256 _vaultId, uint256 _newVotingPeriod, uint256 _newMinVoterQuorum)
teamDepositETH
payablefunction teamDepositETH(uint256 _vaultId) payable
teamDepositToken
nonpayablefunction teamDepositToken(uint256 _vaultId, address _token, uint256 _amount)
tipProposalCreator
payablefunction tipProposalCreator(uint256 _tradeProposalId) payable
vote
nonpayablefunction vote(uint256 _proposalId, bool _inFavor)
voteOnPaymentProposal
nonpayablefunction voteOnPaymentProposal(uint256 _proposalId, bool _inFavor)
withdrawETH
nonpayablefunction withdrawETH(uint256 _vaultId, uint256 _amount)
withdrawMyReward
nonpayablefunction withdrawMyReward(uint256 _vaultId)
events
AdminDemoted
event AdminDemoted(uint256 indexed vaultId, address indexed member, address indexed demotedBy)
AdminPromoted
event AdminPromoted(uint256 indexed vaultId, address indexed member, address indexed promotedBy)
Deposit
event Deposit(uint256 indexed vaultId, address indexed member, address indexed token, uint256 amount, uint256 timestamp)
JoinRequest
event JoinRequest(uint256 indexed vaultId, address indexed applicant, uint256 timestamp)
JoinRequestProcessed
event JoinRequestProcessed(uint256 indexed vaultId, address indexed applicant, bool accepted, uint256 timestamp)
MemberRemoved
event MemberRemoved(uint256 indexed vaultId, address indexed member, address indexed removedBy, uint256 timestamp)
MemberRewardWithdrawn
event MemberRewardWithdrawn(uint256 indexed vaultId, address indexed member, uint256 amount, uint256 timestamp)
PaymentProposalCancelled
event PaymentProposalCancelled(uint256 indexed proposalId, address indexed canceller)
PaymentProposalCreated
event PaymentProposalCreated(uint256 indexed proposalId, uint256 indexed vaultId, address indexed proposer, address recipient, address token, uint256 amount, string reason)
PaymentProposalExecuted
event PaymentProposalExecuted(uint256 indexed proposalId, address indexed executor)
ProposalCancelled
event ProposalCancelled(uint256 indexed proposalId, uint256 timestamp)
ProposalCreated
event ProposalCreated(uint256 indexed proposalId, uint256 indexed vaultId, uint8 router, address indexed proposer, uint256 timestamp)
ProposalCreatorPointsAwarded
event ProposalCreatorPointsAwarded(uint256 indexed proposalId, bool isPaymentProposal, address indexed creator, uint256 pointsAwarded)
ProposalCreatorTipped
event ProposalCreatorTipped(uint256 indexed proposalId, bool isPaymentProposal, address indexed tipper, address indexed creator, uint256 amount)
ProposalExecuted
event ProposalExecuted(uint256 indexed proposalId, uint256 timestamp)
TeamDeposit
event TeamDeposit(uint256 indexed vaultId, address indexed from, address indexed token, uint256 amount, uint256 timestamp)
VaultCreated
event VaultCreated(uint256 indexed vaultId, address indexed leader, string name, uint256 timestamp)
VaultMigratedIn
event VaultMigratedIn(uint256 indexed oldVaultId, address indexed from)
VaultRewardClaimed
event VaultRewardClaimed(uint256 indexed vaultId, address indexed triggeredBy, uint256 amount, uint256 timestamp)
VaultVotingSettingsUpdated
event VaultVotingSettingsUpdated(uint256 indexed vaultId, uint256 newVotingPeriod, uint256 newMinVoterQuorum)
Voted
event Voted(uint256 indexed proposalId, address indexed voter, bool inFavor, uint256 timestamp)
VotedOnPaymentProposal
event VotedOnPaymentProposal(uint256 indexed proposalId, address indexed voter, bool inFavor)
Withdrawal
event Withdrawal(uint256 indexed vaultId, address indexed member, address indexed token, uint256 amount, uint256 timestamp)
errors
AlreadyAdmin
error AlreadyAdmin()
AlreadyMember
error AlreadyMember()
AlreadyVoted
error AlreadyVoted()
AmountMustBePositive
error AmountMustBePositive()
CallerNotMigrationSource
error CallerNotMigrationSource()
CannotDemoteSelf
error CannotDemoteSelf()
CannotRemoveLeader
error CannotRemoveLeader()
CannotWithdrawMoreThanDeposited
error CannotWithdrawMoreThanDeposited()
DepositMustBePositive
error DepositMustBePositive()
InsufficientFunds
error InsufficientFunds()
InsufficientTokenBalanceForMigration
error InsufficientTokenBalanceForMigration()
InvalidMigrationSource
error InvalidMigrationSource()
InvalidRecipient
error InvalidRecipient()
InvalidRouterVersion
error InvalidRouterVersion()
InvalidTradeProposalID
error InvalidTradeProposalID()
MemberHasNoShare
error MemberHasNoShare()
NoEligibleVoters
error NoEligibleVoters()
NoPendingRequest
error NoPendingRequest()
NoRewardToWithdraw
error NoRewardToWithdraw()
NotAdmin
error NotAdmin()
NotContractOwner
error NotContractOwner()
NotProposer
error NotProposer()
NotVaultAdmin
error NotVaultAdmin()
NotVaultLeader
error NotVaultLeader()
NotVaultMember
error NotVaultMember()
OnlyMembersWithShareCanVote
error OnlyMembersWithShareCanVote()
ProposalAlreadyHandled
error ProposalAlreadyHandled()
ProposalCannotBeExecuted
error ProposalCannotBeExecuted()
ProposalFailedDeadlineMajority
error ProposalFailedDeadlineMajority()
ProposalFailedDeadlineParticipation
error ProposalFailedDeadlineParticipation()
ProposalFailedQuorumMet
error ProposalFailedQuorumMet()
ProposalNotActive
error ProposalNotActive()
QuorumExceedsMembers
error QuorumExceedsMembers()
QuorumMustBePositive
error QuorumMustBePositive()
RequestAlreadyPending
error RequestAlreadyPending()
TargetNotMember
error TargetNotMember()
TipMustBePositive
error TipMustBePositive()
TokenTransferFailed
error TokenTransferFailed()
TradeProposalNotExecuted
error TradeProposalNotExecuted()
UseTeamDepositETHForETH
error UseTeamDepositETHForETH()
V3FeeNotProvided
error V3FeeNotProvided()
VaultDoesNotExist
error VaultDoesNotExist()
VaultIdAlreadyExists
error VaultIdAlreadyExists()
VaultNameTaken
error VaultNameTaken(string name)
VotingPeriodEnded
error VotingPeriodEnded()
WithdrawalExceedsShare
error WithdrawalExceedsShare()
WithdrawMustBePositive
error WithdrawMustBePositive()
creation bytecode
0x60a060405234801561000f575f5ffd5b50604051615c33380380615c3383398101604081905261002e91610113565b5f8054336001600160a01b0319918216179091556001805482166001600160a01b03888116918217909255600280548416888416179055600380548416878416179055600480549093169185169190911782556005839055604080516315ab88c960e31b81529051919263ad5c46489282820192602092908290030181865afa1580156100bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e1919061016d565b6001600160a01b03166080525061018d9350505050565b80516001600160a01b038116811461010e575f5ffd5b919050565b5f5f5f5f5f60a08688031215610127575f5ffd5b610130866100f8565b945061013e602087016100f8565b935061014c604087016100f8565b925061015a606087016100f8565b9150608086015190509295509295909350565b5f6020828403121561017d575f5ffd5b610186826100f8565b9392505050565b608051615a726101c15f395f8181610929015281816145020152818161479a01528181614aef0152614c690152615a725ff3fe60806040526004361061035d575f3560e01c8063816aea32116101bd578063b502907e116100f2578063d60899aa11610092578063ecf876e41161006d578063ecf876e414610adc578063f49e764514610af1578063f511703114610b10578063fdca34f614610b2f575f5ffd5b8063d60899aa14610a7f578063defe205314610a9e578063eb13554f14610abd575f5ffd5b8063c9d27afe116100cd578063c9d27afe146109f2578063cdd78cfc14610a11578063cf00d97714610a26578063d471442e14610a60575f5ffd5b8063b502907e14610995578063be032a70146109b4578063c7cdea37146109d3575f5ffd5b80639a8bf4e01161015d578063ac95804111610138578063ac95804114610903578063ad5c464814610918578063ae326f241461094b578063b3253f131461096a575f5ffd5b80639a8bf4e0146108a6578063a4dba336146108c5578063a9a61e25146108e4575f5ffd5b80638cee80a7116101985780638cee80a7146108375780638da5cb5b1461084a5780639562e6d7146108685780639664cb1614610887575f5ffd5b8063816aea32146107c657806388df3a01146107e55780638c64ea4a14610804575f5ffd5b80633129847d1161029357806359ca9ed4116102335780636d1c06c61161020e5780636d1c06c6146107605780637262d8b71461077f578063757a1f811461079457806377369603146107b3575f5ffd5b806359ca9ed4146106ca578063663a63df1461070157806368d8bf581461072c575f5ffd5b80634e162fef1161026e5780634e162fef146106655780635358fbda146106845780635486f1001461069757806356990e65146106ab575f5ffd5b80633129847d146106085780633fe1da88146106275780634b537aa614610646575f5ffd5b80630d80b186116102fe57806316edb9be116102d957806316edb9be1461058c578063250dcd4d146105ab5780632bbdda52146105ca5780632c76d7a6146105e9575f5ffd5b80630d80b186146105175780630db265c0146105365780631694505e14610555575f5ffd5b806309aececb1161033957806309aececb146104885780630aebaca5146104a75780630c0512e9146104d35780630d61b519146104f6575f5ffd5b8062d69ac014610368578063013cf08b1461039d5780630500e25614610459575f5ffd5b3661036457005b5f5ffd5b348015610373575f5ffd5b50610387610382366004614dc5565b610b42565b6040516103949190614e1f565b60405180910390f35b3480156103a8575f5ffd5b5061043f6103b7366004614dc5565b600a60208190525f918252604090912080546001820154600283015460038401546004850154600586015460068701546007880154600889015499890154600b8a0154600c909a0154989a97996001600160a01b03978816999688169897909516969395929491939260ff80831693610100938490048216939092918216910462ffffff168e565b6040516103949e9d9c9b9a99989796959493929190614e6c565b348015610464575f5ffd5b50610478610473366004614f1a565b610d1d565b6040519015158152602001610394565b348015610493575f5ffd5b506103876104a2366004614dc5565b610d85565b3480156104b2575f5ffd5b506104c66104c1366004614dc5565b610e26565b6040516103949190614f44565b3480156104de575f5ffd5b506104e8600b5481565b604051908152602001610394565b348015610501575f5ffd5b50610515610510366004614dc5565b610ebc565b005b348015610522575f5ffd5b50610515610531366004614dc5565b610ff7565b348015610541575f5ffd5b50610515610550366004615035565b611133565b348015610560575f5ffd5b50600154610574906001600160a01b031681565b6040516001600160a01b039091168152602001610394565b348015610597575f5ffd5b506105156105a63660046150a1565b61130a565b3480156105b6575f5ffd5b506105156105c5366004614dc5565b611512565b3480156105d5575f5ffd5b506103876105e4366004614dc5565b61180e565b3480156105f4575f5ffd5b50600254610574906001600160a01b031681565b348015610613575f5ffd5b50610515610622366004614dc5565b6118ad565b348015610632575f5ffd5b5061051561064136600461511d565b611a2f565b348015610651575f5ffd5b506104c6610660366004614dc5565b611bfd565b348015610670575f5ffd5b5061051561067f36600461515e565b611c92565b610515610692366004614dc5565b611f82565b3480156106a2575f5ffd5b506008546104e8565b3480156106b6575f5ffd5b506105156106c5366004614dc5565b612106565b3480156106d5575f5ffd5b506106e96106e4366004614dc5565b6122a9565b6040516103949c9b9a999897969594939291906151c9565b34801561070c575f5ffd5b506104e861071b366004615250565b600e6020525f908152604090205481565b348015610737575f5ffd5b5061074b610746366004614dc5565b6123a1565b60408051928352602083019190915201610394565b34801561076b575f5ffd5b50600654610574906001600160a01b031681565b34801561078a575f5ffd5b506104e861546081565b34801561079f575f5ffd5b506105156107ae366004615269565b6123f5565b6105156107c1366004614dc5565b6125a5565b3480156107d1575f5ffd5b506104e86107e0366004615297565b6126be565b3480156107f0575f5ffd5b506104e86107ff366004614f1a565b6126e9565b34801561080f575f5ffd5b5061082361081e366004614dc5565b612749565b6040516103949897969594939291906152bf565b6105156108453660046154ad565b612820565b348015610855575f5ffd5b505f54610574906001600160a01b031681565b348015610873575f5ffd5b50610515610882366004614dc5565b612c3d565b348015610892575f5ffd5b506105156108a13660046155fc565b612d16565b3480156108b1575f5ffd5b506105156108c0366004614f1a565b612e27565b3480156108d0575f5ffd5b506105156108df366004614dc5565b613229565b3480156108ef575f5ffd5b506104e86108fe366004614f1a565b613312565b34801561090e575f5ffd5b506104e860085481565b348015610923575f5ffd5b506105747f000000000000000000000000000000000000000000000000000000000000000081565b348015610956575f5ffd5b50610515610965366004614f1a565b6133c2565b348015610975575f5ffd5b506104e8610984366004615250565b60106020525f908152604090205481565b3480156109a0575f5ffd5b506105156109af366004615625565b613516565b3480156109bf575f5ffd5b506105156109ce366004615250565b6136e0565b3480156109de575f5ffd5b506105156109ed366004615658565b613753565b3480156109fd575f5ffd5b50610515610a0c366004615269565b613979565b348015610a1c575f5ffd5b506104e860055481565b348015610a31575f5ffd5b50610478610a4036600461511d565b805160208183018101805160098252928201919093012091525460ff1681565b348015610a6b575f5ffd5b50610574610a7a366004614dc5565b613b2e565b348015610a8a575f5ffd5b506104c6610a99366004615250565b613b80565b348015610aa9575f5ffd5b50600354610574906001600160a01b031681565b348015610ac8575f5ffd5b50600454610574906001600160a01b031681565b348015610ae7575f5ffd5b506104e8600d5481565b348015610afc575f5ffd5b50610515610b0b366004614dc5565b613be9565b348015610b1b575f5ffd5b50610515610b2a366004614f1a565b613c18565b610515610b3d366004614dc5565b613d47565b5f81815260076020526040902060090154606090829060ff16610b7857604051634d827f1760e01b815260040160405180910390fd5b5f610b8284613e3a565b9050805f03610ba15750604080515f8152602081019091529150610d17565b5f816001600160401b03811115610bba57610bba614f86565b604051908082528060200260200182016040528015610be3578160200160208202803683370190505b505f8681526007602090815260408083206006018054825181850281018501909352808352949550929384939192830182828015610c4857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610c2a575b509394505f93505050505b8151811015610d0f575f60075f8a81526020019081526020015f206005015f848481518110610c8457610c84615678565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20600101541115610d0757818181518110610cc757610cc7615678565b6020026020010151848481518110610ce157610ce1615678565b6001600160a01b039092166020928302919091019091015282610d03816156a0565b9350505b600101610c53565b509194505050505b50919050565b5f82815260076020526040812060090154839060ff16610d5057604051634d827f1760e01b815260040160405180910390fd5b5f8481526007602090815260408083206001600160a01b038716845260050190915290206002015460ff1691505b5092915050565b5f81815260076020526040902060090154606090829060ff16610dbb57604051634d827f1760e01b815260040160405180910390fd5b5f8381526007602090815260409182902060060180548351818402810184019094528084529091830182828015610e1957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dfb575b5050505050915050919050565b5f81815260076020526040902060090154606090829060ff16610e5c57604051634d827f1760e01b815260040160405180910390fd5b5f83815260076020908152604091829020600d0180548351818402810184019094528084529091830182828015610e1957602002820191905f5260205f20905b815481526020019060010190808311610e9c575050505050915050919050565b5f818152600a602081905260409091209081015460ff1680610ee75750600a810154610100900460ff165b15610f05576040516324a84a2d60e21b815260040160405180910390fd5b610f2181600101548260070154836008015484600b0154613f28565b600a8101805460ff19166001179055610f3981614029565b60028101546001600160a01b03165f9081526010602052604081208054600192839291610f679084906156b8565b909155505060028201548254604080515f8152602081018590526001600160a01b03909316927fcab12f4438fdeb0c2f627bf8daf6dda9c16de88b9bd9fd9720e833451bd17cee910160405180910390a3827ff758fc91e01b00ea6b4a6138756f7f28e021f9bf21db6dbf8c36c88eb737257a42604051610fea91815260200190565b60405180910390a2505050565b5f81815260076020526040902060090154819060ff1661102a57604051634d827f1760e01b815260040160405180910390fd5b5f828152600760209081526040808320338452600501909152902060020154610100900460ff161561106f576040516340803a5f60e11b815260040160405180910390fd5b5f828152600760208181526040808420338552909201905290205460ff16156110ab57604051634eccce3d60e01b815260040160405180910390fd5b5f828152600760208181526040808420338086528185018452828620805460ff1916600190811790915594845260089091018054948501815585529382902090920180546001600160a01b03191684179055905142815284917f6f7a8fa167e9ec85f5e5895685288e228205a38b1c2c4c79d635c5d3a1d0bc98910160405180910390a35050565b5f85815260076020526040902060090154859060ff1661116657604051634d827f1760e01b815260040160405180910390fd5b5f8681526007602090815260408083203384526005019091529020600201548690610100900460ff166111ac57604051631cf443c960e31b815260040160405180910390fd5b835f036111cc57604051632e11316f60e11b815260040160405180910390fd5b6001600160a01b0386166111f357604051634e46966960e11b815260040160405180910390fd5b600d8054905f611202836156a0565b9091555050600d545f818152600c6020526040902081815560018101899055600281018054336001600160a01b03199182161790915560038201805482166001600160a01b038b8116919091179091556004830180549092169089161790556005810186905560068101611276868261574e565b505f898152600760205260409020600f015461129290426156b8565b600b8201555f898152600760209081526040808320600e01805460018101825590845291909220018390555133908a9084907fd8673bda192a0490be0bdb52d88e58575ab24ab4538462473ccb0a18bb4144ac906112f7908d908d908d908d90615808565b60405180910390a4505050505050505050565b5f87815260076020526040902060090154879060ff1661133d57604051634d827f1760e01b815260040160405180910390fd5b5f8881526007602090815260408083203384526005019091529020600201548890610100900460ff1661138357604051631cf443c960e31b815260040160405180910390fd5b600188600181111561139757611397614e38565b1480156113a7575062ffffff8316155b156113c55760405163238f74d960e21b815260040160405180910390fd5b600b8054905f6113d4836156a0565b9091555050600b545f818152600a60209081526040808320848155600181018e9055600281018054336001600160a01b03199182161790915560038201805482166001600160a01b038f811691909117909155600483018054909216908d16179055600581018a9055600681018990558d84526007909252909120600f015461145d90426156b8565b600b820155600c810180548b919060ff19166001838181111561148257611482614e38565b0217905550600c8101805463ffffff00191661010062ffffff8816021790555f8b8152600760209081526040808320600d01805460018101825590845291909220018390555133908c9084907f21bc71f185ee70bc00e1284b78f2db7f166b42f6e41f2eed5bf80f5292dfc281906114fd908f904290615844565b60405180910390a45050505050505050505050565b5f818152600c60205260409020600a81015460ff168061153b5750600a810154610100900460ff165b15611559576040516324a84a2d60e21b815260040160405180910390fd5b61157581600101548260070154836008015484600b0154613f28565b60018101545f90815260076020908152604080832060058501546004808701546001600160a01b03168652820190935292205410156115c75760405163356680b760e01b815260040160405180910390fd5b600a8201805460ff1916600117905560058201546004808401546001600160a01b03165f90815290830160205260408120805490919061160890849061585f565b9091555050600582015460048301546001600160a01b03165f908152600e60205260408120805490919061163d90849061585f565b909155505060048201546001600160a01b03166116c0578160050154816003015f82825461166b919061585f565b9091555050600382015460058301546040516001600160a01b039092169181156108fc0291905f818181858888f193505050501580156116ad573d5f5f3e3d5ffd5b506116bb826001015461430a565b61175c565b6004828101546003840154600585015460405163a9059cbb60e01b81526001600160a01b03928316948101949094526024840152169063a9059cbb906044016020604051808303815f875af115801561171b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173f9190615872565b61175c5760405163022e258160e11b815260040160405180910390fd5b60028201546001600160a01b03165f908152601060205260408120805460019283929161178a9084906156b8565b9091555050600283015483546040805160018152602081018590526001600160a01b03909316927fcab12f4438fdeb0c2f627bf8daf6dda9c16de88b9bd9fd9720e833451bd17cee910160405180910390a3604051339085907f64f91796aa24fdba5abc659c0da1acd9f978b05c324b24e52cd7ae85d62bbe6d905f90a350505050565b5f81815260076020526040902060090154606090829060ff1661184457604051634d827f1760e01b815260040160405180910390fd5b5f8381526007602090815260409182902060080180548351818402810184019094528084529091830182828015610e1957602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311610dfb575050505050915050919050565b5f81815260076020526040902060090154819060ff166118e057604051634d827f1760e01b815260040160405180910390fd5b5f8281526007602090815260408083203384526005019091529020600201548290610100900460ff1661192657604051631cf443c960e31b815260040160405180910390fd5b600354604051632f50b8d960e21b8152600481018590525f602482015247916001600160a01b03169063bd42e364906044015f604051808303815f87803b15801561196f575f5ffd5b505af1158015611981573d5f5f3e3d5ffd5b505050505f8147611992919061585f565b905080156119ec575f858152600760205260408120600a0180548392906119ba9084906156b8565b90915550505f808052600e6020525f516020615a1d5f395f51905f5280548392906119e69084906156b8565b90915550505b60408051828152426020820152339187917f85c3008f867bf9cf941adf6102b256329a4023f9d49f2a860b8a18d5d3f4c0b8910160405180910390a35050505050565b600981604051611a3f919061588d565b9081526040519081900360200190205460ff1615611a7b5780604051632326ec2560e11b8152600401611a7291906158a3565b60405180910390fd5b60088054905f611a8a836156a0565b9091555050600854604051600190600990611aa690859061588d565b9081526040805160209281900383019020805460ff1916931515939093179092555f83815260079091522081815560018101611ae2848261574e565b5060028181018054336001600160a01b0319918216811790925560098401805460ff19166001908117909155615460600f8087019190915560108601829055604080516080810182525f8082526020808301828152838501878152606085018881528a855260058d0184528685209551865591518589015551939099018054995161ffff19909a1693151561ff001916939093176101009915159990990298909817909155600688018054808601825590825287822001805490951686179094558484529085528083208054928301815583529390912001849055905183907f9376fbc8a3256ef7e3d46fbc814084da897437f53f0ba86ee0089df58497400b90611bf090879042906158b5565b60405180910390a3505050565b5f81815260076020526040902060090154606090829060ff16611c3357604051634d827f1760e01b815260040160405180910390fd5b5f83815260076020908152604091829020600e0180548351818402810184019094528084529091830182828015610e1957602002820191905f5260205f2090815481526020019060010190808311610e9c575050505050915050919050565b5f83815260076020526040902060090154839060ff16611cc557604051634d827f1760e01b815260040160405180910390fd5b5f848152600760209081526040808320338452600501909152902060020154849060ff16611d0657604051635871892b60e01b815260040160405180910390fd5b5f8581526007602081815260408084206001600160a01b0389168552909201905290205460ff16611d4a5760405163198580dd60e31b815260040160405180910390fd5b5f8581526007602081815260408084206001600160a01b03891685528084018352908420805460ff19169055888452919052600801905b8154811015611e7457856001600160a01b0316828281548110611da657611da6615678565b5f918252602090912001546001600160a01b031603611e6c5781548290611dcf9060019061585f565b81548110611ddf57611ddf615678565b905f5260205f20015f9054906101000a90046001600160a01b0316828281548110611e0c57611e0c615678565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081805480611e4757611e476158d6565b5f8281526020902081015f1990810180546001600160a01b0319169055019055611e74565b600101611d81565b508315611f3257604080516080810182525f80825260208083018281528385018381526001606086018181528d8652600785528786206001600160a01b038e1680885260058201875289882098518955945188840155925160029097018054915161ffff1990921697151561ff001916979097176101009115159190910217909555600601805480860182559084528284200180546001600160a01b031916821790558252600f815292812080549283018155815291909120018690555b6040805185151581524260208201526001600160a01b0387169188917f9a5dec7104f72ee053265bc6110d7b46eaddf13404b649500d1fa60bb2e6fe7191015b60405180910390a3505050505050565b5f81815260076020526040902060090154819060ff16611fb557604051634d827f1760e01b815260040160405180910390fd5b5f8281526007602090815260408083203384526005019091529020600201548290610100900460ff16611ffb57604051631cf443c960e31b815260040160405180910390fd5b345f0361201b5760405163629aae3160e01b815260040160405180910390fd5b5f8381526007602090815260408083208380526004810190925282208054919234926120489084906156b8565b9250508190555034816003015f82825461206291906156b8565b90915550505f808052600e6020525f516020615a1d5f395f51905f52805434929061208e9084906156b8565b9091555050335f908152600582016020526040812080543492906120b39084906156b8565b909155506120c290508461430a565b604080513481524260208201525f91339187917feb65d0f36862bbd8763c5e2c983c9d753267d223eee35a224d8d0a9d7ef433a2910160405180910390a450505050565b5f81815260076020526040902060090154819060ff1661213957604051634d827f1760e01b815260040160405180910390fd5b5f8281526007602090815260408083203384526005019091529020600201548290610100900460ff1661217f57604051631cf443c960e31b815260040160405180910390fd5b5f8381526007602090815260408083203384526005810190925282206001015490918190036121c1576040516396d6e90560e01b815260040160405180910390fd5b5f6127108284600a01546121d591906158ea565b6121df9190615901565b9050805f03612201576040516367300f9160e11b815260040160405180910390fd5b8083600a015f828254612214919061585f565b90915550505f808052600e6020525f516020615a1d5f395f51905f52805483929061224090849061585f565b9091555050604051339082156108fc029083905f818181858888f1935050505015801561226f573d5f5f3e3d5ffd5b5060408051828152426020820152339188917fecc9a94875dd165d87168b13cc4e683640c1f019106d7adb67e8b41aa8fa92eb9101611f72565b600c6020525f90815260409020805460018201546002830154600384015460048501546005860154600687018054969795966001600160a01b0395861696948616959093169391926122fa906156d1565b80601f0160208091040260200160405190810160405280929190818152602001828054612326906156d1565b80156123715780601f1061234857610100808354040283529160200191612371565b820191905f5260205f20905b81548152906001019060200180831161235457829003601f168201915b5050505060078301546008840154600a850154600b909501549394919390925060ff80831692610100900416908c565b5f818152600760205260408120600901548190839060ff166123d657604051634d827f1760e01b815260040160405180910390fd5b5050505f908152600760205260409020600f8101546010909101549091565b5f828152600c60209081526040808320600181015484526007835281842033855260050190925290912060020154610100900460ff1661244857604051631cf443c960e31b815260040160405180910390fd5b6001808201545f908152600760209081526040808320338452600501909152812090910154900361248c5760405163e1dec35560e01b815260040160405180910390fd5b335f90815260098201602052604090205460ff16156124be57604051637c9a1cf960e01b815260040160405180910390fd5b80600b015442106124e25760405163370ec37160e21b815260040160405180910390fd5b600a81015460ff16806124fe5750600a810154610100900460ff165b1561251c57604051637becc13f60e01b815260040160405180910390fd5b335f9081526009820160205260409020805460ff19166001179055811561255857600781018054905f61254e836156a0565b919050555061256f565b600881018054905f612569836156a0565b91905055505b6040518215158152339084907fb1ce30082b89fee7d49aecd4581fdd1cca211dd20f85db499cc4899d13f05a9c90602001611bf0565b5f81815260076020526040902060090154819060ff166125d857604051634d827f1760e01b815260040160405180910390fd5b345f036125f85760405163629aae3160e01b815260040160405180910390fd5b5f8281526007602090815260408083208380526004810190925282208054919234926126259084906156b8565b9250508190555034816003015f82825461263f91906156b8565b90915550505f808052600e6020525f516020615a1d5f395f51905f52805434929061266b9084906156b8565b9091555061267a90508361430a565b604080513481524260208201525f91339186917f5e9aa68bd85b689b6274093662224a00afa00d8313fce790c3649baa7be4603191015b60405180910390a4505050565b600f602052815f5260405f2081815481106126d7575f80fd5b905f5260205f20015f91509150505481565b5f82815260076020526040812060090154839060ff1661271c57604051634d827f1760e01b815260040160405180910390fd5b50505f9182526007602090815260408084206001600160a01b039390931684526004909201905290205490565b60076020525f90815260409020805460018201805491929161276a906156d1565b80601f0160208091040260200160405190810160405280929190818152602001828054612796906156d1565b80156127e15780601f106127b8576101008083540402835291602001916127e1565b820191905f5260205f20905b8154815290600101906020018083116127c457829003601f168201915b505050600284015460038501546009860154600a870154600f88015460109098015496976001600160a01b039094169692955060ff9091169350919088565b6006546001600160a01b0316331461284b57604051634d3c6dff60e11b815260040160405180910390fd5b5f8c81526007602052604090206009015460ff161561287d57604051638029f2e160e01b815260040160405180910390fd5b60098b60405161288d919061588d565b9081526040519081900360200190205460ff16156128c0578a604051632326ec2560e11b8152600401611a7291906158a3565b600160098c6040516128d2919061588d565b9081526040805160209281900383019020805460ff1916931515939093179092555f8e81526007909152208c81556001810161290e8d8261574e565b506002810180546001600160a01b0319166001600160a01b038d16179055600381018a9055600a810189905560098101805460ff19166001908117909155615460600f83015560108201555f5b8851811015612a8c575f89828151811061297757612977615678565b6020908102919091018101516006850180546001810182555f91825292902090910180546001600160a01b0319166001600160a01b03831617905560408051608081019091528a519192509081908b90859081106129d7576129d7615678565b602002602001015181526020015f81526020018984815181106129fc576129fc615678565b6020908102919091018101511515825260019181018290526001600160a01b039093165f9081526005860184526040808220845181558486015181850155848201516002909101805460609096015115156101000261ff00199215159290921661ffff199096169590951717909355600f845291822080548083018255908352929091209091018f90550161295b565b505f808052600482016020908152604082203490819055600e9091525f516020615a1d5f395f51905f52805491929091612ac79084906156b8565b909155505f90505b84811015612bf8575f868683818110612aea57612aea615678565b9050602002016020810190612aff9190615250565b90505f858584818110612b1457612b14615678565b6040516370a0823160e01b815230600482015260209091029290920135925082916001600160a01b03851691506370a0823190602401602060405180830381865afa158015612b65573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b899190615920565b1015612ba8576040516339e8e3a960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526004850160209081526040808320849055600e90915281208054839290612bde9084906156b8565b90915550612bee905084836143f7565b5050600101612acf565b50612c028d61430a565b60405133908e907f012b62d8cdab3f81008fa326bbf8f09da2c18cead95c5ebedf4e2123de88b501905f90a350505050505050505050505050565b5f818152600c6020526040902060028101546001600160a01b03163314612c7757604051637d1b73b960e01b815260040160405180910390fd5b600a81015460ff1680612c935750600a810154610100900460ff165b15612cb1576040516324a84a2d60e21b815260040160405180910390fd5b80600b01544210612cd55760405163370ec37160e21b815260040160405180910390fd5b600a8101805461ff001916610100179055604051339083907f7639e87a93d42864b7dab2344fcdbe5e0b92b2c77484c59aee4f03233840eb60905f90a35050565b5f83815260076020526040902060090154839060ff16612d4957604051634d827f1760e01b815260040160405180910390fd5b5f8481526007602052604090206002015484906001600160a01b03163314612d845760405163291edb1f60e11b815260040160405180910390fd5b5f8581526007602052604090206006810154841115612db657604051630de1c39b60e01b815260040160405180910390fd5b835f03612dd657604051632d50f29760e21b815260040160405180910390fd5b600f810185905560108101849055604080518681526020810186905287917fc09259ea3f9af5715ce768c2d40395d2f5be87bfd2a99bf3673fec9b60affb50910160405180910390a2505050505050565b5f82815260076020526040902060090154829060ff16612e5a57604051634d827f1760e01b815260040160405180910390fd5b5f838152600760209081526040808320338452600501909152902060020154839060ff16612e9b57604051635871892b60e01b815260040160405180910390fd5b5f8481526007602090815260408083206001600160a01b0387168452600581019092529091206002810154610100900460ff16612eeb576040516329e28d5160e11b815260040160405180910390fd5b60028201546001600160a01b0390811690861603612f1c576040516339a376e360e01b815260040160405180910390fd5b80548015612ff6575f808052600484016020526040902054811115612f545760405163356680b760e01b815260040160405180910390fd5b5f80805260048401602052604081208054839290612f7390849061585f565b9250508190555080836003015f828254612f8d919061585f565b90915550505f808052600e6020525f516020615a1d5f395f51905f528054839290612fb990849061585f565b90915550505f8083556040516001600160a01b0388169183156108fc02918491818181858888f19350505050158015612ff4573d5f5f3e3d5ffd5b505b6001600160a01b0386165f908152600584016020526040812081815560018101829055600201805461ffff1916905560068401905b815481101561311e57876001600160a01b031682828154811061305057613050615678565b5f918252602090912001546001600160a01b03160361311657815482906130799060019061585f565b8154811061308957613089615678565b905f5260205f20015f9054906101000a90046001600160a01b03168282815481106130b6576130b6615678565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550818054806130f1576130f16158d6565b5f8281526020902081015f1990810180546001600160a01b031916905501905561311e565b60010161302b565b506001600160a01b0387165f908152600f60205260408120905b81548110156131d9578982828154811061315457613154615678565b905f5260205f200154036131d157815482906131729060019061585f565b8154811061318257613182615678565b905f5260205f20015482828154811061319d5761319d615678565b905f5260205f200181905550818054806131b9576131b96158d6565b600190038181905f5260205f20015f905590556131d9565b600101613138565b506131e38961430a565b336001600160a01b0316886001600160a01b03168a7fc7afe249e6747ffd83e86b35ca8515c454464531b7667c0fd09c9051ccc3fede426040516112f791815260200190565b5f818152600a6020526040902060028101546001600160a01b0316331461326357604051637d1b73b960e01b815260040160405180910390fd5b600a81015460ff168061327f5750600a810154610100900460ff165b1561329d576040516324a84a2d60e21b815260040160405180910390fd5b80600b015442106132c15760405163370ec37160e21b815260040160405180910390fd5b600a8101805461ff00191661010017905560405182907f5be67b1762c29673dceae3c1de04ecbf702ab0755c93f0fcc8aec5252df5a2b4906133069042815260200190565b60405180910390a25050565b5f82815260076020526040812060090154839060ff1661334557604051634d827f1760e01b815260040160405180910390fd5b5f8481526007602090815260408083206001600160a01b0387168452600501909152902060020154610100900460ff1661339257604051631cf443c960e31b815260040160405180910390fd5b50505f9182526007602090815260408084206001600160a01b039390931684526005909201905290206001015490565b5f82815260076020526040902060090154829060ff166133f557604051634d827f1760e01b815260040160405180910390fd5b5f8381526007602052604090206002015483906001600160a01b031633146134305760405163291edb1f60e11b815260040160405180910390fd5b336001600160a01b03841603613459576040516328da208b60e11b815260040160405180910390fd5b5f8481526007602090815260408083206001600160a01b038716845260050190915290206002810154610100900460ff166134a7576040516329e28d5160e11b815260040160405180910390fd5b600281015460ff166134cc57604051637bfa4b9f60e01b815260040160405180910390fd5b60028101805460ff1916905560405133906001600160a01b0386169087907f14d4079a25ab5d7957ba84d1c3ef18caf82b243c04b83b29508b6eee0b3d8870905f90a45050505050565b5f83815260076020526040902060090154839060ff1661354957604051634d827f1760e01b815260040160405180910390fd5b6001600160a01b03831661356f57604051623375d360e81b815260040160405180910390fd5b815f0361358f57604051632e11316f60e11b815260040160405180910390fd5b5f8481526007602090815260408083206001600160a01b03871684526004810190925282208054919285926135c59084906156b8565b90915550506001600160a01b0384165f908152600e6020526040812080548592906135f19084906156b8565b90915550613601905081856143f7565b6040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b038516906323b872dd906064016020604051808303815f875af1158015613651573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136759190615872565b6136925760405163022e258160e11b815260040160405180910390fd5b604080518481524260208201526001600160a01b03861691339188917f5e9aa68bd85b689b6274093662224a00afa00d8313fce790c3649baa7be46031910160405180910390a45050505050565b5f546001600160a01b0316331461370a5760405163bfcafd3760e01b815260040160405180910390fd5b6001600160a01b0381166137315760405163b82fd5bf60e01b815260040160405180910390fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b5f82815260076020526040902060090154829060ff1661378657604051634d827f1760e01b815260040160405180910390fd5b5f8381526007602090815260408083203384526005019091529020600201548390610100900460ff166137cc57604051631cf443c960e31b815260040160405180910390fd5b825f036137ec5760405163133693ef60e31b815260040160405180910390fd5b5f84815260076020908152604080832033845260058101909252909120805485111561382b5760405163703049b560e01b815260040160405180910390fd5b60018101545f80805260048401602052604081205490916127109161385091906158ea565b61385a9190615901565b90508086111561387d576040516307ce76c360e21b815260040160405180910390fd5b85825f015f82825461388f919061585f565b9250508190555085836003015f8282546138a9919061585f565b90915550505f808052600484016020526040812080548892906138cd90849061585f565b90915550505f808052600e6020525f516020615a1d5f395f51905f5280548892906138f990849061585f565b9091555050604051339087156108fc029088905f818181858888f19350505050158015613928573d5f5f3e3d5ffd5b506139328761430a565b604080518781524260208201525f9133918a917f0c5bfef78f494cb36fb1b384aba1877f423229330262eb3207e301baecc1b39e910160405180910390a450505050505050565b5f828152600a60209081526040808320600181015484526007835281842033855260050190925290912060020154610100900460ff166139cc57604051631cf443c960e31b815260040160405180910390fd5b6001808201545f9081526007602090815260408083203384526005019091528120909101549003613a105760405163e1dec35560e01b815260040160405180910390fd5b335f90815260098201602052604090205460ff1615613a4257604051637c9a1cf960e01b815260040160405180910390fd5b80600b01544210613a665760405163370ec37160e21b815260040160405180910390fd5b600a81015460ff1680613a825750600a810154610100900460ff165b15613aa057604051637becc13f60e01b815260040160405180910390fd5b335f9081526009820160205260409020805460ff191660011790558115613adc57600781018054905f613ad2836156a0565b9190505550613af3565b600881018054905f613aed836156a0565b91905055505b604080518315158152426020820152339185917f7c2de587c00d75474a0c6c6fa96fd3b45dc974cd4e8a75f712bb84c950dce1b59101611bf0565b5f81815260076020526040812060090154829060ff16613b6157604051634d827f1760e01b815260040160405180910390fd5b50505f908152600760205260409020600201546001600160a01b031690565b6001600160a01b0381165f908152600f6020908152604091829020805483518184028101840190945280845260609392830182828015613bdd57602002820191905f5260205f20905b815481526020019060010190808311613bc9575b50505050509050919050565b5f546001600160a01b03163314613c135760405163bfcafd3760e01b815260040160405180910390fd5b600855565b5f82815260076020526040902060090154829060ff16613c4b57604051634d827f1760e01b815260040160405180910390fd5b5f8381526007602052604090206002015483906001600160a01b03163314613c865760405163291edb1f60e11b815260040160405180910390fd5b5f8481526007602090815260408083206001600160a01b038716845260050190915290206002810154610100900460ff16613cd4576040516329e28d5160e11b815260040160405180910390fd5b600281015460ff1615613cfa57604051631c3681a560e11b815260040160405180910390fd5b60028101805460ff1916600117905560405133906001600160a01b0386169087907f04aa9139bed4b41b34ed6042938256c1880d5bb0d6efdbe56cbad32670daed44905f90a45050505050565b345f03613d6757604051630db63b4360e41b815260040160405180910390fd5b805f03613d8757604051635238a9a160e01b815260040160405180910390fd5b5f818152600a602081905260409091209081015460ff16613dbb5760405163119bf2ff60e11b815260040160405180910390fd5b60028101546040516001600160a01b039091169081903480156108fc02915f818181858888f19350505050158015613df5573d5f5f3e3d5ffd5b50604080515f81523460208201526001600160a01b03831691339186917f90644a4ac3cb45ccc8c9eb9fba12942f8a836b50126292036f6d1d55fd26b3e191016126b1565b5f818152600760209081526040808320600601805482518185028101850190935280835284938493929190830182828015613e9c57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613e7e575b509394505f93505050505b8151811015613f1f575f60075f8781526020019081526020015f206005015f848481518110613ed857613ed8615678565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20600101541115613f175782613f13816156a0565b9350505b600101613ea7565b50909392505050565b5f84815260076020526040812090613f4084866156b8565b601083015490915081108015904285111590613f7f57858711613f765760405163c21ce7cb60e01b815260040160405180910390fd5b50505050614023565b801561400a575f613f8f89613e3a565b9050805f03613fb1576040516355d7892160e11b815260040160405180910390fd5b5f81613fbe8660026158ea565b11905080613fdf57604051637312ffb560e11b815260040160405180910390fd5b878911613fff57604051630c6372f960e11b815260040160405180910390fd5b505050505050614023565b6040516305b4b21b60e51b815260040160405180910390fd5b50505050565b60018101545f908152600760209081526040808320600585015460038601546001600160a01b0316855260048201909352922054101561407c5760405163356680b760e01b815260040160405180910390fd5b600582015460038301546001600160a01b03165f908152600483016020526040812080549091906140ae90849061585f565b9091555050600582015460038301546001600160a01b03165f908152600e6020526040812080549091906140e390849061585f565b909155505060038201546001600160a01b0316614117578160050154816003015f828254614111919061585f565b90915550505b5f80600c84015460ff16600181111561413257614132614e38565b0361416a576003830154600484015460058501546006860154614163936001600160a01b0390811693169190614467565b90506141df565b6001600c84015460ff16600181111561418557614185614e38565b036141c6576003830154600484015460058501546006860154600c870154614163946001600160a01b039081169416929190610100900462ffffff16614a1f565b604051634df29e4560e11b815260040160405180910390fd5b60048301546001600160a01b031661420a5780826003015f82825461420491906156b8565b90915550505b6004838101546001600160a01b03165f9081529083016020526040812080548392906142379084906156b8565b909155505060048301546001600160a01b03165f908152600e6020526040812080548392906142679084906156b8565b909155505060048301546142859083906001600160a01b03166143f7565b6003546001600160a01b03161561430557600354600184810154604051634df667d160e11b8152600481019190915260248101919091525f60448201526001600160a01b0390911690639beccfa2906064015f604051808303815f87803b1580156142ee575f5ffd5b505af1158015614300573d5f5f3e3d5ffd5b505050505b505050565b5f818152600760205260408120600381015490910361437e575f5b6006820154811015614305575f826005015f84600601848154811061434c5761434c615678565b5f9182526020808320909101546001600160a01b03168352820192909252604001902060019081019190915501614325565b5f5b6006820154811015614305575f826005015f8460060184815481106143a7576143a7615678565b5f9182526020808320909101546001600160a01b03168352820192909252604001902060038401548154919250906143e1906127106158ea565b6143eb9190615901565b60019182015501614380565b6001600160a01b0381165f908152600c8301602052604090205460ff16614463576001600160a01b0381165f818152600c8401602090815260408220805460ff19166001908117909155600b860180549182018155835291200180546001600160a01b03191690911790555b5050565b5f5f6127106005548561447a91906158ea565b6144849190615901565b90505f614491828661585f565b90506001600160a01b0387166146c25781156144e0576004546040516001600160a01b039091169083156108fc029084905f818181858888f193505050501580156144de573d5f5f3e3d5ffd5b505b6040805160028082526060820183525f926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f8151811061453357614533615678565b60200260200101906001600160a01b031690816001600160a01b031681525050868160018151811061456757614567615678565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201525f918916906370a0823190602401602060405180830381865afa1580156145b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145dd9190615920565b60015460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de95908590614616908a90879030904290600401615937565b5f604051808303818588803b15801561462d575f5ffd5b505af115801561463f573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201528493506001600160a01b038c1692506370a0823191506024015b602060405180830381865afa158015614689573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146ad9190615920565b6146b7919061585f565b945050505050614a17565b60015460405163095ea7b360e01b81526001600160a01b039182166004820152602481018790529088169063095ea7b3906044016020604051808303815f875af1158015614712573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147369190615872565b506001600160a01b0386166148a6576040805160028082526060820183525f9260208301908036833701905050905087815f8151811061477857614778615678565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106147cc576147cc615678565b6001600160a01b03928316602091820292909201015260015460405163791ac94760e01b81524792919091169063791ac94790614815908a908a9087903090429060040161596b565b5f604051808303815f87803b15801561482c575f5ffd5b505af115801561483e573d5f5f3e3d5ffd5b505050505f814761484f919061585f565b90508415614890576004546040516001600160a01b039091169086156108fc029087905f818181858888f1935050505015801561488e573d5f5f3e3d5ffd5b505b61489a858261585f565b95505050505050614a17565b6040805160028082526060820183525f9260208301908036833701905050905087815f815181106148d9576148d9615678565b60200260200101906001600160a01b031690816001600160a01b031681525050868160018151811061490d5761490d615678565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201525f918916906370a0823190602401602060405180830381865afa15801561495f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149839190615920565b600154604051635c11d79560e01b81529192506001600160a01b031690635c11d795906149bc908a908a9087903090429060040161596b565b5f604051808303815f87803b1580156149d3575f5ffd5b505af11580156149e5573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201528392506001600160a01b038b1691506370a082319060240161466e565b949350505050565b5f5f61271060055486614a3291906158ea565b614a3c9190615901565b90505f614a49828761585f565b60408051610100810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091529091506001600160a01b038916614bb8578215614ad9576004546040516001600160a01b039091169084156108fc029085905f818181858888f19350505050158015614ad7573d5f5f3e3d5ffd5b505b5060408051610100810182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081168252898116602083015262ffffff87168284015230606083015242608083015260a0820184905260c082018890525f60e0830152600254925163414bf38960e01b81529192169063414bf389908490614b6d9085906004016159a6565b60206040518083038185885af1158015614b89573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190614bae9190615920565b9350505050614dbc565b60025460405163095ea7b360e01b81526001600160a01b03918216600482015260248101899052908a169063095ea7b3906044016020604051808303815f875af1158015614c08573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c2c9190615872565b506040518061010001604052808a6001600160a01b031681526020015f6001600160a01b03168a6001600160a01b031614614c675789614c89565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03908116825262ffffff8816602083015230604080840191909152426060840152608083018b905260a083018a90525f60c0909301839052600254905163414bf38960e01b8152939450919291169063414bf38990614cf39085906004016159a6565b6020604051808303815f875af1158015614d0f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d339190615920565b90506001600160a01b038916614db6575f61271060055483614d5591906158ea565b614d5f9190615901565b90508015614da0576004546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015614d9e573d5f5f3e3d5ffd5b505b614daa818361585f565b95505050505050614dbc565b93505050505b95945050505050565b5f60208284031215614dd5575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b82811015614e155781516001600160a01b0316865260209586019590910190600101614dee565b5093949350505050565b602081525f614e316020830184614ddc565b9392505050565b634e487b7160e01b5f52602160045260245ffd5b60028110614e6857634e487b7160e01b5f52602160045260245ffd5b9052565b8e8152602081018e90526001600160a01b038d811660408301528c811660608301528b1660808201526101c081018a60a08301528960c08301528860e083015287610100830152614ec261012083018815159052565b85151561014083015284610160830152614ee0610180830185614e4c565b62ffffff83166101a08301529f9e505050505050505050505050505050565b80356001600160a01b0381168114614f15575f5ffd5b919050565b5f5f60408385031215614f2b575f5ffd5b82359150614f3b60208401614eff565b90509250929050565b602080825282518282018190525f918401906040840190835b81811015614f7b578351835260209384019390920191600101614f5d565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715614fc257614fc2614f86565b604052919050565b5f82601f830112614fd9575f5ffd5b81356001600160401b03811115614ff257614ff2614f86565b615005601f8201601f1916602001614f9a565b818152846020838601011115615019575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f60a08688031215615049575f5ffd5b8535945061505960208701614eff565b935061506760408701614eff565b92506060860135915060808601356001600160401b03811115615088575f5ffd5b61509488828901614fca565b9150509295509295909350565b5f5f5f5f5f5f5f60e0888a0312156150b7575f5ffd5b873596506020880135600281106150cc575f5ffd5b95506150da60408901614eff565b94506150e860608901614eff565b93506080880135925060a0880135915060c088013562ffffff8116811461510d575f5ffd5b8091505092959891949750929550565b5f6020828403121561512d575f5ffd5b81356001600160401b03811115615142575f5ffd5b614a1784828501614fca565b801515811461515b575f5ffd5b50565b5f5f5f60608486031215615170575f5ffd5b8335925061518060208501614eff565b915060408401356151908161514e565b809150509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8c8152602081018c90526001600160a01b038b811660408301528a811660608301528916608082015260a0810188905261018060c082018190525f906152119083018961519b565b90508660e08301528561010083015284151561012083015261523861014083018515159052565b826101608301529d9c50505050505050505050505050565b5f60208284031215615260575f5ffd5b614e3182614eff565b5f5f6040838503121561527a575f5ffd5b82359150602083013561528c8161514e565b809150509250929050565b5f5f604083850312156152a8575f5ffd5b6152b183614eff565b946020939093013593505050565b88815261010060208201525f6152d961010083018a61519b565b6001600160a01b03989098166040830152506060810195909552921515608085015260a084019190915260c083015260e09091015292915050565b5f6001600160401b0382111561532c5761532c614f86565b5060051b60200190565b5f82601f830112615345575f5ffd5b813561535861535382615314565b614f9a565b8082825260208201915060208360051b860101925085831115615379575f5ffd5b602085015b8381101561539d5761538f81614eff565b83526020928301920161537e565b5095945050505050565b5f82601f8301126153b6575f5ffd5b81356153c461535382615314565b8082825260208201915060208360051b8601019250858311156153e5575f5ffd5b602085015b8381101561539d5780358352602092830192016153ea565b5f82601f830112615411575f5ffd5b813561541f61535382615314565b8082825260208201915060208360051b860101925085831115615440575f5ffd5b602085015b8381101561539d5780356154588161514e565b835260209283019201615445565b5f5f83601f840112615476575f5ffd5b5081356001600160401b0381111561548c575f5ffd5b6020830191508360208260051b85010111156154a6575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f5f5f5f6101408d8f0312156154c9575f5ffd5b8c359b506001600160401b0360208e013511156154e4575f5ffd5b6154f48e60208f01358f01614fca565b9a5061550260408e01614eff565b995060608d0135985060808d013597506001600160401b0360a08e01351115615529575f5ffd5b6155398e60a08f01358f01615336565b96506001600160401b0360c08e01351115615552575f5ffd5b6155628e60c08f01358f016153a7565b95506001600160401b0360e08e0135111561557b575f5ffd5b61558b8e60e08f01358f01615402565b94506001600160401b036101008e013511156155a5575f5ffd5b6155b68e6101008f01358f01615466565b90945092506001600160401b036101208e013511156155d3575f5ffd5b6155e48e6101208f01358f01615466565b81935080925050509295989b509295989b509295989b565b5f5f5f6060848603121561560e575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f60608486031215615637575f5ffd5b8335925061564760208501614eff565b929592945050506040919091013590565b5f5f60408385031215615669575f5ffd5b50508035926020909101359150565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016156b1576156b161568c565b5060010190565b808201808211156156cb576156cb61568c565b92915050565b600181811c908216806156e557607f821691505b602082108103610d1757634e487b7160e01b5f52602260045260245ffd5b601f82111561430557805f5260205f20601f840160051c810160208510156157285750805b601f840160051c820191505b81811015615747575f8155600101615734565b5050505050565b81516001600160401b0381111561576757615767614f86565b61577b8161577584546156d1565b84615703565b6020601f8211600181146157ad575f83156157965750848201515b5f19600385901b1c1916600184901b178455615747565b5f84815260208120601f198516915b828110156157dc57878501518255602094850194600190920191016157bc565b50848210156157f957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061583a9083018461519b565b9695505050505050565b604081016158528285614e4c565b8260208301529392505050565b818103818111156156cb576156cb61568c565b5f60208284031215615882575f5ffd5b8151614e318161514e565b5f82518060208501845e5f920191825250919050565b602081525f614e31602083018461519b565b604081525f6158c7604083018561519b565b90508260208301529392505050565b634e487b7160e01b5f52603160045260245ffd5b80820281158282048414176156cb576156cb61568c565b5f8261591b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615930575f5ffd5b5051919050565b848152608060208201525f61594f6080830186614ddc565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201525f61598960a0830186614ddc565b6001600160a01b0394909416606083015250608001529392505050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015191821690830152610100820190506080830151608083015260a083015160a083015260c083015160c083015260e0830151610d7e60e08401826001600160a01b0316905256fee710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881ca2646970667358221220d82a777069e09e4f89361749098cf7c532946479d4c1e8d526f628da85379f0964736f6c634300081e00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000068b3465833fb72a70ecdf485e0e4c7bd8665fc45000000000000000000000000d226ee94a5dea695551d429a75eb5556dd2f0dc40000000000000000000000005608f3dd5bc51a6bd6350078115fc496485d30ab00000000000000000000000000000000000000000000000000000000000001f4