0 txs
0 calls
constructor
constructor(address _asset, address _feeProvider, address _feeRecipient)
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
feePrecision
viewfunction feePrecision() view returns (uint32)
feeProvider
viewfunction feeProvider() view returns (address)
feeRecipient
viewfunction feeRecipient() view returns (address)
getBalanceInUnderlying
viewfunction getBalanceInUnderlying(address account) view returns (uint256)
getBalanceOfPool
viewfunction getBalanceOfPool(address pool) view returns (uint256)
getDepositFee
viewfunction getDepositFee(address account) view returns (uint32)
getLastTimeManagementFeeCollected
viewfunction getLastTimeManagementFeeCollected() view returns (uint256)
getLendingPoolCount
viewfunction getLendingPoolCount() view returns (uint256)
getManagementFee
viewfunction getManagementFee() view returns (uint32)
getPerformanceFee
viewfunction getPerformanceFee(address account) view returns (uint32)
getPools
viewfunction getPools() view returns (address[])
getProfit
viewfunction getProfit(address account) view returns (uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getSharePriceOfPool
viewfunction getSharePriceOfPool(address pool) view returns (uint256)
getWaterline
viewfunction getWaterline(address account) view returns (uint256)
getWithdrawalFee
viewfunction getWithdrawalFee(address account) view returns (uint32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
lendingShares
viewfunction lendingShares(address) view returns (uint256)
MANAGER_ROLE
viewfunction MANAGER_ROLE() view returns (bytes32)
maxPools
viewfunction maxPools() view returns (uint256)
maxSlippage
viewfunction maxSlippage() view returns (uint32)
name
viewfunction name() view returns (string)
oracles
viewfunction oracles(address token) view returns (address oracle)
paused
viewfunction paused() view returns (bool)
quoteWithdrawalFee
viewfunction quoteWithdrawalFee(address account) view returns (uint256)
sharePrice
viewfunction sharePrice() view returns (uint256)
slippagePrecision
viewfunction slippagePrecision() view returns (uint32)
STRATEGIST_ROLE
viewfunction STRATEGIST_ROLE() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
swapPools
viewfunction swapPools(address from, address to) view returns (address pool)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalLendingShares
viewfunction totalLendingShares() view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256)
underlyingTVL
viewfunction underlyingTVL() view returns (uint256)
addLendingPools
nonpayablefunction addLendingPools(address[] poolAddresses)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
collectManagementFee
nonpayablefunction collectManagementFee()
collectPerformanceFee
nonpayablefunction collectPerformanceFee(address[] accounts)
deposit
nonpayablefunction deposit(uint256 assets, address receiver, uint256 minShares) returns (uint256 shares)
emergencyWithdraw
nonpayablefunction emergencyWithdraw(address[] accounts)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address admin, string name, string symbol, address strategist, address manager)
pause
nonpayablefunction pause()
rebalance
nonpayablefunction rebalance(address from, address to, uint256 sharesToWithdraw)
rebalanceAuto
nonpayablefunction rebalanceAuto()
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address owner, uint256 minAssets) returns (uint256 assets)
removeLendingPools
nonpayablefunction removeLendingPools(address[] poolAddresses)
removeSwapPools
nonpayablefunction removeSwapPools(address[] from, address[] to)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setLendingShares
nonpayablefunction setLendingShares(address[] poolAddresses, uint256[] newLendingShares)
setMaxSlippage
nonpayablefunction setMaxSlippage(uint32 _maxSlippage)
setOracles
nonpayablefunction setOracles(address[] tokens, address[] oracles_)
setSwapPools
nonpayablefunction setSwapPools(address[] from, address[] to, address[] _swapPools)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
uniswapV3SwapCallback
nonpayablefunction uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes data)
unpause
nonpayablefunction unpause()
updateFeeDiscountDeposit
nonpayablefunction updateFeeDiscountDeposit(uint256 assets, address receiver, uint256 minShares, uint256 stakedAmount, uint256 deadline, bytes signature) returns (uint256 shares)
withdrawFunds
nonpayablefunction withdrawFunds(address token)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
Deposit
event Deposit(address indexed sender, address indexed receiver, uint256 assets, uint256 shares, uint256 depositFee, uint256 totalSupplyBefore, uint256 tvlBefore)
Initialized
event Initialized(uint64 version)
LendingPoolAdded
event LendingPoolAdded(address indexed poolAddress)
LendingPoolRemoved
event LendingPoolRemoved(address indexed poolAddress)
LendingPoolUpdated
event LendingPoolUpdated(address indexed poolAddress, uint256 newLendingShare)
ManagementFeeCollected
event ManagementFeeCollected(uint256 shares)
Paused
event Paused(address account)
PerformanceFeeCollected
event PerformanceFeeCollected(address indexed owner, uint256 fee)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 shares, uint256 assets, uint256 withdrawalFee, uint256 totalSupplyBefore, uint256 tvlBefore)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
ArraysLengthMismatch
error ArraysLengthMismatch()
ChainlinkPriceReportingZero
error ChainlinkPriceReportingZero()
DeviationNotNegative
error DeviationNotNegative()
DeviationNotPositive
error DeviationNotPositive()
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)
ExpectedPause
error ExpectedPause()
FailedInnerCall
error FailedInnerCall()
InvalidFromPoolAddress
error InvalidFromPoolAddress()
InvalidInitialization
error InvalidInitialization()
InvalidPoolAddress
error InvalidPoolAddress()
InvalidSwapCallbackCaller
error InvalidSwapCallbackCaller()
InvalidTokenToWithdraw
error InvalidTokenToWithdraw(address token)
InvalidToPoolAddress
error InvalidToPoolAddress()
NoAvailablePools
error NoAvailablePools()
NotInitializing
error NotInitializing()
RebalanceFailedForFromPool
error RebalanceFailedForFromPool()
RebalanceFailedForToPool
error RebalanceFailedForToPool()
RoundNotComplete
error RoundNotComplete()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
Slippage
error Slippage()
StalePrice
error StalePrice()
creation bytecode
0x610120604052348015610010575f80fd5b5060405161614938038061614983398101604081905261002f91610219565b828282826001600160a01b03166080816001600160a01b031681525050826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ac9190610263565b60ff1660a0526001600160a01b0382161561013f576001600160a01b0380831660c081905290821660e0526040805163094df4c960e21b81529051632537d324916004808201926020929091908290030181865afa158015610110573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610134919061028a565b63ffffffff16610100525b5061014b915050610153565b5050506102ad565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156101a35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102025780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114610202575f80fd5b5f805f6060848603121561022b575f80fd5b835161023681610205565b602085015190935061024781610205565b604085015190925061025881610205565b809150509250925092565b5f60208284031215610273575f80fd5b815160ff81168114610283575f80fd5b9392505050565b5f6020828403121561029a575f80fd5b815163ffffffff81168114610283575f80fd5b60805160a05160c05160e05161010051615d246104255f395f818161058301528181610b1901528181610bf201528181611b4101528181612d5901528181613cb7015281816142d1015261446b01525f818161063b01528181611bd101528181612f5c01528181613d2e015281816143bf015261455401525f818161061401528181610a8c01528181610b4101528181610c1a015281816114bf01528181611a5e01528181611aba01528181611c32015281816120d4015281816126850152818161275401528181612d800152818161310301528181613c3f015281816142f9015261448e01525f8181610541015281816119580152818161199c01528181612f8801528181612fd8015281816134cb01526148a101525f81816105cf015281816120a10152818161298e01528181612abe01528181612c0c0152818161316501528181613466015281816134a201528181613d0c01528181613e0c015281816141ba0152818161439d01526145320152615d245ff3fe608060405234801561000f575f80fd5b50600436106103d4575f3560e01c80638726972911610200578063bc157ac11161011f578063d547741f116100b4578063f42844a611610084578063f42844a614610962578063f63f97971461096a578063f76ee29a14610973578063f78b881214610986578063fa461e3314610999575f80fd5b8063d547741f146108d1578063dd62ed3e146108e4578063de0d3e771461093b578063ec87621c1461094e575f80fd5b8063c600e1dc116100ef578063c600e1dc14610885578063c9fa253e14610898578063ce08b59b146108ab578063d3fa3483146108be575f80fd5b8063bc157ac114610837578063bc4dc47c1461084a578063c0413fb01461085d578063c0ff5f2314610866575f80fd5b80639c2b1a9511610195578063a9059cbb11610165578063a9059cbb146107d6578063ad3ea037146107e9578063addd5099146107fc578063b3f865f714610824575f80fd5b80639c2b1a951461078d5780639f40a7b314610795578063a217fddf146107a8578063a378a324146107af575f80fd5b806393c4969c116101d057806393c4969c1461076157806395d89b411461076a5780639b2eb34d146107725780639c016ffd14610785575f80fd5b806387269729146107035780638bfe0df11461070b5780638c04166f1461073e57806391d148541461074e575f80fd5b8063313ce567116102f75780635722dee01161028c5780636cf1dbed1161025c5780636cf1dbed146106af57806370a08231146106c257806378756a2c146106d557806378d5f781146106e85780638456cb59146106fb575f80fd5b80635722dee01461065d5780635c975abb14610670578063673a2a1f1461068757806368742da61461069c575f80fd5b806338d52e0f116102c757806338d52e0f146105cd5780633f4ba83a146106075780634066fdea1461060f5780634690484014610636575f80fd5b8063313ce5671461053a578063327503df1461056b57806335ff1e281461057e57806336568abe146105ba575f80fd5b8063095ea7b31161036d578063184d35221161033d578063184d3522146104de57806323b872dd146104e6578063248a9ca3146104f95780632f2ff15d14610527575f80fd5b8063095ea7b314610491578063098a91d2146104a45780630b7b3dc7146104b757806318160ddd146104ca575f80fd5b806303949bf9116103a857806303949bf91461044e57806304a8d4871461046157806306fdde031461047457806308f03f5414610489575f80fd5b8062eebff1146103d857806301c1dfba1461040e57806301e1d1141461042357806301ffc9a71461042b575b5f80fd5b7f3723283c6c153be31b346222d4cdfc82d474472705dbc1bceef0b3066f389b01545b6040519081526020015b60405180910390f35b61042161041c366004614ffd565b6109ac565b005b6103fb610a0c565b61043e61043936600461502f565b610a53565b6040519015158152602001610405565b6103fb61045c366004615056565b610a89565b61042161046f366004614ffd565b610cbd565b61047c610e24565b604051610405919061509f565b6103fb610ee4565b61043e61049f3660046150b1565b61101e565b6104216104b23660046150db565b611035565b6103fb6104c5366004615056565b6111eb565b5f80516020615c4f833981519152546103fb565b6103fb61121b565b61043e6104f4366004615140565b61122b565b6103fb61050736600461517e565b5f9081525f80516020615c8f833981519152602052604090206001015490565b610421610535366004615195565b611250565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610405565b6104216105793660046151c3565b611280565b6105a57f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610405565b6104216105c8366004615195565b611456565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b039091168152602001610405565b610421611489565b6105ef7f000000000000000000000000000000000000000000000000000000000000000081565b6105ef7f000000000000000000000000000000000000000000000000000000000000000081565b6105a561066b366004615056565b61149e565b5f80516020615caf8339815191525460ff1661043e565b61068f61152b565b6040516104059190615281565b6104216106aa366004615056565b611537565b6104216106bd366004615343565b61169c565b6103fb6106d0366004615056565b6117ee565b6103fb6106e3366004615056565b611803565b6104216106f6366004615421565b611864565b610421611916565b6103fb611928565b6105ef61071936600461548d565b600460209081525f92835260408084209091529082529020546001600160a01b031681565b6006546105a59063ffffffff1681565b61043e61075c366004615195565b6119c9565b6105a561271081565b61047c6119ff565b6105a5610780366004615056565b611a3d565b610421611a8f565b6105a5611c2f565b6103fb6107a33660046154b9565b611cb0565b6103fb5f81565b6103fb7f17a8e30262c1f919c33056d877a3c22b95c2f5e4dac44683c1c2323cd79fbdb081565b61043e6107e43660046150b1565b611d31565b6104216107f736600461550f565b611d3e565b6105ef61080a366004615056565b60056020525f90815260409020546001600160a01b031681565b610421610832366004615140565b611d72565b6103fb61084536600461552a565b612062565b610421610858366004614ffd565b61224f565b6103fb6103e881565b6103fb610874366004615056565b5f6020819052908152604090205481565b6103fb610893366004615056565b6123d1565b6103fb6108a6366004615056565b612433565b6104216108b936600461554e565b61243d565b6103fb6108cc3660046155ed565b61266c565b6104216108df366004615195565b612703565b6103fb6108f236600461548d565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6105a5610949366004615056565b612733565b6103fb5f80516020615c6f83398151915281565b610421612785565b6103fb60035481565b610421610981366004614ffd565b612cbc565b6103fb610994366004615056565b612fd2565b6104216109a7366004615670565b613023565b5f6109b6816130c7565b5f5b8251811015610a07575f8382815181106109d4576109d46156ec565b602002602001015190505f6109e8826117ee565b905080156109fd576109fb8183846130d1565b505b50506001016109b8565b505050565b5f80805b610a1a600161320d565b811015610a4d575f610a2d600183613216565b9050610a3881613221565b610a429084615714565b925050600101610a10565b50919050565b5f6001600160e01b03198216637965db0b60e01b1480610a8357506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610abf57505f919050565b5f80516020615ccf8339815191525f610ad784612fd2565b6001600160a01b0385165f9081526020849052604081205491925081831115610bd357604051639b2eb34d60e01b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000063ffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690639b2eb34d90602401602060405180830381865afa158015610b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bac9190615727565b63ffffffff16610bbc8486615742565b610bc69190615755565b610bd0919061576c565b90505b6040516302b916f760e51b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000063ffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690635722dee090602401602060405180830381865afa158015610c61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c859190615727565b63ffffffff16610c958386615742565b610c9f9190615755565b610ca9919061576c565b610cb39082615714565b9695505050505050565b7f17a8e30262c1f919c33056d877a3c22b95c2f5e4dac44683c1c2323cd79fbdb0610ce7816130c7565b5f5b8251811015610a0757610d1f838281518110610d0757610d076156ec565b6020026020010151600161339290919063ffffffff16565b15610e1c57610dcc838281518110610d3957610d396156ec565b60200260200101515f19858481518110610d5557610d556156ec565b60200260200101516001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbc919061578b565b6001600160a01b031691906133a6565b828181518110610dde57610dde6156ec565b60200260200101516001600160a01b03167f6aa377dcdf28c33e1184c478fa764215ea635c08c63bfd775541de1ba975fd5860405160405180910390a25b600101610ce9565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020615c2f83398151915291610e62906157a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8e906157a6565b8015610ed95780601f10610eb057610100808354040283529160200191610ed9565b820191905f5260205f20905b815481529060010190602001808311610ebc57829003601f168201915b505050505091505090565b5f805f5b610ef2600161320d565b811015610a4d575f610f05600183613216565b9050611009816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6a919061578b565b6003545f80856001600160a01b03166001600160a01b031681526020019081526020015f2054846001600160a01b03166308f03f546040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff091906157d8565b610ffa9190615755565b611004919061576c565b613463565b6110139084615714565b925050600101610ee8565b5f3361102b818585613594565b5060019392505050565b5f80516020615c6f83398151915261104c816130c7565b5f5b83518110156111e557828181518110611069576110696156ec565b60200260200101516001600160a01b031684828151811061108c5761108c6156ec565b60200260200101516001600160a01b03161015611142575f60045f8684815181106110b9576110b96156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f8584815181106110f3576110f36156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506111dd565b5f60045f858481518110611158576111586156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f868481518110611192576111926156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b60010161104e565b50505050565b5f805f80516020615ccf8339815191525b6001600160a01b039093165f9081526020939093525050604090205490565b5f611226600161320d565b905090565b5f336112388582856135a1565b611243858585613635565b60019150505b9392505050565b5f8281525f80516020615c8f8339815191526020526040902060010154611276816130c7565b6111e58383613692565b5f80516020615c6f833981519152611297816130c7565b81518351146112b9576040516307e11acb60e51b815260040160405180910390fd5b5f5b83518110156111e5576112f18482815181106112d9576112d96156ec565b6020026020010151600161373a90919063ffffffff16565b61130e5760405163da6a56c360e01b815260040160405180910390fd5b828181518110611320576113206156ec565b60200260200101515f8086848151811061133c5761133c6156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20546003546113719190615742565b61137b9190615714565b6003558251839082908110611392576113926156ec565b60200260200101515f808684815181106113ae576113ae6156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20819055508381815181106113eb576113eb6156ec565b60200260200101516001600160a01b03167f81cd083a3296187d42bd7efd7124373051a2ad01d03ca7c4c5326465cbceffc484838151811061142f5761142f6156ec565b602002602001015160405161144691815260200190565b60405180910390a26001016112bb565b6001600160a01b038116331461147f5760405163334bd91960e11b815260040160405180910390fd5b610a07828261375b565b5f611493816130c7565b61149b6137d4565b50565b6040516302b916f760e51b81526001600160a01b0382811660048301525f917f000000000000000000000000000000000000000000000000000000000000000090911690635722dee0906024015b602060405180830381865afa158015611507573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a839190615727565b60606112266001613833565b5f611541816130c7565b6001600160a01b0382166115e9576040515f90339047908381818185875af1925050503d805f811461158e576040519150601f19603f3d011682016040523d82523d5f602084013e611593565b606091505b5050905080610a075760405162461bcd60e51b815260206004820152601260248201527f6661696c656420746f2073656e6420455448000000000000000000000000000060448201526064015b60405180910390fd5b6115f28261383f565b15611678576040516370a0823160e01b81523060048201526116749033906001600160a01b038516906370a0823190602401602060405180830381865afa15801561163f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166391906157d8565b6001600160a01b0385169190613852565b5050565b60405163b8f73f4b60e01b81526001600160a01b03831660048201526024016115e0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156116e15750825b90505f8267ffffffffffffffff1660011480156116fd5750303b155b90508115801561170b575080155b156117295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561175857845468ff00000000000000001916600160401b1785555b6117628989613883565b61176c8a87613895565b6117967f17a8e30262c1f919c33056d877a3c22b95c2f5e4dac44683c1c2323cd79fbdb088613692565b5083156117e257845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f805f80516020615c2f8339815191526111fc565b5f816001600160a01b031663872697296040518163ffffffff1660e01b8152600401602060405180830381865afa158015611840573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8391906157d8565b5f80516020615c6f83398151915261187b816130c7565b5f5b8481101561190e57838382818110611897576118976156ec565b90506020020160208101906118ac9190615056565b60055f8888858181106118c1576118c16156ec565b90506020020160208101906118d69190615056565b6001600160a01b03908116825260208201929092526040015f2080546001600160a01b0319169290911691909117905560010161187d565b505050505050565b5f611920816130c7565b61149b6138f7565b5f80611932610a0c565b90505f61194a5f80516020615c4f8339815191525490565b90508015611997578061197e7f0000000000000000000000000000000000000000000000000000000000000000600a6158ca565b6119889084615755565b611992919061576c565b6119c2565b6119c27f0000000000000000000000000000000000000000000000000000000000000000600a6158ca565b9250505090565b5f9182525f80516020615c8f833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020615c2f83398151915291610e62906157a6565b604051639b2eb34d60e01b81526001600160a01b0382811660048301525f917f000000000000000000000000000000000000000000000000000000000000000090911690639b2eb34d906024016114ec565b5f80516020615c6f833981519152611aa6816130c7565b5f5f80516020615ccf83398151915290505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639c2b1a956040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b389190615727565b90505f611b65827f00000000000000000000000000000000000000000000000000000000000000006158d8565b63ffffffff166301e13380846001015442611b809190615742565b8463ffffffff16611b9c5f80516020615c4f8339815191525490565b611ba69190615755565b611bb09190615755565b611bba919061576c565b611bc4919061576c565b4260018501559050611bf67f00000000000000000000000000000000000000000000000000000000000000008261393f565b6040518181527f147fac6415bee3006ba6002a9a6636f492d311690c9e52a2421afc6392e0fb959060200160405180910390a150505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639c2b1a956040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c8c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112269190615727565b5f336001600160a01b03841614611ccc57611ccc8333876135a1565b611cd78585856130d1565b905081811015611d295760405162461bcd60e51b815260206004820152601060248201527f435942524f3a206d696e4173736574730000000000000000000000000000000060448201526064016115e0565b949350505050565b5f3361102b818585613635565b5f80516020615c6f833981519152611d55816130c7565b506006805463ffffffff191663ffffffff92909216919091179055565b5f80516020615c6f833981519152611d89816130c7565b611d9460018561373a565b611db1576040516328862e8560e11b815260040160405180910390fd5b611dbc60018461373a565b611dd95760405163d8f360ef60e01b815260040160405180910390fd5b5f611de385613973565b90505f611def85613973565b90505f8213611e1157604051633e53fae960e21b815260040160405180910390fd5b5f811315611e4b576040517fff2c5b7d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b031663bc157ac1611f9e886001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebd919061578b565b886001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1d919061578b565b604051639f40a7b360e01b8152600481018a9052306024820181905260448201525f60648201526001600160a01b038c1690639f40a7b3906084015b6020604051808303815f875af1158015611f75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9991906157d8565b6139c4565b6040516001600160e01b031960e084901b16815260048101919091523060248201525f60448201526064016020604051808303815f875af1158015611fe5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200991906157d8565b5061201386613973565b915061201e85613973565b90505f82121561204157604051635435c5cb60e11b815260040160405180910390fd5b5f81131561190e576040516302a1b4cd60e01b815260040160405180910390fd5b5f61206b613ba8565b835f0361207957505f611249565b5f612082613bda565b90505f61209a5f80516020615c4f8339815191525490565b90506120d17f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316333089613be3565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161561210f5761210a87613c1c565b612112565b865f5b909750905061212087613d5a565b5f612129613bda565b90505f6121368583615742565b9050841580612143575083155b61216157846121528286615755565b61215c919061576c565b612163565b805b9550868610156121a15760405162461bcd60e51b81526020600482015260096024820152686d696e53686172657360b81b60448201526064016115e0565b6001600160a01b0388165f9081525f80516020615ccf8339815191526020819052604082208054919284926121d7908490615714565b909155506121e79050898861393f565b6040805183815260208101899052808201869052606081018790526080810188905290516001600160a01b038b169133917f193fa1e51a172de243b75f244207219f0fc534504ae9142df54912cc47f5838e9181900360a00190a35050505050509392505050565b7f17a8e30262c1f919c33056d877a3c22b95c2f5e4dac44683c1c2323cd79fbdb0612279816130c7565b5f5b8251811015610a07575f80848381518110612298576122986156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205460035f8282546122d09190615742565b925050819055505f808483815181106122eb576122eb6156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f905561234283828151811061232a5761232a6156ec565b60200260200101516001613eec90919063ffffffff16565b61234a575f80fd5b61237a83828151811061235f5761235f6156ec565b60200260200101515f858481518110610d5557610d556156ec565b82818151811061238c5761238c6156ec565b60200260200101516001600160a01b03167f62e298b73c73949bed9d15535269bf8d0e927a5e8d3c3bc601932eebb06397eb60405160405180910390a260010161227b565b5f5f80516020615ccf833981519152816123ea84612fd2565b6001600160a01b0385165f908152602084905260409020549091508111612411575f611d29565b6001600160a01b0384165f90815260208390526040902054611d299082615742565b5f610a8382613221565b5f80516020615c6f833981519152612454816130c7565b5f5b8281101561266257858582818110612470576124706156ec565b90506020020160208101906124859190615056565b6001600160a01b03168888838181106124a0576124a06156ec565b90506020020160208101906124b59190615056565b6001600160a01b03161015612591578383828181106124d6576124d66156ec565b90506020020160208101906124eb9190615056565b60045f8a8a85818110612500576125006156ec565b90506020020160208101906125159190615056565b6001600160a01b03166001600160a01b031681526020019081526020015f205f888885818110612547576125476156ec565b905060200201602081019061255c9190615056565b6001600160a01b03908116825260208201929092526040015f2080546001600160a01b0319169290911691909117905561265a565b8383828181106125a3576125a36156ec565b90506020020160208101906125b89190615056565b60045f8888858181106125cd576125cd6156ec565b90506020020160208101906125e29190615056565b6001600160a01b03166001600160a01b031681526020019081526020015f205f8a8a85818110612614576126146156ec565b90506020020160208101906126299190615056565b6001600160a01b03908116825260208201929092526040015f2080546001600160a01b031916929091169190911790555b600101612456565b5050505050505050565b6040516317fa36e760e21b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635fe8db9c906126c09033908890889088906004016158f4565b5f604051808303815f87803b1580156126d7575f80fd5b505af11580156126e9573d5f803e3d5ffd5b505050506126f8878787612062565b979650505050505050565b5f8281525f80516020615c8f8339815191526020526040902060010154612729816130c7565b6111e5838361375b565b60405163de0d3e7760e01b81526001600160a01b0382811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de0d3e77906024016114ec565b5f80516020615c6f83398151915261279c816130c7565b5f806127a6614eee565b6127ae614eee565b5f805b6127bb600161320d565b811015612a44575f6127ce600183613216565b90505f6127da82613221565b6003546001600160a01b0384165f9081526020819052604081205492935091612801610a0c565b61280b9190615755565b612815919061576c565b61281f9083615921565b90505f8113156129c6576040516370a0823160e01b81523060048201525f906001600160a01b03851690639f40a7b390859083906370a0823190602401602060405180830381865afa158015612877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061289b91906157d8565b6128a59086615755565b6128af919061576c565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201525f60648201526084016020604051808303815f875af11580156128fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061292191906157d8565b905080156129c0576129b3846001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298c919061578b565b7f0000000000000000000000000000000000000000000000000000000000000000836139c4565b6129bd908b615714565b99505b50612a39565b5f811215612a39578287866103e881106129e2576129e26156ec565b6001600160a01b0390921660209290920201526129fe81615940565b86866103e88110612a1157612a116156ec565b6020020152612a1f81615940565b612a299089615714565b975084612a358161595a565b9550505b5050506001016127b1565b50845f5b82811015612bd0575f868886846103e88110612a6657612a666156ec565b6020020151612a759190615755565b612a7f919061576c565b90508015612bc757612a918184615742565b925085826103e88110612aa657612aa66156ec565b60200201516001600160a01b031663bc157ac1612b5a7f000000000000000000000000000000000000000000000000000000000000000089866103e88110612af057612af06156ec565b60200201516001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b54919061578b565b856139c4565b6040516001600160e01b031960e084901b16815260048101919091523060248201525f60448201526064016020604051808303815f875af1158015612ba1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bc591906157d8565b505b50600101612a48565b508015612cb35783612be3600184615742565b6103e88110612bf457612bf46156ec565b60200201516001600160a01b031663bc157ac1612c487f000000000000000000000000000000000000000000000000000000000000000087612c37600188615742565b6103e88110612af057612af06156ec565b6040516001600160e01b031960e084901b16815260048101919091523060248201525f60448201526064016020604051808303815f875af1158015612c8f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266291906157d8565b50505050505050565b5f80516020615c6f833981519152612cd3816130c7565b5f80516020615ccf8339815191525f5b83518110156111e5575f612d0f858381518110612d0257612d026156ec565b6020026020010151612fd2565b9050825f015f868481518110612d2757612d276156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054811115612fc9575f7f000000000000000000000000000000000000000000000000000000000000000063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b2eb34d888681518110612dbf57612dbf6156ec565b60200260200101516040518263ffffffff1660e01b8152600401612df291906001600160a01b0391909116815260200190565b602060405180830381865afa158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e319190615727565b63ffffffff16855f015f898781518110612e4d57612e4d6156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205484612e809190615742565b612e8a9190615755565b612e94919061576c565b9050612ea08183615742565b845f015f888681518110612eb657612eb66156ec565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550858381518110612ef357612ef36156ec565b60200260200101516001600160a01b03167f15edf35fb4e11a69b84fe0957af501729657cbb5afb5e47bc896438dff4e5dce82604051612f3591815260200190565b60405180910390a2612fc7868481518110612f5257612f526156ec565b60200260200101517f0000000000000000000000000000000000000000000000000000000000000000612f83611928565b612fae7f0000000000000000000000000000000000000000000000000000000000000000600a6158ca565b612fb89086615755565b612fc2919061576c565b613f00565b505b50600101612ce3565b5f612ffe7f0000000000000000000000000000000000000000000000000000000000000000600a6158ca565b613006611928565b61300f846117ee565b6130199190615755565b610a83919061576c565b5f84138061303057505f83135b613038575f80fd5b5f806130468385018561548d565b6001600160a01b038083165f9081526004602090815260408083208486168452909152902054929450909250163314613092576040516394490a3d60e01b815260040160405180910390fd5b5f8613156130b3576130ae6001600160a01b0383163388613852565b61190e565b61190e6001600160a01b0382163387613852565b61149b8133614039565b5f805f6130dc613bda565b90505f6130f45f80516020615c4f8339815191525490565b90506130ff87614072565b93507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161561314e5761313b848887614230565b5093506131488486614441565b90945092505b6131588588614586565b61318c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168786613852565b846001600160a01b0316866001600160a01b03166131a73390565b604080518b81526020810189905290810187905260608101859052608081018690526001600160a01b0391909116907fd4594021cdd03e2c0abc8108cba8d75a347eaf64acaddede25df63f6ef9e24209060a00160405180910390a45050509392505050565b5f610a83825490565b5f61124983836145ba565b5f610a83826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613261573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613285919061578b565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132e59190615972565b6132f090600a6158ca565b846001600160a01b031663872697296040518163ffffffff1660e01b8152600401602060405180830381865afa15801561332c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061335091906157d8565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015610fcc573d5f803e3d5ffd5b5f611249836001600160a01b0384166145e0565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526133f7848261462c565b6111e5576040516001600160a01b0384811660248301525f604483015261345991869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146cd565b6111e584826146cd565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614610a4d576134c67f000000000000000000000000000000000000000000000000000000000000000061472e565b6134f17f0000000000000000000000000000000000000000000000000000000000000000600a6158ca565b846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561352d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135519190615972565b61355c90600a6158ca565b6135658661472e565b61356f9086615755565b613579919061576c565b6135839190615755565b61358d919061576c565b9050610a83565b610a0783838360016148db565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f1981146111e5578181101561362757604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016115e0565b6111e584848484035f6148db565b6001600160a01b03831661365e57604051634b637e8f60e11b81525f60048201526024016115e0565b6001600160a01b0382166136875760405163ec442f0560e01b81525f60048201526024016115e0565b610a078383836149bf565b5f5f80516020615c8f8339815191526136ab84846119c9565b61372a575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556136e03390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610a83565b5f915050610a83565b5092915050565b6001600160a01b0381165f9081526001830160205260408120541515611249565b5f5f80516020615c8f83398151915261377484846119c9565b1561372a575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610a83565b6137dc614a37565b5f80516020615caf833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b60605f61124983614a66565b5f61384b60018361373a565b1592915050565b6040516001600160a01b03838116602483015260448201839052610a0791859182169063a9059cbb90606401613427565b61388b614abf565b6116748282614b08565b61389d614abf565b6138a5614b58565b6138ad614b60565b6138b75f83613692565b506138cf5f80516020615c6f83398151915282613692565b5050427f3723283c6c153be31b346222d4cdfc82d474472705dbc1bceef0b3066f389b015550565b6138ff613ba8565b5f80516020615caf833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833613815565b6001600160a01b0382166139685760405163ec442f0560e01b81525f60048201526024016115e0565b6116745f83836149bf565b6003546001600160a01b0382165f908152602081905260408120549091829161399a610a0c565b6139a49190615755565b6139ae919061576c565b9050806139ba84613221565b6112499190615921565b5f826001600160a01b0316846001600160a01b0316036139e5575080611249565b6001600160a01b03808416908516105f81613a26576001600160a01b038086165f9081526004602090815260408083208a8516845290915290205416613a4e565b6001600160a01b038087165f9081526004602090815260408083208985168452909152902054165b90505f80826001600160a01b031663128acb0830868988613a8d57613a88600173fffd8963efd1fc6a506488495d951d5263988d26615992565b613a9d565b613a9d6401000276a360016159b1565b89613ade578c8e604051602001613aca9291906001600160a01b0392831681529116602082015260400190565b604051602081830303815290604052613b16565b8d8d604051602001613b069291906001600160a01b0392831681529116602082015260400190565b6040516020818303038152906040525b6040518663ffffffff1660e01b8152600401613b369594939291906159d0565b60408051808303815f875af1158015613b51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b759190615a0e565b9150915083613b845781613b86565b805b613b8f90615940565b9450613b9d88888888614b70565b505050509392505050565b5f80516020615caf8339815191525460ff1615613bd85760405163d93c066560e01b815260040160405180910390fd5b565b5f611226610a0c565b6040516001600160a01b0384811660248301528381166044830152606482018390526111e59186918216906323b872dd90608401613427565b604051632b2d6fbd60e21b81523360048201525f90819081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063acb5bef4906024016060604051808303815f875af1158015613c85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ca99190615a30565b505063ffffffff90811691507f000000000000000000000000000000000000000000000000000000000000000016613ce18286615755565b613ceb919061576c565b90508015613d5357613cfd8185615742565b9350613d536001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083613852565b9293915050565b60035481905f5b613d6b600161320d565b8110156111e5575f613d7e600183613216565b6001600160a01b0381165f90815260208190526040902054909150613da39084615742565b92505f835f03613db4575083613de6565b6003546001600160a01b0383165f90815260208190526040902054613dd99088615755565b613de3919061576c565b90505b613df08186615742565b94508015613ed4576001600160a01b03821663bc157ac1613e677f0000000000000000000000000000000000000000000000000000000000000000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b30573d5f803e3d5ffd5b6040516001600160e01b031960e084901b16815260048101919091523060248201525f60448201526064016020604051808303815f875af1158015613eae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ed291906157d8565b505b845f03613ee25750506111e5565b5050600101613d61565b5f611249836001600160a01b038416614cd8565b5f80516020615c2f8339815191526001600160a01b038416613f3a5781816002015f828254613f2f9190615714565b90915550613faa9050565b6001600160a01b0384165f9081526020829052604090205482811015613f8c5760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016115e0565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316613fc8576002810180548390039055613fe6565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161402b91815260200190565b60405180910390a350505050565b61404382826119c9565b6116745760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016115e0565b5f61407d600161320d565b5f0361409c576040516301948fd760e01b815260040160405180910390fd5b5f5b6140a8600161320d565b811015610a4d575f6140bb600183613216565b90505f6140d35f80516020615c4f8339815191525490565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015614115573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061413991906157d8565b6141439087615755565b61414d919061576c565b9050801561422657614219826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614194573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141b8919061578b565b7f0000000000000000000000000000000000000000000000000000000000000000604051639f40a7b360e01b815260048101859052306024820181905260448201525f60648201526001600160a01b03861690639f40a7b390608401611f59565b6142239085615714565b93505b505060010161409e565b5f805f80516020615ccf8339815191528161424a856117ee565b6001600160a01b0386165f9081526020849052604090205461426d908890615755565b614277919061576c565b6001600160a01b0386165f908152602084905260408120805492935083929091906142a3908490615742565b909155505f90508188111561442857604051639b2eb34d60e01b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000063ffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690639b2eb34d90602401602060405180830381865afa158015614340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143649190615727565b63ffffffff16614374848b615742565b61437e9190615755565b614388919061576c565b90508015614428576143e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083613852565b856001600160a01b03167f15edf35fb4e11a69b84fe0957af501729657cbb5afb5e47bc896438dff4e5dce8260405161441f91815260200190565b60405180910390a25b6144328189615742565b9450925050505b935093915050565b6040516302b916f760e51b81526001600160a01b0382811660048301525f918291829163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016917f00000000000000000000000000000000000000000000000000000000000000001690635722dee090602401602060405180830381865afa1580156144d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144f79190615727565b6145079063ffffffff1687615755565b614511919061576c565b90508015614579576145238186615742565b94506145796001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083613852565b84925090505b9250929050565b6001600160a01b0382166145af57604051634b637e8f60e11b81525f60048201526024016115e0565b611674825f836149bf565b5f825f0182815481106145cf576145cf6156ec565b905f5260205f200154905092915050565b5f81815260018301602052604081205461462557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a83565b505f610a83565b5f805f846001600160a01b0316846040516146479190615a7a565b5f604051808303815f865af19150503d805f8114614680576040519150601f19603f3d011682016040523d82523d5f602084013e614685565b606091505b50915091508180156146af5750805115806146af5750808060200190518101906146af9190615a90565b80156146c457505f856001600160a01b03163b115b95945050505050565b5f6146e16001600160a01b03841683614db2565b905080515f141580156147055750808060200190518101906147039190615a90565b155b15610a0757604051635274afe760e01b81526001600160a01b03841660048201526024016115e0565b6001600160a01b038082165f90815260056020526040808220548151633fabe5a360e21b81529151929316918391829182918291869163feaf968c9160048083019260a09291908290030181865afa15801561478c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147b09190615acd565b9450945050935093508369ffffffffffffffffffff168169ffffffffffffffffffff1610156147f257604051630cd5fa0760e11b815260040160405180910390fd5b815f036148115760405162ace4c560e51b815260040160405180910390fd5b5f831361483157604051633b5c4edb60e11b815260040160405180910390fd5b846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561486d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148919190615972565b61489c90600a6158ca565b6148c77f0000000000000000000000000000000000000000000000000000000000000000600a6158ca565b6148d19085615755565b6126f8919061576c565b5f80516020615c2f8339815191526001600160a01b0385166149125760405163e602df0560e01b81525f60048201526024016115e0565b6001600160a01b03841661493b57604051634a1406b160e11b81525f60048201526024016115e0565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156149b857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516149af91815260200190565b60405180910390a35b5050505050565b6001600160a01b038316158015906149df57506001600160a01b03821615155b15614a2c5760405162461bcd60e51b815260206004820152601b60248201527f435942524f3a205472616e73666572206e6f7420616c6c6f776564000000000060448201526064016115e0565b610a07838383613f00565b5f80516020615caf8339815191525460ff16613bd857604051638dfc202b60e01b815260040160405180910390fd5b6060815f01805480602002602001604051908101604052809291908181526020018280548015614ab357602002820191905f5260205f20905b815481526020019060010190808311614a9f575b50505050509050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bd857604051631afcd79f60e31b815260040160405180910390fd5b614b10614abf565b5f80516020615c2f8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03614b498482615b5f565b50600481016111e58382615b5f565b613bd8614abf565b614b68614abf565b613bd8614dbf565b5f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bd19190615972565b614bdc90600a6158ca565b614be58661472e565b614bef9085615755565b614bf9919061576c565b90505f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c5c9190615972565b614c6790600a6158ca565b614c708661472e565b614c7a9085615755565b614c84919061576c565b60065490915061271090614c9e9063ffffffff16826158d8565b614cae9063ffffffff1684615755565b614cb8919061576c565b81101561190e576040516307dd37f760e41b815260040160405180910390fd5b5f818152600183016020526040812054801561372a575f614cfa600183615742565b85549091505f90614d0d90600190615742565b9050808214614d6c575f865f018281548110614d2b57614d2b6156ec565b905f5260205f200154905080875f018481548110614d4b57614d4b6156ec565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080614d7d57614d7d615c1a565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610a83565b606061124983835f614ddf565b614dc7614abf565b5f80516020615caf833981519152805460ff19169055565b606081471015614e045760405163cd78605960e01b81523060048201526024016115e0565b5f80856001600160a01b03168486604051614e1f9190615a7a565b5f6040518083038185875af1925050503d805f8114614e59576040519150601f19603f3d011682016040523d82523d5f602084013e614e5e565b606091505b5091509150610cb3868383606082614e7e57614e7982614ec5565b611249565b8151158015614e9557506001600160a01b0384163b155b15614ebe57604051639996b31560e01b81526001600160a01b03851660048201526024016115e0565b5080611249565b805115614ed55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60405180617d0001604052806103e8906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614f4b57614f4b614f0e565b604052919050565b5f67ffffffffffffffff821115614f6c57614f6c614f0e565b5060051b60200190565b6001600160a01b038116811461149b575f80fd5b5f82601f830112614f99575f80fd5b8135614fac614fa782614f53565b614f22565b8082825260208201915060208360051b860101925085831115614fcd575f80fd5b602085015b83811015614ff3578035614fe581614f76565b835260209283019201614fd2565b5095945050505050565b5f6020828403121561500d575f80fd5b813567ffffffffffffffff811115615023575f80fd5b611d2984828501614f8a565b5f6020828403121561503f575f80fd5b81356001600160e01b031981168114611249575f80fd5b5f60208284031215615066575f80fd5b813561124981614f76565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112496020830184615071565b5f80604083850312156150c2575f80fd5b82356150cd81614f76565b946020939093013593505050565b5f80604083850312156150ec575f80fd5b823567ffffffffffffffff811115615102575f80fd5b61510e85828601614f8a565b925050602083013567ffffffffffffffff81111561512a575f80fd5b61513685828601614f8a565b9150509250929050565b5f805f60608486031215615152575f80fd5b833561515d81614f76565b9250602084013561516d81614f76565b929592945050506040919091013590565b5f6020828403121561518e575f80fd5b5035919050565b5f80604083850312156151a6575f80fd5b8235915060208301356151b881614f76565b809150509250929050565b5f80604083850312156151d4575f80fd5b823567ffffffffffffffff8111156151ea575f80fd5b6151f685828601614f8a565b925050602083013567ffffffffffffffff811115615212575f80fd5b8301601f81018513615222575f80fd5b8035615230614fa782614f53565b8082825260208201915060208360051b850101925087831115615251575f80fd5b6020840193505b82841015615273578335825260209384019390910190615258565b809450505050509250929050565b602080825282518282018190525f918401906040840190835b818110156152c15783516001600160a01b031683526020938401939092019160010161529a565b509095945050505050565b5f8067ffffffffffffffff8411156152e6576152e6614f0e565b50601f8301601f19166020016152fb81614f22565b91505082815283838301111561530f575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112615334575f80fd5b611249838335602085016152cc565b5f805f805f60a08688031215615357575f80fd5b853561536281614f76565b9450602086013567ffffffffffffffff81111561537d575f80fd5b61538988828901615325565b945050604086013567ffffffffffffffff8111156153a5575f80fd5b6153b188828901615325565b93505060608601356153c281614f76565b915060808601356153d281614f76565b809150509295509295909350565b5f8083601f8401126153f0575f80fd5b50813567ffffffffffffffff811115615407575f80fd5b6020830191508360208260051b850101111561457f575f80fd5b5f805f8060408587031215615434575f80fd5b843567ffffffffffffffff81111561544a575f80fd5b615456878288016153e0565b909550935050602085013567ffffffffffffffff811115615475575f80fd5b615481878288016153e0565b95989497509550505050565b5f806040838503121561549e575f80fd5b82356154a981614f76565b915060208301356151b881614f76565b5f805f80608085870312156154cc575f80fd5b8435935060208501356154de81614f76565b925060408501356154ee81614f76565b9396929550929360600135925050565b63ffffffff8116811461149b575f80fd5b5f6020828403121561551f575f80fd5b8135611249816154fe565b5f805f6060848603121561553c575f80fd5b83359250602084013561516d81614f76565b5f805f805f8060608789031215615563575f80fd5b863567ffffffffffffffff811115615579575f80fd5b61558589828a016153e0565b909750955050602087013567ffffffffffffffff8111156155a4575f80fd5b6155b089828a016153e0565b909550935050604087013567ffffffffffffffff8111156155cf575f80fd5b6155db89828a016153e0565b979a9699509497509295939492505050565b5f805f805f8060c08789031215615602575f80fd5b86359550602087013561561481614f76565b945060408701359350606087013592506080870135915060a087013567ffffffffffffffff811115615644575f80fd5b8701601f81018913615654575f80fd5b615663898235602084016152cc565b9150509295509295509295565b5f805f8060608587031215615683575f80fd5b8435935060208501359250604085013567ffffffffffffffff8111156156a7575f80fd5b8501601f810187136156b7575f80fd5b803567ffffffffffffffff8111156156cd575f80fd5b8760208284010111156156de575f80fd5b949793965060200194505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a8357610a83615700565b5f60208284031215615737575f80fd5b8151611249816154fe565b81810381811115610a8357610a83615700565b8082028115828204841417610a8357610a83615700565b5f8261578657634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561579b575f80fd5b815161124981614f76565b600181811c908216806157ba57607f821691505b602082108103610a4d57634e487b7160e01b5f52602260045260245ffd5b5f602082840312156157e8575f80fd5b5051919050565b6001815b60018411156144395780850481111561580e5761580e615700565b600184161561581c57908102905b60019390931c9280026157f3565b5f8261583857506001610a83565b8161584457505f610a83565b816001811461585a576002811461586457615880565b6001915050610a83565b60ff84111561587557615875615700565b50506001821b610a83565b5060208310610133831016604e8410600b84101617156158a3575081810a610a83565b6158af5f1984846157ef565b805f19048211156158c2576158c2615700565b029392505050565b5f61124960ff84168361582a565b63ffffffff8281168282160390811115610a8357610a83615700565b6001600160a01b0385168152836020820152826040820152608060608201525f610cb36080830184615071565b8181035f83128015838313168383128216171561373357613733615700565b5f600160ff1b820161595457615954615700565b505f0390565b5f6001820161596b5761596b615700565b5060010190565b5f60208284031215615982575f80fd5b815160ff81168114611249575f80fd5b6001600160a01b038281168282160390811115610a8357610a83615700565b6001600160a01b038181168382160190811115610a8357610a83615700565b6001600160a01b038616815284151560208201528360408201526001600160a01b038316606082015260a060808201525f6126f860a0830184615071565b5f8060408385031215615a1f575f80fd5b505080516020909101519092909150565b5f805f60608486031215615a42575f80fd5b8351615a4d816154fe565b6020850151909350615a5e816154fe565b6040850151909250615a6f816154fe565b809150509250925092565b5f82518060208501845e5f920191825250919050565b5f60208284031215615aa0575f80fd5b81518015158114611249575f80fd5b805169ffffffffffffffffffff81168114615ac8575f80fd5b919050565b5f805f805f60a08688031215615ae1575f80fd5b615aea86615aaf565b60208701516040880151606089015192975090955093509150615b0f60808701615aaf565b90509295509295909350565b601f821115610a0757805f5260205f20601f840160051c81016020851015615b405750805b601f840160051c820191505b818110156149b8575f8155600101615b4c565b815167ffffffffffffffff811115615b7957615b79614f0e565b615b8d81615b8784546157a6565b84615b1b565b6020601f821160018114615bbf575f8315615ba85750848201515b5f19600385901b1c1916600184901b1784556149b8565b5f84815260208120601f198516915b82811015615bee5787850151825560209485019460019092019101615bce565b5084821015615c0b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52603160045260245ffdfe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0802dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033003723283c6c153be31b346222d4cdfc82d474472705dbc1bceef0b3066f389b00a264697066735822122058f7fcfd4c2beb561a1686e16a4254bb8ca30b231d3dc52d70fd0d84a9b9c4e464736f6c634300081a003300000000000000000000000043000000000000000000000000000000000000040000000000000000000000003eef58a3e3bc1c116789813354d8a0a5d96930fb00000000000000000000000066e424337c0f888dccbcf2e0730a00a526d716f6