0 txs
0 calls
constructor
constructor()
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
assets
viewfunction assets() view returns (address[] assetList)
availableBalance
viewfunction availableBalance(address _asset) view returns (uint256 amount)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
claimableInterest
viewfunction claimableInterest(address _asset) view returns (uint256 interest)
currentUtilizationIndex
viewfunction currentUtilizationIndex(address _asset) view returns (uint256 index)
decimals
viewfunction decimals() view returns (uint8)
depositCap
viewfunction depositCap(address _asset) view returns (uint256 cap)
DOMAIN_SEPARATOR
viewfunction DOMAIN_SEPARATOR() view returns (bytes32)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
fractionalReserveVault
viewfunction fractionalReserveVault(address _asset) view returns (address vaultAddress)
fractionalReserveVaults
viewfunction fractionalReserveVaults() view returns (address[] vaultAddresses)
getBurnAmount
viewfunction getBurnAmount(address _asset, uint256 _amountIn) view returns (uint256 amountOut, uint256 fee)
getFeeData
viewfunction getFeeData(address _asset) view returns (tuple feeData)
getMintAmount
viewfunction getMintAmount(address _asset, uint256 _amountIn) view returns (uint256 amountOut, uint256 fee)
getRedeemAmount
viewfunction getRedeemAmount(uint256 _amountIn) view returns (uint256[] amountsOut, uint256[] fees)
getRedeemFee
viewfunction getRedeemFee() view returns (uint256 redeemFee)
getRemainingMintCapacity
viewfunction getRemainingMintCapacity(address _asset) view returns (uint256 remainingMintCapacity)
insuranceFund
viewfunction insuranceFund() view returns (address)
interestReceiver
viewfunction interestReceiver() view returns (address _interestReceiver)
loaned
viewfunction loaned(address _asset) view returns (uint256 loanedAmount)
name
viewfunction name() view returns (string)
nonces
viewfunction nonces(address owner) view returns (uint256)
paused
viewfunction paused() view returns (bool)
paused
viewfunction paused(address _asset) view returns (bool isPaused)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
reserve
viewfunction reserve(address _asset) view returns (uint256 reserveAmount)
symbol
viewfunction symbol() view returns (string)
totalBorrows
viewfunction totalBorrows(address _asset) view returns (uint256 totalBorrow)
totalSupplies
viewfunction totalSupplies(address _asset) view returns (uint256 _totalSupply)
totalSupply
viewfunction totalSupply() view returns (uint256)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
utilization
viewfunction utilization(address _asset) view returns (uint256 ratio)
whitelisted
viewfunction whitelisted(address _user) view returns (bool isWhitelisted)
addAsset
nonpayablefunction addAsset(address _asset)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
borrow
nonpayablefunction borrow(address _asset, uint256 _amount, address _receiver)
burn
nonpayablefunction burn(address _asset, uint256 _amountIn, uint256 _minAmountOut, address _receiver, uint256 _deadline) returns (uint256 amountOut)
divestAll
nonpayablefunction divestAll(address _asset)
initialize
nonpayablefunction initialize(string _name, string _symbol, address _accessControl, address _feeAuction, address _oracle, address[] _assets, address _insuranceFund)
investAll
nonpayablefunction investAll(address _asset)
mint
nonpayablefunction mint(address _asset, uint256 _amountIn, uint256 _minAmountOut, address _receiver, uint256 _deadline) returns (uint256 amountOut)
pauseAsset
nonpayablefunction pauseAsset(address _asset)
pauseProtocol
nonpayablefunction pauseProtocol()
permit
nonpayablefunction permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
realizeInterest
nonpayablefunction realizeInterest(address _asset)
redeem
nonpayablefunction redeem(uint256 _amountIn, uint256[] _minAmountsOut, address _receiver, uint256 _deadline) returns (uint256[] amountsOut)
removeAsset
nonpayablefunction removeAsset(address _asset)
repay
nonpayablefunction repay(address _asset, uint256 _amount)
rescueERC20
nonpayablefunction rescueERC20(address _asset, address _receiver)
setDepositCap
nonpayablefunction setDepositCap(address _asset, uint256 _cap)
setFeeData
nonpayablefunction setFeeData(address _asset, tuple _feeData)
setFractionalReserveVault
nonpayablefunction setFractionalReserveVault(address _asset, address _vault)
setInsuranceFund
nonpayablefunction setInsuranceFund(address _insuranceFund)
setRedeemFee
nonpayablefunction setRedeemFee(uint256 _redeemFee)
setReserve
nonpayablefunction setReserve(address _asset, uint256 _reserve)
setWhitelist
nonpayablefunction setWhitelist(address _user, bool _whitelisted)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
unpauseAsset
nonpayablefunction unpauseAsset(address _asset)
unpauseProtocol
nonpayablefunction unpauseProtocol()
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
EIP712DomainChanged
event EIP712DomainChanged()
Initialized
event Initialized(uint64 version)
Paused
event Paused(address account)
SetDepositCap
event SetDepositCap(address asset, uint256 cap)
SetFeeData
event SetFeeData(address asset, (uint256 minMintFee, uint256 slope0, uint256 slope1, uint256 mintKinkRatio, uint256 burnKinkRatio, uint256 optimalRatio) feeData)
SetRedeemFee
event SetRedeemFee(uint256 redeemFee)
SetWhitelist
event SetWhitelist(address user, bool whitelisted)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
Upgraded
event Upgraded(address indexed implementation)
errors
AccessDenied
error AccessDenied()
AddressEmptyCode
error AddressEmptyCode(address target)
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
EnforcedPause
error EnforcedPause()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
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)
ERC2612ExpiredSignature
error ERC2612ExpiredSignature(uint256 deadline)
ERC2612InvalidSigner
error ERC2612InvalidSigner(address signer, address owner)
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
InvalidAccountNonce
error InvalidAccountNonce(address account, uint256 currentNonce)
InvalidBurnKinkRatio
error InvalidBurnKinkRatio()
InvalidInitialization
error InvalidInitialization()
InvalidMinMintFee
error InvalidMinMintFee()
InvalidMintKinkRatio
error InvalidMintKinkRatio()
InvalidOptimalRatio
error InvalidOptimalRatio()
NotInitializing
error NotInitializing()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613fb56100f95f395f818161265e0152818161268701526127b20152613fb55ff3fe60806040526004361061039d575f3560e01c80637ecebe00116101de578063b7c4a6bf11610108578063d936547e1161009d578063e75179a41161006d578063e75179a414610bf1578063f878369e14610c10578063f93b6be514610c2f578063feee175614610c43575f5ffd5b8063d936547e14610b49578063dbf6248914610b9f578063dd62ed3e14610bb3578063df6e7cc814610bd2575f5ffd5b8063c6d98f1a116100d8578063c6d98f1a14610ab7578063c77cf61514610aea578063cf23a0c614610afe578063d505accf14610b2a575f5ffd5b8063b7c4a6bf14610a07578063baf11db814610a26578063bf20d9dc14610a79578063c3c0529314610a98575f5ffd5b80639782e8211161017e578063a9059cbb1161014e578063a9059cbb14610985578063ad3cb1cc146109a4578063adc5ce6e146109d4578063b7902303146109f3575f5ffd5b80639782e821146109095780639abacb4114610928578063a0821be314610947578063a445058714610966575f5ffd5b80638bee2a8e116101b95780638bee2a8e146108545780638d730124146108c2578063908ab68c146108e157806395d89b41146108f5575f5ffd5b80637ecebe00146107ef57806384b0196e1461080e5780638a7595ad14610835575f5ffd5b80633753b14a116102ca5780635c975abb1161025f57806370a082311161022f57806370a082311461077157806371a9730514610790578063753842db146107b157806378250b63146107d0575f5ffd5b80635c975abb146106f15780635d799f87146107145780635d841af5146107335780636c665a5514610752575f5ffd5b80634f24d20a1161029a5780634f24d20a1461068057806352d1902d1461069f57806353d6fd59146106b357806356127987146106d2575f5ffd5b80633753b14a1461061057806341d951261461062f5780634a5e42b11461064e5780634f1ef2861461066d575f5ffd5b806320b71534116103405780632c3ee88c116103105780632c3ee88c146105955780632e48152c146105c2578063313ce567146105e15780633644e515146105fc575f5ffd5b806320b715341461051957806322867d781461053857806323b872dd14610557578063298410e514610576575f5ffd5b8063095ea7b31161037b578063095ea7b31461041957806318160ddd1461044857806318dfd7881461047b578063195d0e28146104e5575f5ffd5b8063012ea17c146103a157806306fdde03146103c2578063082bf6e8146103ec575b5f5ffd5b3480156103ac575f5ffd5b506103c06103bb3660046134d2565b610c62565b005b3480156103cd575f5ffd5b506103d6610e6f565b6040516103e3919061353c565b60405180910390f35b3480156103f7575f5ffd5b5061040b61040636600461354e565b610f14565b6040519081526020016103e3565b348015610424575f5ffd5b50610438610433366004613567565b610f49565b60405190151581526020016103e3565b348015610453575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461040b565b348015610486575f5ffd5b5061049a61049536600461354e565b610f62565b6040516103e391905f60c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156104f0575f5ffd5b506105046104ff366004613567565b611015565b604080519283526020830191909152016103e3565b348015610524575f5ffd5b5061040b61053336600461354e565b611045565b348015610543575f5ffd5b506103c0610552366004613567565b61107e565b348015610562575f5ffd5b5061043861057136600461358f565b611134565b348015610581575f5ffd5b506103c061059036600461354e565b611159565b3480156105a0575f5ffd5b506105b46105af3660046135c9565b6111eb565b6040516103e392919061361a565b3480156105cd575f5ffd5b506104386105dc36600461354e565b611292565b3480156105ec575f5ffd5b50604051601281526020016103e3565b348015610607575f5ffd5b5061040b6112bf565b34801561061b575f5ffd5b506103c061062a36600461354e565b6112cd565b34801561063a575f5ffd5b506103c061064936600461373f565b611300565b348015610659575f5ffd5b506103c061066836600461354e565b61140d565b6103c061067b366004613811565b611440565b34801561068b575f5ffd5b5061040b61069a36600461354e565b61145f565b3480156106aa575f5ffd5b5061040b6114f6565b3480156106be575f5ffd5b506103c06106cd36600461387b565b611511565b3480156106dd575f5ffd5b5061040b6106ec3660046138b0565b61159c565b3480156106fc575f5ffd5b505f516020613f605f395f51905f525460ff16610438565b34801561071f575f5ffd5b506103c061072e3660046138fa565b61168c565b34801561073e575f5ffd5b506103c061074d3660046135c9565b61170d565b34801561075d575f5ffd5b506103c061076c36600461392b565b611768565b34801561077c575f5ffd5b5061040b61078b36600461354e565b61183d565b34801561079b575f5ffd5b506107a461186d565b6040516103e39190613964565b3480156107bc575f5ffd5b506103c06107cb36600461354e565b61187f565b3480156107db575f5ffd5b506103c06107ea366004613567565b6118bd565b3480156107fa575f5ffd5b5061040b61080936600461354e565b611928565b348015610819575f5ffd5b50610822611932565b6040516103e397969594939291906139af565b348015610840575f5ffd5b506103c061084f3660046138fa565b6119e0565b34801561085f575f5ffd5b506108aa61086e36600461354e565b6001600160a01b039081165f9081527f5c48f30a22a9811126b69b5adcaabfc5ae0a83b6493e1b31e09dc579923ad10360205260409020541690565b6040516001600160a01b0390911681526020016103e3565b3480156108cd575f5ffd5b5061040b6108dc36600461354e565b611ac0565b3480156108ec575f5ffd5b506107a4611aea565b348015610900575f5ffd5b506103d6611b15565b348015610914575f5ffd5b5061040b61092336600461354e565b611b53565b348015610933575f5ffd5b506103c061094236600461354e565b611b7d565b348015610952575f5ffd5b5061040b61096136600461354e565b611bb0565b348015610971575f5ffd5b5061040b6109803660046138b0565b611bd3565b348015610990575f5ffd5b5061043861099f366004613567565b611ced565b3480156109af575f5ffd5b506103d6604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156109df575f5ffd5b506103c06109ee36600461354e565b611cfa565b3480156109fe575f5ffd5b506108aa611d38565b348015610a12575f5ffd5b50610504610a21366004613567565b611d53565b348015610a31575f5ffd5b5061040b610a4036600461354e565b6001600160a01b03165f9081527f5c48f30a22a9811126b69b5adcaabfc5ae0a83b6493e1b31e09dc579923ad101602052604090205490565b348015610a84575f5ffd5b5061040b610a9336600461354e565b611e1a565b348015610aa3575f5ffd5b506103c0610ab236600461354e565b611e3d565b348015610ac2575f5ffd5b507f3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe015461040b565b348015610af5575f5ffd5b506108aa611e70565b348015610b09575f5ffd5b50610b1d610b18366004613a1e565b611e8f565b6040516103e39190613a7e565b348015610b35575f5ffd5b506103c0610b44366004613a90565b61205d565b348015610b54575f5ffd5b50610438610b6336600461354e565b6001600160a01b03165f9081527f3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe03602052604090205460ff1690565b348015610baa575f5ffd5b506103c06121b2565b348015610bbe575f5ffd5b5061040b610bcd3660046138fa565b6121ce565b348015610bdd575f5ffd5b506103c0610bec36600461354e565b612217565b348015610bfc575f5ffd5b5061040b610c0b36600461354e565b61229c565b348015610c1b575f5ffd5b506103c0610c2a366004613567565b6122b0565b348015610c3a575f5ffd5b506103c0612330565b348015610c4e575f5ffd5b5061040b610c5d36600461354e565b612349565b624ba85f60e21b610c728161236c565b6a295be96e64066972000000823510610c9e57604051630e7fd4ad60e21b815260040160405180910390fd5b6b033b2e3c9fd0803ce80000008260600135101580610cbf57506060820135155b15610cdd576040516304d9bf5d60e21b815260040160405180910390fd5b6b033b2e3c9fd0803ce80000008260800135101580610cfe57506080820135155b15610d1c57604051632a41299560e01b815260040160405180910390fd5b6b033b2e3c9fd0803ce80000008260a00135101580610d3d575060a0820135155b15610d5b57604051633cb8e73560e11b815260040160405180910390fd5b81606001358260a001351480610d78575081608001358260a00135145b15610d9657604051633cb8e73560e11b815260040160405180910390fd5b6001600160a01b0383165f8181527f3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe0260209081526040918290208535808255868301356001830181905587850135600284018190556060808a0135600386018190556080808c01356004880181905560a0808e013560059099018990558a519b8c52988b019690965297890193909352870152938501939093529083019190915260c08201527fb80d92aa6c2285ae4a8f342a6066af0fa35893e1853656935ec70c4fa2937d8f9060e0015b60405180910390a1505050565b60605f5f516020613ee05f395f51905f525b9050806003018054610e9290613afd565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebe90613afd565b8015610f095780601f10610ee057610100808354040283529160200191610f09565b820191905f5260205f20905b815481529060010190602001808311610eec57829003601f168201915b505050505091505090565b5f5f610f1f83611b53565b90505f610f2b84611045565b905081811115610f4257610f3f8282613b49565b92505b5050919050565b5f33610f5681858561242c565b60019150505b92915050565b610f956040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b506001600160a01b03165f9081527f3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe026020908152604091829020825160c08101845281548152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460a082015290565b5f5f5f61102185610f14565b90508084111561102f578093505b611039858561243e565b90969095509350505050565b6001600160a01b03165f9081527f3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe04602052604090205490565b6110866124c2565b630450cfaf60e31b6110978161236c565b739666ab481e8c4b16d1b6dcf38338446f3119b00d632ebadfbe6110b96124f4565b6040805180820182526001600160a01b0380891682526020820188815292516001600160e01b031960e087901b168152600481019490945290511660248301525160448201526064015b5f6040518083038186803b158015611119575f5ffd5b505af415801561112b573d5f5f3e3d5ffd5b50505050505050565b5f33611141858285612518565b61114c85858561257c565b60019150505b9392505050565b63298410e560e01b61116a8161236c565b739666ab481e8c4b16d1b6dcf38338446f3119b00d63a18a819761118c6124f4565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b03851660248201526044015b5f6040518083038186803b1580156111d1575f5ffd5b505af41580156111e3573d5f5f3e3d5ffd5b505050505050565b60608073e4a488d4a5d979f12895f97171687c3d3f490e75634bfcc81c5f516020613ec05f395f51905f526040805160208101825287815290516001600160e01b031960e085901b16815260048101929092525160248201526044015f60405180830381865af4158015611261573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112889190810190613bdb565b9094909350915050565b5f61129b6124f4565b6001600160a01b039092165f90815260069290920160205250604090205460ff1690565b5f6112c86125d9565b905090565b631ba9d8a560e11b6112de8161236c565b739666ab481e8c4b16d1b6dcf38338446f3119b00d63dd360ac961118c6124f4565b5f6113096125e2565b805490915060ff600160401b82041615906001600160401b03165f8115801561132f5750825b90505f826001600160401b0316600114801561134a5750303b155b905081158015611358575080155b156113765760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156113a057845460ff60401b1916600160401b1785555b6113b08d8d8d8d8d8d8d8d61260a565b6113b861264b565b83156113fe57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b634a5e42b160e01b61141e8161236c565b739666ab481e8c4b16d1b6dcf38338446f3119b00d63c709ad1761118c6124f4565b611448612653565b611451826126e1565b61145b82826126eb565b5050565b5f734d6306044d06366039cdddc4c9963189f6d27679631ae6b4d15f516020613f405f395f51905f525b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b0385166024820152604401602060405180830381865af41580156114d2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5c9190613c34565b5f6114ff6127a7565b505f516020613f205f395f51905f5290565b6353d6fd5960e01b6115228161236c565b6001600160a01b0383165f8181527f3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe036020908152604091829020805460ff19168615159081179091558251938452908301527ff6019ec0a78d156d249a1ec7579e2321f6ac7521d6e1d2eacf90ba4a184dcceb9101610e62565b5f6115a56124c2565b5f6115b08787611d53565b90925090506115bf33876127f0565b6115d2876115cd8385613c4b565b612824565b739666ab481e8c4b16d1b6dcf38338446f3119b00d637be70bae6115f46124f4565b6040518060e001604052808b6001600160a01b031681526020018a8152602001868152602001898152602001886001600160a01b03168152602001878152602001858152506040518363ffffffff1660e01b8152600401611656929190613c5e565b5f6040518083038186803b15801561166c575f5ffd5b505af415801561167e573d5f5f3e3d5ffd5b505050505095945050505050565b635d799f8760e01b61169d8161236c565b739666ab481e8c4b16d1b6dcf38338446f3119b00d633687471f6116bf6124f4565b5f516020613f405f395f51905f526040516001600160e01b031960e085901b168152600481019290925260248201526001600160a01b03808716604483015285166064820152608401611103565b635d841af560e01b61171e8161236c565b815f516020613ec05f395f51905f52600101556040518281527fc2045f7458ee2982ac24e8bc693c0924341b1d70475de942852d90e121fc77609060200160405180910390a15050565b6117706124c2565b636c665a5560e01b6117818161236c565b61178b8484612824565b739666ab481e8c4b16d1b6dcf38338446f3119b00d63ebd0396d6117ad6124f4565b604080516060810182526001600160a01b03808a1682526020820189815288821683850190815293516001600160e01b031960e088901b16815260048101959095529151811660248501529051604484015290511660648201526084015b5f6040518083038186803b158015611821575f5ffd5b505af4158015611833573d5f5f3e3d5ffd5b5050505050505050565b5f805f516020613ee05f395f51905f525b6001600160a01b039093165f9081526020939093525050604090205490565b60606112c861187a6124f4565b61287e565b63753842db60e01b6118908161236c565b734d6306044d06366039cdddc4c9963189f6d2767963fdcc2aa45f516020613f405f395f51905f5261118c565b6378250b6360e01b6118ce8161236c565b60405163938e51cf60e01b81525f516020613f405f395f51905f5260048201526001600160a01b038416602482015260448101839052734d6306044d06366039cdddc4c9963189f6d276799063938e51cf90606401611103565b5f610f5c8261288a565b5f60608082808083815f516020613f005f395f51905f52805490915015801561195d57506001810154155b6119a65760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064015b60405180910390fd5b6119ae6128b2565b6119b66128f0565b604080515f80825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b638a7595ad60e01b6119f18161236c565b5f5f516020613f405f395f51905f52604051632969be0760e11b8152600481018290526001600160a01b0386166024820152909150734d6306044d06366039cdddc4c9963189f6d27679906352d37c0e906044015f6040518083038186803b158015611a5b575f5ffd5b505af4158015611a6d573d5f5f3e3d5ffd5b505060405163c431765760e01b8152600481018490526001600160a01b03808816602483015286166044820152734d6306044d06366039cdddc4c9963189f6d27679925063c4317657915060640161180b565b5f611ac96124f4565b6001600160a01b039092165f90815260039290920160205250604090205490565b60606112c87f5c48f30a22a9811126b69b5adcaabfc5ae0a83b6493e1b31e09dc579923ad10461287e565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020613ee05f395f51905f5291610e9290613afd565b5f611b5c6124f4565b6001600160a01b039092165f90815260029290920160205250604090205490565b639abacb4160e01b611b8e8161236c565b739666ab481e8c4b16d1b6dcf38338446f3119b00d6316488ca661118c6124f4565b5f739666ab481e8c4b16d1b6dcf38338446f3119b00d6350ba58276114896124f4565b5f611bdc6124c2565b5f5f611be788610f14565b905080871115611bf5578096505b611bff888861243e565b9093509150739666ab481e8c4b16d1b6dcf38338446f3119b00d63fe209c31611c266124f4565b6040518060e001604052808c6001600160a01b031681526020018b81526020018781526020018a8152602001896001600160a01b03168152602001888152602001868152506040518363ffffffff1660e01b8152600401611c88929190613c5e565b5f6040518083038186803b158015611c9e575f5ffd5b505af4158015611cb0573d5f5f3e3d5ffd5b50505050611cbe8584612906565b8115611ce257611ce2611ccf6124f4565b600701546001600160a01b031683612906565b505095945050505050565b5f33610f5681858561257c565b6356e2e73760e11b611d0b8161236c565b734d6306044d06366039cdddc4c9963189f6d276796352d37c0e5f516020613f405f395f51905f5261118c565b5f611d416124f4565b600701546001600160a01b0316919050565b604080516060810182525f8082526001600160a01b03858116602084019081528385018681529451632d761af360e01b81525f516020613ec05f395f51905f5260048201529351151560248501525116604483015291516064820152819073e4a488d4a5d979f12895f97171687c3d3f490e7590632d761af3906084015b6040805180830381865af4158015611deb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0f9190613cc3565b909590945092505050565b5f739666ab481e8c4b16d1b6dcf38338446f3119b00d630f82ffd06114896124f4565b63c3c0529360e01b611e4e8161236c565b739666ab481e8c4b16d1b6dcf38338446f3119b00d63d8417d6261118c6124f4565b5f5f516020613f405f395f51905f525b546001600160a01b0316919050565b6060611e996124c2565b6060611ea4876111eb565b9092509050611eb333886127f0565b5f82516001600160401b03811115611ecd57611ecd61363e565b604051908082528060200260200182016040528015611ef6578160200160208202803683370190505b5090505f5b8351811015611f6757828181518110611f1657611f16613ce5565b6020026020010151848281518110611f3057611f30613ce5565b6020026020010151611f429190613c4b565b828281518110611f5457611f54613ce5565b6020908102919091010152600101611efb565b50611f79611f7361186d565b8261293a565b739666ab481e8c4b16d1b6dcf38338446f3119b00d63e81d6561611f9b6124f4565b6040518060c001604052808c81526020018781526020018b8b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152505050908252506001600160a01b038a16602082015260408082018a90526060909101879052516001600160e01b031960e085901b168152612026929190600401613cf9565b5f6040518083038186803b15801561203c575f5ffd5b505af415801561204e573d5f5f3e3d5ffd5b50505050505095945050505050565b834211156120815760405163313c898160e11b81526004810185905260240161199d565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886120eb8c6001600160a01b03165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61214582612a11565b90505f61215482878787612a3d565b9050896001600160a01b0316816001600160a01b03161461219b576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161199d565b6121a68a8a8a61242c565b50505050505050505050565b63dbf6248960e01b6121c38161236c565b6121cb612a69565b50565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b734d6306044d06366039cdddc4c9963189f6d2767963201d48c05f516020613f405f395f51905f526040516001600160e01b031960e084901b16815260048101919091526001600160a01b03841660248201526044015f6040518083038186803b158015612283575f5ffd5b505af4158015612295573d5f5f3e3d5ffd5b5050505050565b5f5f516020613f405f395f51905f52611b5c565b637c3c1b4f60e11b6122c18161236c565b6001600160a01b0383165f8181527f3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe046020908152604091829020859055815192835282018490527f2a82c7b7f2539b4a75f05cda23dc12990cf8e212d55c2a3b6bb6d0d36b08b0059101610e62565b63f93b6be560e01b6123418161236c565b6121cb612acb565b5f739666ab481e8c4b16d1b6dcf38338446f3119b00d633c0541276114896124f4565b5f7fb413d65cb88f23816c329284a0d3eb15a99df7963ab7402ade4c5da22bff6b0054604051633657648360e21b81526001600160e01b0319841660048201523060248201523360448201526001600160a01b039091169063d95d920c90606401602060405180830381865afa1580156123e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061240c9190613d7c565b90508061145b57604051634ca8886760e01b815260040160405180910390fd5b6124398383836001612b10565b505050565b60408051606081018252600181526001600160a01b03848116602083019081528284018581529351632d761af360e01b81525f516020613ec05f395f51905f52600482015292511515602484015251166044820152905160648201525f90819073e4a488d4a5d979f12895f97171687c3d3f490e7590632d761af390608401611dd1565b5f516020613f605f395f51905f525460ff16156124f25760405163d93c066560e01b815260040160405180910390fd5b565b7fe912a1b0cc7579bc5827e495c2ce52587bc3871751e3281fc5599b38c3bfc40090565b5f61252384846121ce565b90505f19811015612576578181101561256857604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161199d565b61257684848484035f612b10565b50505050565b6001600160a01b0383166125a557604051634b637e8f60e11b81525f600482015260240161199d565b6001600160a01b0382166125ce5760405163ec442f0560e01b81525f600482015260240161199d565b612439838383612bf3565b5f6112c8612d2c565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610f5c565b612612612d9f565b61261c8888612dc4565b61262588612dd6565b61262e86612e01565b61263785612e12565b61264084612e4b565b611833838383612e67565b6124f2612d9f565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806126c357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166126b7612ee6565b6001600160a01b031614155b156124f25760405163703e46dd60e11b815260040160405180910390fd5b5f61145b8161236c565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612745575060408051601f3d908101601f1916820190925261274291810190613c34565b60015b61276d57604051634c9c8ce360e01b81526001600160a01b038316600482015260240161199d565b5f516020613f205f395f51905f52811461279d57604051632a87526960e21b81526004810182905260240161199d565b6124398383612efa565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146124f25760405163703e46dd60e11b815260040160405180910390fd5b6001600160a01b03821661281957604051634b637e8f60e11b81525f600482015260240161199d565b61145b825f83612bf3565b604051630a78cab560e31b81525f516020613f405f395f51905f5260048201526001600160a01b038316602482015260448101829052734d6306044d06366039cdddc4c9963189f6d27679906353c655a8906064016111bb565b60605f61115283612f4f565b5f807f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb0061184e565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060915f516020613f005f395f51905f5291610e9290613afd565b60605f5f516020613f005f395f51905f52610e81565b6001600160a01b03821661292f5760405163ec442f0560e01b81525f600482015260240161199d565b61145b5f8383612bf3565b5f516020613f405f395f51905f525f5b835181101561257657734d6306044d06366039cdddc4c9963189f6d276796353c655a88386848151811061298057612980613ce5565b602002602001015186858151811061299a5761299a613ce5565b60200260200101516040518463ffffffff1660e01b81526004016129da939291909283526001600160a01b03919091166020830152604082015260600190565b5f6040518083038186803b1580156129f0575f5ffd5b505af4158015612a02573d5f5f3e3d5ffd5b5050505080600101905061294a565b5f610f5c612a1d6125d9565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f612a4d88888888612fa8565b925092509250612a5d8282613070565b50909695505050505050565b612a716124c2565b5f516020613f605f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612ad3613128565b5f516020613f605f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612aad565b5f516020613ee05f395f51905f526001600160a01b038516612b475760405163e602df0560e01b81525f600482015260240161199d565b6001600160a01b038416612b7057604051634a1406b160e11b81525f600482015260240161199d565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561229557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612be491815260200190565b60405180910390a35050505050565b5f516020613ee05f395f51905f526001600160a01b038416612c2d5781816002015f828254612c229190613c4b565b90915550612c9d9050565b6001600160a01b0384165f9081526020829052604090205482811015612c7f5760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161199d565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316612cbb576002810180548390039055612cd9565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d1e91815260200190565b60405180910390a350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612d56613157565b612d5e6131bf565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b612da7613201565b6124f257604051631afcd79f60e31b815260040160405180910390fd5b612dcc612d9f565b61145b828261321a565b612dde612d9f565b6121cb81604051806040016040528060018152602001603160f81b81525061326a565b612e09612d9f565b6121cb816132c9565b612e1a612d9f565b805f516020613f405f395f51905f525b80546001600160a01b0319166001600160a01b039290921691909117905550565b612e53612d9f565b805f516020613ec05f395f51905f52612e2a565b612e6f612d9f565b5f612e786124f4565b9050825f5b81811015612ebf57612eb6868683818110612e9a57612e9a613ce5565b9050602002016020810190612eaf919061354e565b84906132f8565b50600101612e7d565b505060070180546001600160a01b0319166001600160a01b03929092169190911790555050565b5f5f516020613f205f395f51905f52611e80565b612f038261330c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115612f47576124398282613355565b61145b6133c7565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612f9c57602002820191905f5260205f20905b815481526020019060010190808311612f88575b50505050509050919050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612fe157505f91506003905082613066565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015613032573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661305d57505f925060019150829050613066565b92505f91508190505b9450945094915050565b5f82600381111561308357613083613d97565b0361308c575050565b60018260038111156130a0576130a0613d97565b036130be5760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156130d2576130d2613d97565b036130f35760405163fce698f760e01b81526004810182905260240161199d565b600382600381111561310757613107613d97565b0361145b576040516335e2f38360e21b81526004810182905260240161199d565b5f516020613f605f395f51905f525460ff166124f257604051638dfc202b60e01b815260040160405180910390fd5b5f5f516020613f005f395f51905f528161316f6128b2565b80519091501561318757805160209091012092915050565b81548015613196579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f5f516020613f005f395f51905f52816131d76128f0565b8051909150156131ef57805160209091012092915050565b60018201548015613196579392505050565b5f61320a6125e2565b54600160401b900460ff16919050565b613222612d9f565b5f516020613ee05f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361325b8482613def565b50600481016125768382613def565b613272612d9f565b5f516020613f005f395f51905f527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1026132ab8482613def565b50600381016132ba8382613def565b505f8082556001909101555050565b6132d1612d9f565b807fb413d65cb88f23816c329284a0d3eb15a99df7963ab7402ade4c5da22bff6b00612e2a565b5f611152836001600160a01b0384166133e6565b806001600160a01b03163b5f0361334157604051634c9c8ce360e01b81526001600160a01b038216600482015260240161199d565b805f516020613f205f395f51905f52612e2a565b60605f5f846001600160a01b0316846040516133719190613ea9565b5f60405180830381855af49150503d805f81146133a9576040519150601f19603f3d011682016040523d82523d5f602084013e6133ae565b606091505b50915091506133be858383613432565b95945050505050565b34156124f25760405163b398979f60e01b815260040160405180910390fd5b5f81815260018301602052604081205461342b57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610f5c565b505f610f5c565b606082613447576134428261348e565b611152565b815115801561345e57506001600160a01b0384163b155b1561348757604051639996b31560e01b81526001600160a01b038516600482015260240161199d565b5080611152565b80511561349e5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b03811681146134cd575f5ffd5b919050565b5f5f82840360e08112156134e4575f5ffd5b6134ed846134b7565b925060c0601f1982011215613500575f5ffd5b506020830190509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611152602083018461350e565b5f6020828403121561355e575f5ffd5b611152826134b7565b5f5f60408385031215613578575f5ffd5b613581836134b7565b946020939093013593505050565b5f5f5f606084860312156135a1575f5ffd5b6135aa846134b7565b92506135b8602085016134b7565b929592945050506040919091013590565b5f602082840312156135d9575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b828110156136105781518652602095860195909101906001016135f2565b5093949350505050565b604081525f61362c60408301856135e0565b82810360208401526133be81856135e0565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561367a5761367a61363e565b604052919050565b5f5f6001600160401b0384111561369b5761369b61363e565b50601f8301601f19166020016136b081613652565b9150508281528383830111156136c4575f5ffd5b828260208301375f602084830101529392505050565b5f82601f8301126136e9575f5ffd5b61115283833560208501613682565b5f5f83601f840112613708575f5ffd5b5081356001600160401b0381111561371e575f5ffd5b6020830191508360208260051b8501011115613738575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60e0898b031215613756575f5ffd5b88356001600160401b0381111561376b575f5ffd5b6137778b828c016136da565b98505060208901356001600160401b03811115613792575f5ffd5b61379e8b828c016136da565b9750506137ad60408a016134b7565b95506137bb60608a016134b7565b94506137c960808a016134b7565b935060a08901356001600160401b038111156137e3575f5ffd5b6137ef8b828c016136f8565b9094509250613802905060c08a016134b7565b90509295985092959890939650565b5f5f60408385031215613822575f5ffd5b61382b836134b7565b915060208301356001600160401b03811115613845575f5ffd5b8301601f81018513613855575f5ffd5b61386485823560208401613682565b9150509250929050565b80151581146121cb575f5ffd5b5f5f6040838503121561388c575f5ffd5b613895836134b7565b915060208301356138a58161386e565b809150509250929050565b5f5f5f5f5f60a086880312156138c4575f5ffd5b6138cd866134b7565b945060208601359350604086013592506138e9606087016134b7565b949793965091946080013592915050565b5f5f6040838503121561390b575f5ffd5b613914836134b7565b9150613922602084016134b7565b90509250929050565b5f5f5f6060848603121561393d575f5ffd5b613946846134b7565b92506020840135915061395b604085016134b7565b90509250925092565b602080825282518282018190525f918401906040840190835b818110156139a45783516001600160a01b031683526020938401939092019160010161397d565b509095945050505050565b60ff60f81b8816815260e060208201525f6139cd60e083018961350e565b82810360408401526139df818961350e565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501529050613a1081856135e0565b9a9950505050505050505050565b5f5f5f5f5f60808688031215613a32575f5ffd5b8535945060208601356001600160401b03811115613a4e575f5ffd5b613a5a888289016136f8565b9095509350613a6d9050604087016134b7565b949793965091946060013592915050565b602081525f61115260208301846135e0565b5f5f5f5f5f5f5f60e0888a031215613aa6575f5ffd5b613aaf886134b7565b9650613abd602089016134b7565b95506040880135945060608801359350608088013560ff81168114613ae0575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b600181811c90821680613b1157607f821691505b602082108103613b2f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610f5c57610f5c613b35565b5f82601f830112613b6b575f5ffd5b81516001600160401b03811115613b8457613b8461363e565b8060051b613b9460208201613652565b91825260208185018101929081019086841115613baf575f5ffd5b6020860192505b83831015613bd1578251825260209283019290910190613bb6565b9695505050505050565b5f5f60408385031215613bec575f5ffd5b82516001600160401b03811115613c01575f5ffd5b613c0d85828601613b5c565b92505060208301516001600160401b03811115613c28575f5ffd5b61386485828601613b5c565b5f60208284031215613c44575f5ffd5b5051919050565b80820180821115610f5c57610f5c613b35565b5f6101008201905083825260018060a01b03835116602083015260208301516040830152604083015160608301526060830151608083015260018060a01b0360808401511660a083015260a083015160c083015260c083015160e08301529392505050565b5f5f60408385031215613cd4575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52603260045260245ffd5b82815260406020820152815160408201525f602083015160c06060840152613d256101008401826135e0565b90506040840151603f19848303016080850152613d4282826135e0565b91505060018060a01b0360608501511660a0840152608084015160c084015260a0840151603f198483030160e0850152613bd182826135e0565b5f60208284031215613d8c575f5ffd5b81516111528161386e565b634e487b7160e01b5f52602160045260245ffd5b601f82111561243957805f5260205f20601f840160051c81016020851015613dd05750805b601f840160051c820191505b81811015612295575f8155600101613ddc565b81516001600160401b03811115613e0857613e0861363e565b613e1c81613e168454613afd565b84613dab565b6020601f821160018114613e4e575f8315613e375750848201515b5f19600385901b1c1916600184901b178455612295565b5f84815260208120601f198516915b82811015613e7d5787850151825560209485019460019092019101613e5d565b5084821015613e9a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fe3b40995b576f8dd0a8521bba471c5346e53f6a25529b0903b82331eb1a2afe0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5c48f30a22a9811126b69b5adcaabfc5ae0a83b6493e1b31e09dc579923ad100cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a26469706673582212202109b72870eac1fb6b4d6c445060153cb08068873ade23720774645c155ca5ee64736f6c634300081c0033