0 txs
9 calls
constructor
constructor(address _bOracle, address _cOracle)
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
authority
viewfunction authority() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
bOracle
viewfunction bOracle() view returns (address)
calculateBorrowAmount
viewfunction calculateBorrowAmount(uint256 _collateral, uint256 _targetLTV) view returns (uint256 borrowAmount)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256)
convertToCollateral
viewfunction convertToCollateral(uint256 _borrowAmount) view returns (uint256 collateralAmount)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256)
cOracle
viewfunction cOracle() view returns (address)
decimals
viewfunction decimals() view returns (uint8)
defaultInvestStrategy
viewfunction defaultInvestStrategy() view returns (address)
divestQueue
viewfunction divestQueue() view returns (address[])
divestQueueAt
viewfunction divestQueueAt(uint256 _index) view returns (address)
divestQueueLength
viewfunction divestQueueLength() view returns (uint256)
getState
viewfunction getState() view returns (uint256 totalBorrowed, uint256 totalCollateral)
getTotalBorrowed
viewfunction getTotalBorrowed() view returns (uint256)
getTotalCollateral
viewfunction getTotalCollateral() view returns (uint256)
getTotalInvested
viewfunction getTotalInvested() view returns (uint256)
getVaultLTV
viewfunction getVaultLTV() view returns (uint256)
isAuthorized
viewfunction isAuthorized(address user, bytes4 functionSig) view returns (bool)
lendingAdapters
viewfunction lendingAdapters() view returns (address[])
lendingAdaptersAt
viewfunction lendingAdaptersAt(uint256 _index) view returns (address)
lendingAdaptersLength
viewfunction lendingAdaptersLength() view returns (uint256)
LTV_SCALE
viewfunction LTV_SCALE() view returns (uint256)
MAX_LENDING_PROTOCOLS
viewfunction MAX_LENDING_PROTOCOLS() view returns (uint256)
MAX_STRATEGIES
viewfunction MAX_STRATEGIES() view returns (uint256)
maxDeposit
viewfunction maxDeposit(address) view returns (uint256)
maxMint
viewfunction maxMint(address) view returns (uint256)
maxRedeem
viewfunction maxRedeem(address owner) view returns (uint256)
maxWithdraw
viewfunction maxWithdraw(address owner) view returns (uint256)
name
viewfunction name() view returns (string)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
previewDeposit
viewfunction previewDeposit(uint256 assets) view returns (uint256)
previewMint
viewfunction previewMint(uint256 shares) view returns (uint256)
previewRedeem
viewfunction previewRedeem(uint256 shares) view returns (uint256)
previewWithdraw
viewfunction previewWithdraw(uint256 assets) view returns (uint256)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalAssetsSynced
viewfunction totalAssetsSynced() view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256)
addStrategy
nonpayablefunction addStrategy(address _strategy, uint248 _maxAllocation)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
deposit
nonpayablefunction deposit(uint256 assets, address receiver) returns (uint256)
harvest
nonpayablefunction harvest(bool addToCollateral) returns (uint256)
initialize
nonpayablefunction initialize(address _asset, address _owner, string _name, string _symbol, address _investmentAsset, address _swapRouter, uint256 _harvestThreshold, uint40 _slippageTolerance)
manageInvestments
nonpayablefunction manageInvestments(tuple[] _actions)
manageLendingPosition
nonpayablefunction manageLendingPosition(tuple[] _actions)
mint
nonpayablefunction mint(uint256 shares, address receiver) returns (uint256)
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address owner) returns (uint256)
rescueFunds
nonpayablefunction rescueFunds(address token, uint256 amount)
setAuthority
nonpayablefunction setAuthority(address newAuthority)
setAutoInvest
nonpayablefunction setAutoInvest(bool _autoInvest)
setDefaultInvestStrategy
nonpayablefunction setDefaultInvestStrategy(address _defaultInvestStrategy)
setFeeRecipient
nonpayablefunction setFeeRecipient(address _feeRecipient)
setHarvestThreshold
nonpayablefunction setHarvestThreshold(uint256 _threshold)
setLendingProtocol
nonpayablefunction setLendingProtocol(uint256 _index, address _adapter, tuple _config)
setPerformanceFee
nonpayablefunction setPerformanceFee(uint256 _performanceFee)
setSlippageTolerance
nonpayablefunction setSlippageTolerance(uint40 _slippageTolerance)
setSwapRouter
nonpayablefunction setSwapRouter(address _swapRouter)
sync
nonpayablefunction sync()
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updateDivestQueue
nonpayablefunction updateDivestQueue(uint256[] _indices)
withdraw
nonpayablefunction withdraw(uint256 assets, address receiver, address owner) returns (uint256)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
AuthorityUpdated
event AuthorityUpdated(address indexed user, address indexed newAuthority)
AutoInvestUpdated
event AutoInvestUpdated(bool autoInvest)
DefaultInvestStrategyUpdated
event DefaultInvestStrategyUpdated(address indexed oldStrategy, address indexed newStrategy)
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
FeeRecipientUpdated
event FeeRecipientUpdated(address indexed lastFeeRecipient, address indexed feeRecipient)
Harvest
event Harvest(uint256 earnings, uint256 harvestedAmount, bool addToCollateral)
HarvestThresholdUpdated
event HarvestThresholdUpdated(uint256 oldThreshold, uint256 newThreshold)
Initialized
event Initialized(uint64 version)
LendingAdapterUpdated
event LendingAdapterUpdated(address indexed user, address indexed adapter, uint256 index)
OwnershipTransferred
event OwnershipTransferred(address indexed user, address indexed newOwner)
Paused
event Paused(address account)
PerformanceFeeUpdated
event PerformanceFeeUpdated(uint256 performanceFee)
SlippageToleranceUpdated
event SlippageToleranceUpdated(uint256 oldTolerance, uint256 newTolerance)
StrategyAdded
event StrategyAdded(address indexed user, address indexed strategy, uint248 maxAllocation)
SwapRouterUpdated
event SwapRouterUpdated(address indexed oldRouter, address indexed newRouter)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
UpdateDivestQueue
event UpdateDivestQueue(address indexed user, address[] queue)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares)
errors
Common__MaxPerformanceFeeExceeded
error Common__MaxPerformanceFeeExceeded()
Common__MaxQueueLengthExceeded
error Common__MaxQueueLengthExceeded()
Common_CannotRescueFunds
error Common_CannotRescueFunds(address token)
EnforcedPause
error EnforcedPause()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
ERC4626ExceededMaxDeposit
error ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max)
ERC4626ExceededMaxMint
error ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max)
ERC4626ExceededMaxRedeem
error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max)
ERC4626ExceededMaxWithdraw
error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max)
ExpectedPause
error ExpectedPause()
InvalidInitialization
error InvalidInitialization()
Investment__CannotRemoveActiveStrategy
error Investment__CannotRemoveActiveStrategy(address strategy)
Investment__DuplicatedStrategy
error Investment__DuplicatedStrategy(address strategy)
Investment__InvalidMaxAllocation
error Investment__InvalidMaxAllocation()
Investment__NotEnoughAssets
error Investment__NotEnoughAssets(address strategy)
Investment__StrategyAlreadyExists
error Investment__StrategyAlreadyExists(address strategy)
Investment__StrategyHasAssets
error Investment__StrategyHasAssets(address strategy)
Investment__UnauthorizedStrategy
error Investment__UnauthorizedStrategy(address strategy)
Lending__BorrowLimitExceeded
error Lending__BorrowLimitExceeded()
Lending__HealthFactorTooLow
error Lending__HealthFactorTooLow()
Lending__InvalidAdapterIndex
error Lending__InvalidAdapterIndex()
Lending__InvalidCollateralAmount
error Lending__InvalidCollateralAmount()
Lending__InvalidRepayAmount
error Lending__InvalidRepayAmount()
Lending__LTVTooHigh
error Lending__LTVTooHigh()
Lending__LTVTooLow
error Lending__LTVTooLow()
Lending__MaxAllocationExceeded
error Lending__MaxAllocationExceeded()
NotInitializing
error NotInitializing()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x60c060405234801561000f575f5ffd5b50604051615a54380380615a5483398101604081905261002e9161011d565b6001600160a01b03808316608052811660a052610049610050565b505061014e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a05760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100ff5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b0381168114610118575f5ffd5b919050565b5f5f6040838503121561012e575f5ffd5b61013783610102565b915061014560208401610102565b90509250929050565b60805160a05161589f6101b55f395f818161077501528181610a7d01528181610b80015281816115870152818161214b0152613f2d01525f818161061d015281816109fa01528181610b00015281816114fb015281816121e50152613ea1015261589f5ff3fe608060405234801561000f575f5ffd5b5060043610610368575f3560e01c80638ccd740d116101cf578063cd6a05c411610101578063e74b981b116100a5578063e74b981b1461074a578063ef8b30f7146106b5578063f2fde38b1461075d578063f6fdf9bb14610770578063f8d6d59614610797578063f903230b146107aa578063fa15ccb7146107bd578063fa2ddf8c146107c5578063fff6cae9146107cd575f5ffd5b8063cd6a05c4146106c8578063ce96cb77146106db578063d3205c11146106ee578063d6eb591014610701578063d905777e14610709578063d979a3121461071c578063d9972b9614610724578063dd62ed3e14610737575f5ffd5b8063b0ce10da11610173578063b0ce10da1461063f578063b3d7f6b914610652578063b460af9414610665578063b6792f1814610678578063ba0876521461068b578063bf6a35171461069e578063bf7e214f146106ad578063c63d75b614610484578063c6e6f592146106b5575f5ffd5b80638ccd740d146105b25780638da5cb5b146105ba57806394bf804d146105c257806395d89b41146105d5578063a0c54d53146105dd578063a2d5afdb146105f0578063a9059cbb14610605578063b000336c14610618575f5ffd5b8063466705e3116102a85780636e553f651161024c5780636e553f651461051d57806370897b231461053057806370a082311461054357806370a1903d14610556578063767f06ae1461056957806378e3214f146105715780637a9e5e4b146105845780637ed1a217146105975780637fbe5d6e146105aa575f5ffd5b8063466705e3146104aa5780634cdad506146103a4578063565c3b5d146104b257806357b3bef7146104c55780635a38269a146104d85780635c975abb146104eb5780635f945733146105025780636ab02b151461050a575f5ffd5b806318160ddd1161030f57806318160ddd146104155780631865c57d1461041d57806323b872dd1461043a578063313ce5671461044d57806338d52e0f146104675780633fd4c5d41461047c578063402d267d146104845780634127365714610497575f5ffd5b806301e1d1141461036c5780630307c4a11461038757806306fdde031461038f57806307a2d13a146103a4578063095ea7b3146103b75780630a28a477146103da5780631068013a146103ed578063162f89cf14610400575b5f5ffd5b6103746107d5565b6040519081526020015b60405180910390f35b610374610865565b610397610924565b60405161037e9190614dad565b6103746103b2366004614ddf565b6109c2565b6103ca6103c5366004614e0a565b6109d3565b604051901515815260200161037e565b6103746103e8366004614ddf565b6109ea565b6103746103fb366004614ddf565b6109f6565b61041361040e366004614e34565b610c53565b005b610374610da9565b610425610dbd565b6040805192835260208301919091520161037e565b6103ca610448366004614e7a565b610ef3565b610455610f18565b60405160ff909116815260200161037e565b61046f610f41565b60405161037e9190614eb8565b610374610f5b565b610374610492366004614ecc565b610f6f565b6104136104a5366004614ecc565b610f75565b610374611011565b6104136104c0366004614ecc565b611025565b6104136104d3366004614efb565b6110c1565b6104136104e6366004614f21565b611175565b5f5160206158735f395f51905f525460ff166103ca565b61037461120d565b610413610518366004614ddf565b6112c4565b61037461052b366004614f3c565b611345565b61041361053e366004614ddf565b611360565b610374610551366004614ecc565b61141d565b610374610564366004614f21565b611446565b610374601481565b61041361057f366004614e0a565b611778565b610413610592366004614ecc565b61183e565b6104136105a536600461502f565b611933565b61046f611ad7565b610374600581565b61046f611af4565b6103746105d0366004614f3c565b611b0c565b610397611b27565b61046f6105eb366004614ddf565b611b43565b6105f8611b7f565b60405161037e91906150f4565b6103ca610613366004614e0a565b611be7565b61046f7f000000000000000000000000000000000000000000000000000000000000000081565b61046f61064d366004614ddf565b611bf4565b610374610660366004614ddf565b611c15565b61037461067336600461513f565b611c21565b61041361068636600461517e565b611c45565b61037461069936600461513f565b611de4565b610374670de0b6b3a764000081565b61046f611e00565b6103746106c3366004614ddf565b611e1b565b6104136106d63660046151fc565b611e26565b6103746106e9366004614ecc565b612116565b6103746106fc36600461523a565b612129565b610374612256565b610374610717366004614ecc565b61230e565b610374612318565b6103ca61073236600461525a565b612338565b610374610745366004615292565b6123eb565b610413610758366004614ecc565b612425565b61041361076b366004614ecc565b6124c1565b61046f7f000000000000000000000000000000000000000000000000000000000000000081565b6104136107a53660046152be565b612548565b6104136107b83660046151fc565b61289b565b61037461317e565b6105f861320c565b610413613273565b5f5f6107df61327d565b80546001820154600283015492935090915f6107f96132a1565b90505f5f848611156108215761080f8587615341565b905061081a816109f6565b9050610839565b61082b8686615341565b9150610836826109f6565b91505b81816108458587615354565b61084f9190615354565b6108599190615341565b97505050505050505090565b5f5f61086f61327d565b90505f805b600a83015481101561091d575f83600a01828154811061089657610896615367565b5f918252602091829020015460408051638081e1cf60e01b815290516001600160a01b0390921693508392638081e1cf926004808401938290030181865afa1580156108e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610908919061537b565b6109129084615354565b925050600101610874565b5092915050565b60605f61092f61331a565b905080600301805461094090615392565b80601f016020809104026020016040519081016040528092919081815260200182805461096c90615392565b80156109b75780601f1061098e576101008083540402835291602001916109b7565b820191905f5260205f20905b81548152906001019060200180831161099a57829003601f168201915b505050505091505090565b5f6109cd825f61333e565b92915050565b5f336109e081858561337b565b5060019392505050565b5f6109cd82600161338d565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a54573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a78919061537b565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610afb919061537b565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2d416016040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7e919061537b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2d416016040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bda573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfe919061537b565b610c089190615341565b610c1390600a6154ad565b610c1d84876154b8565b610c2791906154b8565b9050816001610c368284615354565b610c409190615341565b610c4a91906154e3565b95945050505050565b610c68335f356001600160e01b031916612338565b610c8d5760405162461bcd60e51b8152600401610c84906154f6565b60405180910390fd5b60058310610cae576040516354823faf60e01b815260040160405180910390fd5b5f610cb761327d565b600a8101549091508403610cf957600a810180546001810182555f91825260209091200180546001600160a01b0319166001600160a01b038516179055610d3b565b8281600a018581548110610d0f57610d0f615367565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6001600160a01b0383165f90815260098201602052604090208290610d608282615533565b50506040518481526001600160a01b0384169033907fffbf5f5e76ee6f8dbc8e9149695cf3bce90add11b2c325ab6d14870bba4807b8906020015b60405180910390a350505050565b5f5f610db361331a565b6002015492915050565b5f5f5f610dc861327d565b90505f5b600a820154811015610eed575f82600a018281548110610dee57610dee615367565b5f91825260208083209091015460408051638081e1cf60e01b815290516001600160a01b0390921694508492638081e1cf926004808401938290030181865afa158015610e3d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e61919061537b565b90505f826001600160a01b0316635c1548fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec4919061537b565b9050610ed08288615354565b9650610edc8187615354565b95505060019092019150610dcc9050565b50509091565b5f33610f008582856133c1565b610f0b85858561340c565b60019150505b9392505050565b5f5f610f22613469565b90505f8154610f3b9190600160a01b900460ff166155b1565b91505090565b5f5f610f4b613469565b546001600160a01b031692915050565b5f5f610f6561327d565b600b015492915050565b505f1990565b610f8a335f356001600160e01b031916612338565b610fa65760405162461bcd60e51b8152600401610c84906154f6565b5f610faf61327d565b60078101546040519192506001600160a01b03808516929116907fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b905f90a360070180546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f61101b61327d565b600a015492915050565b61103a335f356001600160e01b031916612338565b6110565760405162461bcd60e51b8152600401610c84906154f6565b5f61105f61327d565b600c8101546040519192506001600160a01b03808516929116907f64e03d81d869550328c60ecf4de1507e35f87ea9c130a4c1738781f019fc7ac5905f90a3600c0180546001600160a01b0319166001600160a01b0392909216919091179055565b6110d6335f356001600160e01b031916612338565b6110f25760405162461bcd60e51b8152600401610c84906154f6565b5f6110fb61327d565b600481015460408051600160601b90920464ffffffffff9081168352851660208301529192507fddd31550b26e9ef8ade466958be83ff8a014d9b4f36d546b61a6847a45306575910160405180910390a1600401805464ffffffffff909216600160601b0264ffffffffff60601b19909216919091179055565b61118a335f356001600160e01b031916612338565b6111a65760405162461bcd60e51b8152600401610c84906154f6565b5f6111af61327d565b600481018054841515600160881b0260ff60881b199091161790556040519091507fe6d38d00367ea99de76f573a523e90aab95d67df537e6c8da07c4b4a03e633539061120190841515815260200190565b60405180910390a15050565b5f5f61121761327d565b90505f805b600b83015481101561091d575f83600b01828154811061123e5761123e615367565b5f9182526020918290200154604080516278744560e21b815290516001600160a01b03909216935083926301e1d114926004808401938290030181865afa15801561128b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112af919061537b565b6112b99084615354565b92505060010161121c565b6112d9335f356001600160e01b031916612338565b6112f55760405162461bcd60e51b8152600401610c84906154f6565b5f6112fe61327d565b600381015460408051918252602082018590529192507facd316525acdd4e36d42d5ccf62d92847f0a995118b9f002ab0368445d6b6caa910160405180910390a160030155565b5f61134e61348d565b6113566134bd565b610f1183836134cd565b611375335f356001600160e01b031916612338565b6113915760405162461bcd60e51b8152600401610c84906154f6565b6706f05b59d3b200008111156113ba57604051634f0b989f60e01b815260040160405180910390fd5b5f6113c361327d565b6004810180546bffffffffffffffffffffffff19166bffffffffffffffffffffffff85161790556040518381529091507f9b49d0cd76012d9c67241c2f68f836efbaf50ea29901a250040671402d5263f590602001611201565b5f5f61142761331a565b6001600160a01b039093165f9081526020939093525050604090205490565b5f61145c335f356001600160e01b031916612338565b6114785760405162461bcd60e51b8152600401610c84906154f6565b5f61148161327d565b90505f61148c61120d565b90505f611497610865565b90508082116114aa57505f949350505050565b5f6114b58284615341565b905083600301548110156114ce57505f95945050505050565b5f6114d882613519565b6040516307fa648b60e11b8152600481018290529091505f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630ff4c91690602401602060405180830381865afa158015611540573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611564919061537b565b604051634cc0764360e11b8152600481018290529091505f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639980ec8690602401602060405180830381865afa1580156115cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f0919061537b565b60048801549091505f906116299061161890600160601b900464ffffffffff166127106155ca565b839064ffffffffff166127106136bb565b600789015460068a015491925061164d916001600160a01b03908116911687613771565b600788015460068901545f916001600160a01b03908116916389fe039b9116611674610f41565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101899052606481018590526084016020604051808303815f875af11580156116cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f0919061537b565b90508a15611727575f61170282613833565b5060048b0154909150600160881b900460ff16156117255761172381613b0c565b505b505b60408051878152602081018390528c15158183015290517fd5f242140d3fe63188907c9238650c98a472bfe6acb958e063b419bdda27bf759181900360600190a1985050505050505050505b919050565b61178d335f356001600160e01b031916612338565b6117a95760405162461bcd60e51b8152600401610c84906154f6565b6001600160a01b038216611826576040515f90339083908381818185875af1925050503d805f81146117f6576040519150601f19603f3d011682016040523d82523d5f602084013e6117fb565b606091505b50509050805f90611820576040516351e1e32f60e11b8152600401610c849190614eb8565b50505050565b61183a6001600160a01b0383163383613c30565b5050565b5f611847613c56565b80549091506001600160a01b03163314806118dd5750600181015460405163b700961360e01b81526001600160a01b039091169063b70096139061189e90339030906001600160e01b03195f3516906004016155e7565b602060405180830381865afa1580156118b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190615614565b6118e5575f5ffd5b6001810180546001600160a01b0319166001600160a01b03841690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a35050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156119775750825b90505f826001600160401b031660011480156119925750303b155b9050811580156119a0575080155b156119be5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156119e857845460ff60401b1916600160401b1785555b5f6119f161327d565b90506119fd8c8c613c7a565b611a068e613c8c565b611a108d5f613ca0565b611a18613d47565b6004810180546006830180546001600160a01b03808f166001600160a01b031992831617909255600785018054928e1692909116919091179055600390920189905564ffffffffff8816600160601b0265ffffffffffff60601b1990921691909117600160881b1790558315611ac857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b5f5f611ae161327d565b600c01546001600160a01b031692915050565b5f611afd613c56565b546001600160a01b0316919050565b5f611b1561348d565b611b1d6134bd565b610f118383613d57565b60605f611b3261331a565b905080600401805461094090615392565b5f5f611b4d61327d565b905080600a018381548110611b6457611b64615367565b5f918252602090912001546001600160a01b03169392505050565b60605f611b8a61327d565b600a81018054604080516020808402820181019092528281529394508301828280156109b757602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611bbf57505050505091505090565b5f336109e081858561340c565b5f5f611bfe61327d565b905080600b018381548110611b6457611b64615367565b5f6109cd82600161333e565b5f611c2a61348d565b611c326134bd565b611c3d848484613da3565b949350505050565b611c5a335f356001600160e01b031916612338565b611c765760405162461bcd60e51b8152600401610c84906154f6565b5f611c7f61327d565b6001600160a01b0384165f9081526008820160205260409020600101549091506001600160f81b031615611cc857826040516333c8afdf60e21b8152600401610c849190614eb8565b816001600160f81b03165f03611cf1576040516366a8eba160e11b815260040160405180910390fd5b604080516060810182525f8082526001600160f81b03808616602080850191825260018587018181526001600160a01b038b1680875260088a01845297862096518755925192511515600160f81b02929093169190911793820193909355600b850180549182018155808352929091200180546001600160a01b0319169092179091555460141015611d96576040516354823faf60e01b815260040160405180910390fd5b6040516001600160f81b03831681526001600160a01b0384169033907f0c8ef1b5323e800b31265bc9cb993b71ca036ce428b71d14bc44121b36f8c8f79060200160405180910390a3505050565b5f611ded61348d565b611df56134bd565b611c3d848484613df0565b5f611e09613c56565b600101546001600160a01b0316919050565b5f6109cd825f61338d565b611e3b335f356001600160e01b031916612338565b611e575760405162461bcd60e51b8152600401610c84906154f6565b5f611e6061327d565b90505f5b82811015611820575f848483818110611e7f57611e7f615367565b905060600201803603810190611e95919061562f565b6020808201516001600160a01b0381165f9081526008870190925260408220929350919083604001516001811115611ecf57611ecf61567d565b0361200d5760018101548290600160f81b900460ff16611f035760405163693855e160e01b8152600401610c849190614eb8565b50805460018201545f91611f1f916001600160f81b0316615341565b905080845f01511115611f45576040516366a8eba160e11b815260040160405180910390fd5b83516006870154611f63916001600160a01b03909116908590613771565b83516040516255f9e960e71b81525f916001600160a01b03861691632afcf48091611f949160040190815260200190565b6020604051808303815f875af1158015611fb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd4919061537b565b905080875f015f828254611fe89190615354565b90915550508254819084905f90612000908490615354565b9091555061210b92505050565b6001836040015160018111156120255761202561567d565b0361210b5780548351839110156120505760405163d6a2c3e160e01b8152600401610c849190614eb8565b508251604051638ca1799560e01b81525f916001600160a01b03851691638ca17995916120839160040190815260200190565b6020604051808303815f875af115801561209f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c3919061537b565b905080865f015410156120d8575f86556120f0565b80865f015f8282546120ea9190615341565b90915550505b8154811115612101575f8255612109565b815481900382555b505b505050600101611e64565b5f6109cd6121238361141d565b5f61333e565b6040516307fa648b60e11b8152600481018390525f9081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630ff4c91690602401602060405180830381865afa158015612190573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b4919061537b565b90505f6121cc8285670de0b6b3a76400006001613e3d565b604051634cc0764360e11b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639980ec8690602401602060405180830381865afa158015612232573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4a919061537b565b5f5f61226061327d565b90505f805b600a83015481101561091d575f83600a01828154811061228757612287615367565b5f918252602091829020015460408051635c1548fb60e01b815290516001600160a01b0390921693508392635c1548fb926004808401938290030181865afa1580156122d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122f9919061537b565b6123039084615354565b925050600101612265565b5f6109cd8261141d565b5f5f5f612323610dbd565b915091506123318183613e7f565b9250505090565b5f5f612342613c56565b60018101549091506001600160a01b031680158015906123cc575060405163b700961360e01b81526001600160a01b0382169063b70096139061238d908890309089906004016155e7565b602060405180830381865afa1580156123a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123cc9190615614565b80610c4a575050546001600160a01b0390811693169290921492915050565b5f5f6123f561331a565b6001600160a01b039485165f90815260019190910160209081526040808320959096168252939093525050205490565b61243a335f356001600160e01b031916612338565b6124565760405162461bcd60e51b8152600401610c84906154f6565b5f61245f61327d565b60058101546040519192506001600160a01b03808516929116907faaebcf1bfa00580e41d966056b48521fa9f202645c86d4ddf28113e617c1b1d3905f90a360050180546001600160a01b0319166001600160a01b0392909216919091179055565b6124d6335f356001600160e01b031916612338565b6124f25760405162461bcd60e51b8152600401610c84906154f6565b5f6124fb613c56565b80546001600160a01b0319166001600160a01b03841690811782556040519192509033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b61255d335f356001600160e01b031916612338565b6125795760405162461bcd60e51b8152600401610c84906154f6565b5f61258261327d565b600b810154909150829060148211156125ae576040516354823faf60e01b815260040160405180910390fd5b5f816001600160401b038111156125c7576125c7614f6a565b6040519080825280602002602001820160405280156125f0578160200160208202803683370190505b5090505f836001600160401b0381111561260c5761260c614f6a565b604051908082528060200260200182016040528015612635578160200160208202803683370190505b5090505f5b84811015612723575f88888381811061265557612655615367565b9050602002013590505f87600b01828154811061267457612674615367565b5f9182526020909120015485516001600160a01b0390911691508590839081106126a0576126a0615367565b6020026020010151156126c857806040516304b07af760e11b8152600401610c849190614eb8565b60018583815181106126dc576126dc615367565b6020026020010190151590811515815250508084848151811061270157612701615367565b6001600160a01b0390921660209283029190910190910152505060010161263a565b505f5b8381101561283a5782818151811061274057612740615367565b6020026020010151612832575f86600b01828154811061276257612762615367565b5f918252602080832091909101546001600160a01b031680835260088a018252604092839020835160608101855281548082526001909201546001600160f81b03811694820194909452600160f81b90930460ff16151593830193909352925090156127e3578160405163526ded4d60e01b8152600401610c849190614eb8565b60208101516001600160f81b031615612811578160405163a545d1d360e01b8152600401610c849190614eb8565b506001600160a01b03165f9081526008870160205260408120818155600101555b600101612726565b50805161285090600b8701906020840190614d14565b50336001600160a01b03167f3b2328aceacb4d8f5fd7a386fe8f91f3e089c52cd45c6c8e1bd44690fd1253348260405161288a91906150f4565b60405180910390a250505050505050565b6128b0335f356001600160e01b031916612338565b6128cc5760405162461bcd60e51b8152600401610c84906154f6565b5f6128d561327d565b90505f5b828110156130b1575f8484838181106128f4576128f4615367565b90506060020180360381019061290a9190615691565b600a8401546040820151919250116129355760405163076dea5760e11b815260040160405180910390fd5b5f83600a0182604001518154811061294f5761294f615367565b5f9182526020808320909101546001600160a01b03168083526009870182526040808420815160808101835281546001600160801b038082168352600160801b91829004811696830196909652600192909201548086169382019390935291049092166060830152925090835160038111156129cd576129cd61567d565b03612b12575f826001600160a01b0316638081e1cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a0f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a33919061537b565b90508084602001511115612a5a57604051638ba84f2f60e01b815260040160405180910390fd5b612a7b838560200151612a6b610f41565b6001600160a01b03169190613771565b6020840151604051631b8fec7360e11b81525f916001600160a01b0386169163371fd8e691612ab09160040190815260200190565b6020604051808303815f875af1158015612acc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af0919061537b565b905080876001015f828254612b059190615341565b909155506130a692505050565b600383516003811115612b2757612b2761567d565b03612d91575f826001600160a01b0316633804ee196040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b69573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8d919061537b565b90508084602001511115612bb457604051634189603560e11b815260040160405180910390fd5b5f836001600160a01b0316638081e1cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bf1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c15919061537b565b90505f846001600160a01b0316635c1548fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c54573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c78919061537b565b90505f866020015183612c8b9190615354565b90505f612c988383613e7f565b905085604001516001600160801b0316811015612cc857604051637c9092c360e11b815260040160405180910390fd5b85606001516001600160801b0316811115612cf6576040516354bb231760e01b815260040160405180910390fd5b602088015160405163317afabb60e21b81525f916001600160a01b038a169163c5ebeaec91612d2b9160040190815260200190565b6020604051808303815f875af1158015612d47573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d6b919061537b565b9050808b6001015f828254612d809190615354565b909155506130a69650505050505050565b600183516003811115612da657612da661567d565b03612ed7575f826001600160a01b0316635c1548fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612de8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e0c919061537b565b825160208601519192506001600160801b031690612e2a9083615354565b1115612e495760405163b037652960e01b815260040160405180910390fd5b612e5a838560200151612a6b610f41565b8360200151866002015f828254612e719190615354565b9091555050602084015160405163bcc46e8360e01b815260048101919091526001600160a01b0384169063bcc46e83906024015f604051808303815f87803b158015612ebb575f5ffd5b505af1158015612ecd573d5f5f3e3d5ffd5b50505050506130a6565b600283516003811115612eec57612eec61567d565b036130a6575f826001600160a01b0316635c1548fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f2e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f52919061537b565b90508084602001511115612f795760405163d1e167f960e01b815260040160405180910390fd5b5f836001600160a01b0316638081e1cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fda919061537b565b90505f856020015183612fed9190615341565b90505f612ffa8284613e7f565b905084606001516001600160801b031681111561302a576040516354bb231760e01b815260040160405180910390fd5b8660200151896002015f8282546130419190615341565b90915550506020870151604051630646f82b60e31b815260048101919091526001600160a01b03871690633237c158906024015f604051808303815f87803b15801561308b575f5ffd5b505af115801561309d573d5f5f3e3d5ffd5b50505050505050505b5050506001016128d9565b505f5b600a820154811015611820575f82600a0182815481106130d6576130d6615367565b5f9182526020808320909101546040805163a5f352b760e01b815290516001600160a01b039092169450849263a5f352b7926004808401938290030181865afa158015613125573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613149919061537b565b9050670de0b6b3a764000081101561317457604051630610f1c760e51b815260040160405180910390fd5b50506001016130b4565b5f5f61318861120d565b90505f5f613194610dbd565b915091505f6131a16132a1565b90505f5f848611156131c9576131b78587615341565b90506131c2816109f6565b90506131e1565b6131d38686615341565b91506131de826109f6565b91505b81816131ed8587615354565b6131f79190615354565b6132019190615341565b965050505050505090565b60605f61321761327d565b600b81018054604080516020808402820181019092528281529394508301828280156109b757602002820191905f5260205f209081546001600160a01b03168152600190910190602001808311611bbf57505050505091505090565b61327b6134bd565b565b7f153ab1664096712f403bc9f042f813c9650d7d4446c74ae26b3c39b846e10d0090565b5f5f6132ab613469565b80546040516370a0823160e01b81529192506001600160a01b0316906370a08231906132db903090600401614eb8565b602060405180830381865afa1580156132f6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3b919061537b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090565b5f610f1161334a6107d5565b613355906001615354565b6133605f600a6156d8565b613368610da9565b6133729190615354565b85919085613e3d565b6133888383836001613fab565b505050565b5f610f1161339c82600a6156d8565b6133a4610da9565b6133ae9190615354565b6133b66107d5565b613372906001615354565b5f6133cc84846123eb565b90505f1981101561182057818110156133fe57828183604051637dc7a0d960e11b8152600401610c84939291906156e6565b61182084848484035f613fab565b6001600160a01b038316613435575f604051634b637e8f60e11b8152600401610c849190614eb8565b6001600160a01b03821661345e575f60405163ec442f0560e01b8152600401610c849190614eb8565b61338883838361408c565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090565b5f5160206158735f395f51905f525460ff161561327b5760405163d93c066560e01b815260040160405180910390fd5b6134c56141a1565b61327b6142d6565b5f5f6134d883610f6f565b90508084111561350157828482604051633c8097d960e11b8152600401610c84939291906156e6565b5f61350b85611e1b565b9050611c3d33858784614424565b5f5f61352361327d565b9050825f5b600b8301548110801561353a57505f82115b156136b3575f83600b01828154811061355557613555615367565b5f9182526020808320909101546001600160a01b0316808352600887018252604080842081516278744560e21b81529151929550939285926301e1d1149260048082019392918290030181865afa1580156135b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135d6919061537b565b9050801561369d575f8582116135ec57816135ee565b855b90506135fa8187615341565b604051638ca1799560e01b8152600481018390529096506001600160a01b03851690638ca17995906024016020604051808303815f875af1158015613641573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613665919061537b565b975080835f0154101561367a575f8355613682565b825481900383555b8654811115613693575f875561369b565b865481900387555b505b50505080806136ab90615707565b915050613528565b505050919050565b5f838302815f1985870982811083820303915050805f036136ef578382816136e5576136e56154cf565b0492505050610f11565b808411613706576137066003851502601118614470565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f836001600160a01b031663095ea7b3848460405160240161379492919061571f565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090506137cd8482614481565b6118205761382984856001600160a01b031663095ea7b3865f6040516024016137f792919061571f565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506144ca565b61182084826144ca565b5f5f5f61383e61327d565b9050835f5b600a8301548110801561385557505f82115b15613af6575f83600a01828154811061387057613870615367565b5f9182526020808320909101546001600160a01b03168083526009870182526040808420815160808101835281546001600160801b038082168352600160801b9182900481168388015260019390930154808416838601520490911660608201528151635c1548fb60e01b8152915192955093928592635c1548fb9260048082019392918290030181865afa15801561390b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061392f919061537b565b82519091506001600160801b031680821061394d5750505050613ae4565b8181035f81881161395e5787613960565b815b905080880397506139748682612a6b610f41565b61397e818b615354565b60405163bcc46e8360e01b815260048101839052909a506001600160a01b0387169063bcc46e83906024015f604051808303815f87803b1580156139c0575f5ffd5b505af11580156139d2573d5f5f3e3d5ffd5b505050505f6139ee8287602001516001600160801b0316612129565b90505f876001600160a01b0316633804ee196040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a2d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a51919061537b565b90505f818311613a615782613a63565b815b60405163317afabb60e21b8152600481018290529091506001600160a01b038a169063c5ebeaec906024016020604051808303815f875af1158015613aaa573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ace919061537b565b613ad8908f615354565b9d505050505050505050505b80613aee81615707565b915050613843565b5050600181018390556002018190559092909150565b5f5f613b1661327d565b600c8101546001600160a01b03165f81815260088301602052604081208054600182015494955091938793928591613b5791906001600160f81b0316615341565b90505f818511613b675784613b69565b815b9050613b758186615341565b6006880154909550613b91906001600160a01b03168583613771565b6040516255f9e960e71b8152600481018290525f906001600160a01b03861690632afcf480906024016020604051808303815f875af1158015613bd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bfa919061537b565b9050613c068188615354565b965080845f015f828254613c1a9190615354565b9091555050509585905550929695505050505050565b61338883846001600160a01b031663a9059cbb85856040516024016137f792919061571f565b7fdd3fd67aef415aded9493b31ad20a02d2991d4bb2760431cc729821271eaea0090565b613c8261452d565b61183a8282614576565b613c9461452d565b613c9d816145a6565b50565b613ca861452d565b5f613cb1613c56565b80546001600160a01b03199081166001600160a01b038681169182178455600184018054909316908616179091556040519192509033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a36040516001600160a01b0383169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a3505050565b613d4f61452d565b61327b614613565b5f5f613d6283610f6f565b905080841115613d8b5782848260405163284ff66760e01b8152600401610c84939291906156e6565b5f613d9585611c15565b9050611c3d33858388614424565b5f5f613dae83612116565b905080851115613dd757828582604051633fa733bb60e21b8152600401610c84939291906156e6565b5f613de1866109ea565b9050610c4a3386868985614633565b5f5f613dfb8361230e565b905080851115613e2457828582604051632e52afbb60e21b8152600401610c84939291906156e6565b5f613e2e866109c2565b9050610c4a338686848a614633565b5f613e6a613e4a836147e7565b8015613e6557505f8480613e6057613e606154cf565b868809115b151590565b613e758686866136bb565b610c4a9190615354565b6040516307fa648b60e11b8152600481018290525f9081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630ff4c91690602401602060405180830381865afa158015613ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f0a919061537b565b6040516307fa648b60e11b8152600481018690529091505f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630ff4c91690602401602060405180830381865afa158015613f72573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f96919061537b565b9050610c4a82670de0b6b3a7640000836136bb565b5f613fb461331a565b90506001600160a01b038516613fdf575f60405163e602df0560e01b8152600401610c849190614eb8565b6001600160a01b038416614008575f604051634a1406b160e11b8152600401610c849190614eb8565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561408557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161407c91815260200190565b60405180910390a35b5050505050565b5f61409561331a565b90506001600160a01b0384166140c35781816002015f8282546140b89190615354565b909155506141209050565b6001600160a01b0384165f90815260208290526040902054828110156141025784818460405163391434e360e21b8152600401610c84939291906156e6565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661413e57600281018054839003905561415c565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d9b91815260200190565b5f6141aa61327d565b90505f80805b600a8401548110156142c5575f84600a0182815481106141d2576141d2615367565b5f918252602091829020015460408051638081e1cf60e01b815290516001600160a01b0390921693508392638081e1cf926004808401938290030181865afa158015614220573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614244919061537b565b61424e9085615354565b9350806001600160a01b0316635c1548fb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561428c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142b0919061537b565b6142ba9084615354565b9250506001016141b0565b506001830191909155600290910155565b5f6142df61327d565b90505f805b600b83015481101561441f575f83600b01828154811061430657614306615367565b5f918252602080832091909101546001600160a01b031680835260088701825260408084208151606081018352815481526001909101546001600160f81b03811682860152600160f81b900460ff1615158183015281516278744560e21b81529151929550939285926301e1d1149260048082019392918290030181865afa158015614394573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143b8919061537b565b90506143c48186615354565b82519095505f908190831461440e5783518311156143ea578351830391909101906143f1565b8351839003015b6143fb8183615341565b8451859061440a908390615354565b9052505b5050600190930192506142e4915050565b509055565b5f61442d61327d565b905061443b85858585614813565b5f61444584613833565b506004830154909150600160881b900460ff16156144685761446681613b0c565b505b505050505050565b634e487b715f52806020526024601cfd5b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156144c0575081156144b257806001146144c0565b5f866001600160a01b03163b115b9695505050505050565b5f5f60205f8451602086015f885af1806144e9576040513d5f823e3d81fd5b50505f513d9150811561450057806001141561450d565b6001600160a01b0384163b155b156118205783604051635274afe760e01b8152600401610c849190614eb8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661327b57604051631afcd79f60e31b815260040160405180910390fd5b61457e61452d565b5f61458761331a565b905060038101614597848261577c565b5060048101611820838261577c565b6145ae61452d565b5f6145b7613469565b90505f5f6145c48461488e565b91509150816145d45760126145d6565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61461b61452d565b5f5160206158735f395f51905f52805460ff19169055565b5f61463c61327d565b90505f6146476132a1565b9050838110156147da575f61466461465f8387615341565b614964565b90505f5b81518110156147d7575f82828151811061468457614684615367565b602002602001015190505f815f015111156147ce575f6146a6825f0151613519565b604083015160068801549192506146c7916001600160a01b03169083613771565b6040808301519051631b8fec7360e11b8152600481018390525f916001600160a01b03169063371fd8e6906024016020604051808303815f875af1158015614711573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614735919061537b565b905080876001015f82825461474a9190615341565b909155505060208301516002880180545f90614767908490615341565b909155505060408381015160208501519151630646f82b60e31b815260048101929092526001600160a01b031690633237c158906024015f604051808303815f87803b1580156147b5575f5ffd5b505af11580156147c7573d5f5f3e3d5ffd5b5050505050505b50600101614668565b50505b6144668787878787614bbc565b5f60028260038111156147fc576147fc61567d565b6148069190615836565b60ff166001149050919050565b5f61481c613469565b8054909150614836906001600160a01b0316863086614c73565b6148408483614cac565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7858560405161407c929190918252602082015260400190565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916148d491615857565b5f60405180830381855afa9150503d805f811461490c576040519150601f19603f3d011682016040523d82523d5f602084013e614911565b606091505b509150915081801561492557506020815110155b15614958575f8180602001905181019061493f919061537b565b905060ff8111614956576001969095509350505050565b505b505f9485945092505050565b60605f61496f61327d565b600a81015490915083905f906001600160401b0381111561499257614992614f6a565b6040519080825280602002602001820160405280156149ed57816020015b6149da60405180606001604052805f81526020015f81526020015f6001600160a01b031681525090565b8152602001906001900390816149b05790505b5090505f5b600a84015481108015614a0457505f83115b15614bb3575f84600a018281548110614a1f57614a1f615367565b5f91825260208083209091015460408051638081e1cf60e01b815290516001600160a01b0390921694508492638081e1cf926004808401938290030181865afa158015614a6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a92919061537b565b90505f826001600160a01b0316635c1548fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ad1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614af5919061537b565b9050808610614b495780860395506040518060600160405280838152602001828152602001846001600160a01b0316815250858581518110614b3957614b39615367565b6020026020010181905250614b9d565b5f614b558388846136bb565b90506040518060600160405280828152602001888152602001856001600160a01b0316815250868681518110614b8d57614b8d615367565b60200260200101819052505f9650505b5050508080614bab90615707565b9150506149f2565b50949350505050565b5f614bc5613469565b9050836001600160a01b0316866001600160a01b031614614beb57614beb8487846133c1565b614bf58483614ce0565b8054614c0b906001600160a01b03168685613c30565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051614c63929190918252602082015260400190565b60405180910390a4505050505050565b6040516001600160a01b0384811660248301528381166044830152606482018390526118209186918216906323b872dd906084016137f7565b6001600160a01b038216614cd5575f60405163ec442f0560e01b8152600401610c849190614eb8565b61183a5f838361408c565b6001600160a01b038216614d09575f604051634b637e8f60e11b8152600401610c849190614eb8565b61183a825f8361408c565b828054828255905f5260205f20908101928215614d67579160200282015b82811115614d6757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614d32565b50614d73929150614d77565b5090565b5b80821115614d73575f8155600101614d78565b5f5b83811015614da5578181015183820152602001614d8d565b50505f910152565b602081525f8251806020840152614dcb816040850160208701614d8b565b601f01601f19169190910160400192915050565b5f60208284031215614def575f5ffd5b5035919050565b6001600160a01b0381168114613c9d575f5ffd5b5f5f60408385031215614e1b575f5ffd5b8235614e2681614df6565b946020939093013593505050565b5f5f5f83850360c0811215614e47575f5ffd5b843593506020850135614e5981614df6565b92506080603f1982011215614e6c575f5ffd5b506040840190509250925092565b5f5f5f60608486031215614e8c575f5ffd5b8335614e9781614df6565b92506020840135614ea781614df6565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f60208284031215614edc575f5ffd5b8135610f1181614df6565b803564ffffffffff81168114611773575f5ffd5b5f60208284031215614f0b575f5ffd5b610f1182614ee7565b8015158114613c9d575f5ffd5b5f60208284031215614f31575f5ffd5b8135610f1181614f14565b5f5f60408385031215614f4d575f5ffd5b823591506020830135614f5f81614df6565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614fa057614fa0614f6a565b60405290565b5f82601f830112614fb5575f5ffd5b81356001600160401b03811115614fce57614fce614f6a565b604051601f8201601f19908116603f011681016001600160401b0381118282101715614ffc57614ffc614f6a565b604052818152838201602001851015615013575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f5f5f5f610100898b031215615047575f5ffd5b883561505281614df6565b9750602089013561506281614df6565b965060408901356001600160401b0381111561507c575f5ffd5b6150888b828c01614fa6565b96505060608901356001600160401b038111156150a3575f5ffd5b6150af8b828c01614fa6565b95505060808901356150c081614df6565b935060a08901356150d081614df6565b925060c089013591506150e560e08a01614ee7565b90509295985092959890939650565b602080825282518282018190525f918401906040840190835b818110156151345783516001600160a01b031683526020938401939092019160010161510d565b509095945050505050565b5f5f5f60608486031215615151575f5ffd5b83359250602084013561516381614df6565b9150604084013561517381614df6565b809150509250925092565b5f5f6040838503121561518f575f5ffd5b823561519a81614df6565b915060208301356001600160f81b0381168114614f5f575f5ffd5b5f5f83601f8401126151c5575f5ffd5b5081356001600160401b038111156151db575f5ffd5b6020830191508360206060830285010111156151f5575f5ffd5b9250929050565b5f5f6020838503121561520d575f5ffd5b82356001600160401b03811115615222575f5ffd5b61522e858286016151b5565b90969095509350505050565b5f5f6040838503121561524b575f5ffd5b50508035926020909101359150565b5f5f6040838503121561526b575f5ffd5b823561527681614df6565b915060208301356001600160e01b031981168114614f5f575f5ffd5b5f5f604083850312156152a3575f5ffd5b82356152ae81614df6565b91506020830135614f5f81614df6565b5f5f602083850312156152cf575f5ffd5b82356001600160401b038111156152e4575f5ffd5b8301601f810185136152f4575f5ffd5b80356001600160401b03811115615309575f5ffd5b8560208260051b840101111561531d575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109cd576109cd61532d565b808201808211156109cd576109cd61532d565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561538b575f5ffd5b5051919050565b600181811c908216806153a657607f821691505b6020821081036153c457634e487b7160e01b5f52602260045260245ffd5b50919050565b6001815b6001841115615405578085048111156153e9576153e961532d565b60018416156153f757908102905b60019390931c9280026153ce565b935093915050565b5f8261541b575060016109cd565b8161542757505f6109cd565b816001811461543d576002811461544757615463565b60019150506109cd565b60ff8411156154585761545861532d565b50506001821b6109cd565b5060208310610133831016604e8410600b8410161715615486575081810a6109cd565b6154925f1984846153ca565b805f19048211156154a5576154a561532d565b029392505050565b5f610f11838361540d565b80820281158282048414176109cd576109cd61532d565b634e487b7160e01b5f52601260045260245ffd5b5f826154f1576154f16154cf565b500490565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b5f81356001600160801b03811681146109cd575f5ffd5b61555c61553f8361551c565b82546001600160801b0319166001600160801b0391909116178255565b61558f61556b6020840161551c565b8280546001600160801b031660809290921b6001600160801b031916919091179055565b600181016155a261553f6040850161551c565b61338861556b6060850161551c565b60ff81811683821601908111156109cd576109cd61532d565b64ffffffffff82811682821603908111156109cd576109cd61532d565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215615624575f5ffd5b8151610f1181614f14565b5f6060828403128015615640575f5ffd5b50615649614f7e565b82358152602083013561565b81614df6565b6020820152604083013560028110615671575f5ffd5b60408201529392505050565b634e487b7160e01b5f52602160045260245ffd5b5f60608284031280156156a2575f5ffd5b506156ab614f7e565b8235600481106156b9575f5ffd5b8152602083810135908201526040928301359281019290925250919050565b5f610f1160ff84168361540d565b6001600160a01b039390931683526020830191909152604082015260600190565b5f600182016157185761571861532d565b5060010190565b6001600160a01b03929092168252602082015260400190565b601f82111561338857805f5260205f20601f840160051c8101602085101561575d5750805b601f840160051c820191505b81811015614085575f8155600101615769565b81516001600160401b0381111561579557615795614f6a565b6157a9816157a38454615392565b84615738565b6020601f8211600181146157db575f83156157c45750848201515b5f19600385901b1c1916600184901b178455614085565b5f84815260208120601f198516915b8281101561580a57878501518255602094850194600190920191016157ea565b508482101561582757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60ff831680615848576158486154cf565b8060ff84160691505092915050565b5f8251615868818460208701614d8b565b919091019291505056fecd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a164736f6c634300081c000a0000000000000000000000007a4fd3c39a2a04ce82df8c3c0ca349bda3c31e2e000000000000000000000000338e795e276ef691f12156dd2b9b0685ca477e1e