6 txs
7 calls
constructor
constructor()
functions
controller
viewfunction controller() view returns (address)
correctPriceDirection
purefunction correctPriceDirection(address base, address quote, uint160 sqrtPriceX96) pure returns (uint160 sqrtPriceX96Corrected)
existingV4Pools
viewfunction existingV4Pools(address) view returns (address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks)
factory
viewfunction factory() view returns (address)
funder
viewfunction funder() view returns (address)
getController
viewfunction getController() view returns (address _controller)
getFunder
viewfunction getFunder() view returns (address _funder)
getPreferredPoolFor
viewfunction getPreferredPoolFor(address a, address b) view returns (address pool)
getPriceFromSqrtPriceX96
purefunction getPriceFromSqrtPriceX96(int8 decimalDiff, uint160 sqrtPriceX96) pure returns (uint80 price_12Decimals)
getSqrtPriceX96FromPrice
purefunction getSqrtPriceX96FromPrice(int8 decimalDiff, uint80 price_12Decimals) pure returns (uint160 sqrtPriceX96)
getTotalValueEth12
viewfunction getTotalValueEth12() view returns (uint128 valueEth12)
getTotalValueUsd12
viewfunction getTotalValueUsd12() view returns (uint128 valueUsd12)
getTwapPriceP12
viewfunction getTwapPriceP12(int8 decimalDiff, address base, address quote, uint32 duration) view returns (uint80 price12)
getUsd12ValueIn
viewfunction getUsd12ValueIn(address token) view returns (uint128 valueUsd12)
indexFromTokenAddress
viewfunction indexFromTokenAddress(address) view returns (uint8)
lastPriceUsd12
viewfunction lastPriceUsd12() view returns (uint80)
owner
viewfunction owner() view returns (address)
poolPositionIn
viewfunction poolPositionIn(address) view returns (uint256)
positionManager
viewfunction positionManager() view returns (address)
safeGetPrice12Of
viewfunction safeGetPrice12Of(address base, address quote) view returns (uint80 price12)
safeGetPriceUSDC12Of
viewfunction safeGetPriceUSDC12Of(address token) view returns (uint80 price12)
sqrt
purefunction sqrt(uint256 x) pure returns (uint128)
swapRouter
viewfunction swapRouter() view returns (address)
tokensHeld
viewfunction tokensHeld(uint256) view returns (address)
uniswapV3ETHPoolByToken
viewfunction uniswapV3ETHPoolByToken(address) view returns (address)
uniswapV3USDCPoolByToken
viewfunction uniswapV3USDCPoolByToken(address) view returns (address)
v4PoolManager
viewfunction v4PoolManager() view returns (address)
validEmergencyTokens
viewfunction validEmergencyTokens(address) view returns (bool)
addEmergencyToken
nonpayablefunction addEmergencyToken(address token)
createPosition
nonpayablefunction createPosition(tuple key, uint80 lowPriceUsd12, uint80 highPriceUsd12, uint128 valueToAddUsd12) returns (uint256 positionId)
depositEth
payablefunction depositEth() payable
depositToken
nonpayablefunction depositToken(address token, uint256 amount)
destroyPosition
nonpayablefunction destroyPosition(uint256 positionId)
emergencyCircuitBreaker
nonpayablefunction emergencyCircuitBreaker(address storeOfValueToken)
lockEmergencyTokens
nonpayablefunction lockEmergencyTokens()
renounceOwnership
nonpayablefunction renounceOwnership()
rescueTokens
nonpayablefunction rescueTokens(address token)
setController
nonpayablefunction setController(address newController)
setFunder
nonpayablefunction setFunder(address newFunder)
swapTokensInto
nonpayablefunction swapTokensInto(address tokenFrom, address tokenTo, uint256 quantity) returns (uint256 amountOut)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdrawEth
nonpayablefunction withdrawEth(address destination, uint256 amount)
withdrawToken
nonpayablefunction withdrawToken(address token, address destination, uint256 amount)
events
ControllerSet
event ControllerSet(address newController, address oldController)
Deposited
event Deposited(address token, uint256 amount)
EmergencyCircuitBreakerFlipped
event EmergencyCircuitBreakerFlipped(address storeOfValueToken)
FunderSet
event FunderSet(address newController, address oldController)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PositionBurned
event PositionBurned(uint256 poolPosition, uint128 valueWithdrawnUsd12)
PositionMinted
event PositionMinted(uint256 poolPosition, uint80 minPrice, uint80 maxPrice, uint128 valueToAddUsd12)
TokensSwapped
event TokensSwapped(address from, address to, uint256 fromAmt, uint256 toAmt)
Withdrawed
event Withdrawed(address token, uint256 amount)
errors
No errors.
creation bytecode
0x60e060405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a0527388e6a0c2ddd26feeb64f039a2c41296fcb3f564060c05260038054600160a01b600160f01b031916630e8d4a5160ac1b1790556011805461ffff1916905534801561007e575f80fd5b5061008833610163565b6080516001600160a01b039081165f818152600160208181526040808420805460ff19908116851790915560a0518716855281852080548216851790557fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805490911690931790925560c051600682527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f880546001600160a01b031990811692909716918217905582842080548716821790559383526007905290208054909216179055610155336101b2565b61015e33610218565b6102ec565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6101ba610273565b600280546001600160a01b038381166001600160a01b03198316179092556040519116907e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a9061020c90849084906102d2565b60405180910390a15050565b610220610273565b600380546001600160a01b038381166001600160a01b03198316179092556040519116907f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c669061020c90849084906102d2565b5f546001600160a01b031633146102d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b6001600160a01b0392831681529116602082015260400190565b60805160a05160c051613fc46103d05f395f50505f8181610d1e015281816111980152818161186b015281816119d401528181611a860152818161227b0152818161232201528181612889015281816129bb01528181612b200152612ceb01525f8181610d4901528181610e4101528181610e7f01528181610ebc01528181610eea015281816110aa015281816114ba015281816118c40152818161197b01528181611a2d01528181611b3e01528181611b7901528181611bb701528181611e970152818161222a01528181612682015281816129540152612ad60152613fc45ff3fe6080604052600436106101ea575f3560e01c8062ae3bf8146101ee57806301e336671461020f578063041ae8801461022e5780630884db19146102635780630acc8cd11461030357806310582d591461032257806315cbcf861461034f57806319cc3357146103835780631b9a91a4146103975780631fba9eda146103b657806322b67b5e146103d557806323f2470d146103f45780632b069783146104325780632dc516ba146104515780633018205f14610485578063338b5dea146104a2578063439370b1146104c15780634a2539c3146104c957806363011d1a146104e857806366ae998e14610514578063677342ce14610533578063715018a614610552578063791b98bc146105665780637a3dfdad1461058d5780638abb9845146105ac5780638da5cb5b146105c957806392eefe9b146105dd5780639a7fe3a1146105fc5780639ba692491461061b578063a9e88b8f1461062f578063af6fa3f61461066d578063b3a5794314610698578063bc501ee7146106b7578063c0c8eca6146106d6578063c31c9c07146106f8578063c45a01551461071f578063c4b19b5414610746578063d0280b6f14610765578063df2a558b14610784578063ea4bc51c146107c4578063f2fde38b146107e3578063f60b36e314610802578063f77c479114610821575b5f80fd5b3480156101f9575f80fd5b5061020d61020836600461344c565b610840565b005b34801561021a575f80fd5b5061020d610229366004613467565b6109d1565b348015610239575f80fd5b5060035461024d906001600160a01b031681565b60405161025a91906134b2565b60405180910390f35b34801561026e575f80fd5b506102c361027d36600461344c565b60046020525f90815260409020805460018201546002928301546001600160a01b03928316938284169362ffffff600160a01b85041693600160b81b900490910b911685565b604080516001600160a01b039687168152948616602086015262ffffff9093169284019290925260020b606083015291909116608082015260a00161025a565b34801561030e575f80fd5b5061020d61031d36600461344c565b610ab9565b34801561032d575f80fd5b5061034161033c3660046134f0565b610b20565b60405190815260200161025a565b34801561035a575f80fd5b5061024d61036936600461344c565b60076020525f90815260409020546001600160a01b031681565b34801561038e575f80fd5b5061020d610bac565b3480156103a2575f80fd5b5061020d6103b136600461354b565b610bc5565b3480156103c1575f80fd5b5061024d6103d0366004613585565b610c41565b3480156103e0575f80fd5b5061020d6103ef36600461344c565b610c95565b3480156103ff575f80fd5b5060035461041a90600160a01b90046001600160501b031681565b6040516001600160501b03909116815260200161025a565b34801561043d575f80fd5b5061041a61044c3660046135b6565b610d71565b34801561045c575f80fd5b5061024d61046b36600461344c565b60066020525f90815260409020546001600160a01b031681565b348015610490575f80fd5b506002546001600160a01b031661024d565b3480156104ad575f80fd5b5061020d6104bc36600461354b565b610f22565b61020d611003565b3480156104d4575f80fd5b5061020d6104e33660046135ed565b61102b565b3480156104f3575f80fd5b506104fc611097565b6040516001600160801b03909116815260200161025a565b34801561051f575f80fd5b5061034161052e366004613467565b6111ee565b34801561053e575f80fd5b506104fc61054d3660046135ed565b61123c565b34801561055d575f80fd5b5061020d6113b8565b348015610571575f80fd5b5061024d73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e81565b348015610598575f80fd5b5061041a6105a7366004613604565b6113cb565b3480156105b7575f80fd5b506003546001600160a01b031661024d565b3480156105d4575f80fd5b5061024d61144f565b3480156105e8575f80fd5b5061020d6105f736600461344c565b61145d565b348015610607575f80fd5b506104fc61061636600461344c565b6114b7565b348015610626575f80fd5b506104fc611865565b34801561063a575f80fd5b5061065d61064936600461344c565b60016020525f908152604090205460ff1681565b604051901515815260200161025a565b348015610678575f80fd5b5061034161068736600461344c565b60056020525f908152604090205481565b3480156106a3575f80fd5b5061024d6106b236600461361e565b611938565b3480156106c2575f80fd5b5061024d6106d13660046135b6565b611978565b3480156106e1575f80fd5b5061024d6e04444c5dc75cb358380d2e3de08a9081565b348015610703575f80fd5b5061024d73e592427a0aece92de3edee1f18e0157c0586156481565b34801561072a575f80fd5b5061024d731f98431c8ad98523631ae4a59f267346ea31f98481565b348015610751575f80fd5b5061024d6107603660046135ed565b611b1b565b348015610770575f80fd5b5061041a61077f366004613666565b611b3a565b34801561078f575f80fd5b506107b261079e36600461344c565b60106020525f908152604090205460ff1681565b60405160ff909116815260200161025a565b3480156107cf575f80fd5b5061041a6107de36600461344c565b611e20565b3480156107ee575f80fd5b5061020d6107fd36600461344c565b611ebd565b34801561080d575f80fd5b5061020d61081c36600461344c565b611f36565b34801561082c575f80fd5b5060025461024d906001600160a01b031681565b61084861201d565b6001600160a01b0381165f9081526010602052604090205460115460ff9182169116811015806108a15750816001600160a01b031660088260ff1660088110610893576108936136ba565b01546001600160a01b031614155b6108ed5760405162461bcd60e51b815260206004820152601860248201527743616e6e6f74202772657363756527206465706f7369747360401b60448201526064015b60405180910390fd5b816001600160a01b031663a9059cbb61090461144f565b6040516370a0823160e01b81526001600160a01b038616906370a08231906109309030906004016134b2565b602060405180830381865afa15801561094b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096f91906136ce565b6040518363ffffffff1660e01b815260040161098c9291906136e5565b6020604051808303815f875af11580156109a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109cc919061370d565b505050565b6003546001600160a01b031633146109fb5760405162461bcd60e51b81526004016108e490613726565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610a2990859085906004016136e5565b6020604051808303815f875af1158015610a45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a69919061370d565b610a855760405162461bcd60e51b81526004016108e49061374c565b610a8e8361207c565b5f80516020613f6f8339815191528382604051610aac9291906136e5565b60405180910390a1505050565b610ac161201d565b600380546001600160a01b038381166001600160a01b03198316179092556040519116907f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6690610b149084908490613775565b60405180910390a15050565b6002545f906001600160a01b03163314610b4c5760405162461bcd60e51b81526004016108e49061378f565b604080518281526001600160501b0386811660208301528516818301526001600160801b038416606082015290517f302fb83d9acdec00c356242ee263baccea570ea54edf16005f0e6481b5b49cba9181900360800190a1949350505050565b610bb461201d565b6011805461ff001916610100179055565b6003546001600160a01b03163314610bef5760405162461bcd60e51b81526004016108e490613726565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610c22573d5f803e3d5ffd5b505f80516020613f6f8339815191525f82604051610b149291906136e5565b5f80610c4e84600c6137d7565b610c5990600a6138da565b610c7390600160ac1b600160fc1b0360ac86901b166138fc565b9050600a610c808261123c565b6001600160801b0316901b9150505b92915050565b610c9d61201d565b601154610100900460ff1615610cf35760405162461bcd60e51b815260206004820152601b60248201527a115b595c99d95b98de481d1bdad95b881b1a5cdd081b1bd8dad959602a1b60448201526064016108e4565b6001600160a01b0381165f908152600160208190526040909120805460ff19169091179055610d42817f0000000000000000000000000000000000000000000000000000000000000000612227565b50610d6d817f0000000000000000000000000000000000000000000000000000000000000000612227565b5050565b5f80826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610daf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd3919061391f565b846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e33919061391f565b610e3d9190613938565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031603610ead57610ea581857f00000000000000000000000000000000000000000000000000000000000000006078611b3a565b915050610c8f565b610ee2610eb982613958565b847f00000000000000000000000000000000000000000000000000000000000000006078611b3a565b610f10600c867f00000000000000000000000000000000000000000000000000000000000000006078611b3a565b610f1a9190613974565b949350505050565b6003546001600160a01b03163314610f4c5760405162461bcd60e51b81526004016108e490613726565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303815f875af1158015610f9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc0919061370d565b610fdc5760405162461bcd60e51b81526004016108e49061374c565b610fe582612a2e565b5f80516020613f4f8339815191528282604051610b149291906136e5565b5f80516020613f4f8339815191525f346040516110219291906136e5565b60405180910390a1565b6002546001600160a01b031633148061104357503330145b61105f5760405162461bcd60e51b81526004016108e49061378f565b604080518281525f60208201819052917f8b27c8eb259e7d0d2de73b88a099b24ebe3d0d71310ba889f76be773094947749101610b14565b5f6110a5620f4240476138fc565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016110f491906134b2565b602060405180830381865afa15801561110f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113391906136ce565b61114090620f42406139a2565b90505f5b60115460ff90811690821610156111925761117e60088260ff166008811061116e5761116e6136ba565b01546001600160a01b03166114b7565b61118890836139b9565b9150600101611144565b506111bc7f0000000000000000000000000000000000000000000000000000000000000000611e20565b6001600160501b03166111d48264e8d4a510006139d8565b6111de91906139fa565b6111e890836139b9565b91505090565b6002545f906001600160a01b031633148061120857503330145b6112245760405162461bcd60e51b81526004016108e49061378f565b611232848484613a98612c4e565b90505b9392505050565b5f815f0361124b57505f919050565b816001600160801b82106112645760809190911c9060401b5b600160401b821061127a5760409190911c9060201b5b600160201b82106112905760209190911c9060101b5b6201000082106112a55760109190911c9060081b5b61010082106112b95760089190911c9060041b5b601082106112cc5760049190911c9060021b5b600882106112d85760011b5b60016112e482866138fc565b6112ee9083613a28565b901c905060016112fe82866138fc565b6113089083613a28565b901c9050600161131882866138fc565b6113229083613a28565b901c9050600161133282866138fc565b61133c9083613a28565b901c9050600161134c82866138fc565b6113569083613a28565b901c9050600161136682866138fc565b6113709083613a28565b901c9050600161138082866138fc565b61138a9083613a28565b901c90505f61139982866138fc565b90508082106113a857806113aa565b815b95945050505050565b919050565b6113c061201d565b6113c95f612e9b565b565b5f80600a6113e56001600160a01b038516620f42406139a2565b901c90505f845f0b1261141d5760ac6113ff85600a6138da565b61140983806139a2565b61141391906139a2565b901c915050610c8f565b61142684613958565b61143190600a6138da565b60ac61143d83806139a2565b610ea592911c6138fc565b5092915050565b5f546001600160a01b031690565b61146561201d565b600280546001600160a01b038381166001600160a01b03198316179092556040519116907e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a90610b149084908490613775565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611569576040516370a0823160e01b81526001600160a01b038316906370a082319061151d9030906004016134b2565b602060405180830381865afa158015611538573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155c91906136ce565b610c8f90620f42406139a2565b6040516370a0823160e01b81525f906001600160a01b038416906370a08231906115979030906004016134b2565b602060405180830381865afa1580156115b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d691906136ce565b6001600160a01b0384165f90815260056020526040902054909150156117d3576001600160a01b0383165f90815260056020526040808220549051631efeed3360e01b8152600481019190915273bd216513d74c8cf14cf4747e6aaa6420ff64ee9e90631efeed3390602401602060405180830381865afa15801561165d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116819190613a3b565b6001600160a01b0385165f90815260056020526040808220549051637ba03aad60e01b8152600481019190915291925090819073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e90637ba03aad9060240160c060405180830381865afa1580156116ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117129190613abd565b915091505f6117228360a0902090565b90505f61173e6e04444c5dc75cb358380d2e3de08a9083612eea565b50505090505f806117748361175e6117598860081c60020b90565b612f9c565b61176e6117598960201c60020b90565b8a613254565b91509150896001600160a01b0316865f01516001600160a01b0316036117a15761179e8289613a28565b97505b896001600160a01b031686602001516001600160a01b0316036117cb576117c88189613a28565b97505b505050505050505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611833919061391f565b61183e90600a6138da565b8161184885611e20565b6001600160501b031661185b91906139a2565b61123591906138fc565b5f61188f7f0000000000000000000000000000000000000000000000000000000000000000611e20565b6118aa906001600160501b0316670de0b6b3a76400006139d8565b6118bd906001600160801b0316476138fc565b90506118e87f00000000000000000000000000000000000000000000000000000000000000006114b7565b6118f290826139b9565b90505f5b60115460ff90811690821610156119345761192060088260ff166008811061116e5761116e6136ba565b61192a90836139b9565b91506001016118f6565b5090565b5f826001600160a01b0316846001600160a01b0316101561195a575080611235565b6119716001600160a01b038316600160c01b6138fc565b9050611235565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036119d257506001600160a01b038082165f9081526006602052604090205416610c8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031603611a2b57506001600160a01b038082165f9081526007602052604090205416610c8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611a8457506001600160a01b038083165f9081526006602052604090205416610c8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611add57506001600160a01b038083165f9081526007602052604090205416610c8f565b60405162461bcd60e51b81526020600482015260136024820152722830b4b9103737ba1039bab83837b93a32b21760691b60448201526064016108e4565b60088160088110611b2a575f80fd5b01546001600160a01b0316905081565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03161480611bad57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b15611c155760065f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614611bf45785611bf6565b865b6001600160a01b03908116825260208201929092526040015f20541690505b6001600160a01b0385161580611c3257506001600160a01b038416155b15611c705760065f6001600160a01b03861615611c4f5785611c51565b865b6001600160a01b03908116825260208201929092526040015f20541690505b6001600160a01b038116611cbc5760405162461bcd60e51b81526020600482015260136024820152722ab735b737bbb7103a37b5b2b7103830b4b91760691b60448201526064016108e4565b6040805160028082526060820183525f9260208301908036833701905050905083815f81518110611cef57611cef6136ba565b602002602001019063ffffffff16908163ffffffff16815250505f81600181518110611d1d57611d1d6136ba565b63ffffffff9092166020928302919091019091015260405163883bdbfd60e01b81525f906001600160a01b0384169063883bdbfd90611d60908590600401613b67565b5f60405180830381865afa158015611d7a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611da19190810190613c44565b5090505f8563ffffffff16825f81518110611dbe57611dbe6136ba565b602002602001015183600181518110611dd957611dd96136ba565b6020026020010151611deb9190613d0e565b611df59190613d3b565b90505f611e0689896106b285612f9c565b9050611e128a826113cb565b9a9950505050505050505050565b5f806006836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e84919061391f565b611e8e9190613938565b905061123581847f00000000000000000000000000000000000000000000000000000000000000006078611b3a565b611ec561201d565b6001600160a01b038116611f2a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e4565b611f3381612e9b565b50565b6002546001600160a01b0316331480611f675750611f5261144f565b6001600160a01b0316336001600160a01b0316145b611f835760405162461bcd60e51b81526004016108e49061378f565b6001600160a01b0381165f9081526001602052604090205460ff16611fe35760405162461bcd60e51b81526020600482015260166024820152752737ba1030b71032b6b2b933b2b731bc903a37b5b2b760511b60448201526064016108e4565b7f2cc79b200fc7fdf7af6be005fc77813bfacedb82066816356eed5b7df46194708160405161201291906134b2565b60405180910390a150565b3361202661144f565b6001600160a01b0316146113c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6001600160a01b0381165f9081526010602052604090205460115460ff9182169116811080156120d45750816001600160a01b031660088260ff16600881106120c7576120c76136ba565b01546001600160a01b0316145b801561214b57506040516370a0823160e01b81526064906001600160a01b038416906370a082319061210a9030906004016134b2565b602060405180830381865afa158015612125573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214991906136ce565b105b15610d6d576011805460ff16905f61216283613d77565b82546101009290920a60ff81810219909316918316021790915560115416159050610d6d5760115460089060ff1681811061219f5761219f6136ba565b01546001600160a01b0316600860ff83168181106121bf576121bf6136ba565b0180546001600160a01b0319166001600160a01b03929092169190911790558060105f600860ff84168181106121f7576121f76136ba565b01546001600160a01b0316815260208101919091526040015f20805460ff191660ff929092169190911790555050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415801561227257506001600160a01b03821615155b80156122b057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156123125760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c7920737570706f7274656420666f7220706169727320616761696e737460448201526b040aaa6888640dee4408aa8960a31b60648201526084016108e4565b6001600160a01b038216612344577f000000000000000000000000000000000000000000000000000000000000000091505b60408051608081018252606481526101f46020820152610bb89181019190915261271060608201525f80805b60048160ff1610156125dd575f866001600160a01b0316886001600160a01b0316101561243157731f98431c8ad98523631ae4a59f267346ea31f984631698ee8289898860ff8716600481106123c8576123c86136ba565b60200201516040518463ffffffff1660e01b81526004016123eb93929190613d92565b602060405180830381865afa158015612406573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242a9190613dba565b90506124c7565b731f98431c8ad98523631ae4a59f267346ea31f984631698ee82888a8860ff871660048110612462576124626136ba565b60200201516040518463ffffffff1660e01b815260040161248593929190613d92565b602060405180830381865afa1580156124a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124c49190613dba565b90505b6001600160a01b0381166124db57506125cb565b5f816001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa158015612518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253c9190613a3b565b9050846001600160801b0316816001600160801b031611156125c857809450819650816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190613de6565b5094985050505050505b50505b806125d581613e69565b915050612370565b506001600160a01b0384166126255760405162461bcd60e51b815260206004820152600e60248201526d139bc81c1bdbdb1cc8199bdd5b9960921b60448201526064016108e4565b5f61271061263e6001600160a01b0384166128076139a2565b61264891906138fc565b90505f620186a06126656001600160a01b03851662017cbc6139a2565b61266f91906138fc565b90505f61267d8284876132d1565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b03160361279e57896001600160a01b0316896001600160a01b031610156126e7576126e082620f42406139a2565b90506128ce565b6126fe6001600160a01b038616600160c01b6138fc565b945061270b6006866113cb565b6001600160501b03169050886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612752573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612776919061391f565b61278190600a6138da565b6127946001600160801b038316846139a2565b6126e091906138fc565b5f8a6001600160a01b03168a6001600160a01b031610156127cd576127c6620f4240846138fc565b905061287e565b6127e46001600160a01b038716600160c01b6138fc565b95506127f16006876113cb565b6001600160501b03169050896001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612838573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061285c919061391f565b61286790600a6138da565b61287182856139a2565b61287b91906138fc565b90505b64e8d4a510006128ad7f0000000000000000000000000000000000000000000000000000000000000000611e20565b6128c0906001600160501b0316836139a2565b6128ca91906138fc565b9150505b5f6128d7611865565b6128e29060046139d8565b9050806001600160801b0316826001600160801b031610156129525760405162461bcd60e51b815260206004820152602360248201527f4e6f20706f6f6c207769746820656e6f756768206c697175696469747920666f6044820152621d5b9960ea1b60648201526084016108e4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b0316036129b9576001600160a01b038b81165f90815260066020526040902080546001600160a01b031916918b169190911790555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b031603612a20576001600160a01b038b81165f90815260076020526040902080546001600160a01b031916918b169190911790555b505050505050505092915050565b60405163095ea7b360e01b81526001600160a01b0382169063095ea7b390612a719073e592427a0aece92de3edee1f18e0157c05861564905f19906004016136e5565b6020604051808303815f875af1158015612a8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ab1919061370d565b506001600160a01b038181165f9081526006602052604090205416612afc57612afa817f0000000000000000000000000000000000000000000000000000000000000000612227565b505b6001600160a01b038181165f9081526007602052604090205416612b4657612b44817f0000000000000000000000000000000000000000000000000000000000000000612227565b505b6001600160a01b0381165f8181526010602052604090205460089060ff16818110612b7357612b736136ba565b01546001600160a01b031614611f3357601154600860ff90911610612bca5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f66206d656d6f727960981b60448201526064016108e4565b601154819060089060ff16818110612be457612be46136ba565b0180546001600160a01b039283166001600160a01b0319909116179055601180549183165f908152601060205260408120805460ff191660ff948516179055815490921691612c3283613e69565b91906101000a81548160ff021916908360ff1602179055505050565b5f8062ffffff831615612cae575f612c668787610d71565b9050670de0b6b3a7640000612c7e85620f4240613e87565b62ffffff16612c966001600160501b038416886139a2565b612ca091906139a2565b612caa91906138fc565b9150505b5f604051806101000160405280886001600160a01b031681526020015f6001600160a01b0316886001600160a01b031614612ce95787612d0b565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03168152602001612d238989611978565b6001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d829190613ea2565b62ffffff168152602001336001600160a01b031681526020014281526020018681526020018381526020015f6001600160a01b0316815250905073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663414bf389826040518263ffffffff1660e01b8152600401612dfc9190613ebb565b6020604051808303815f875af1158015612e18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3c91906136ce565b604080516001600160a01b03808b16825289166020820152908101879052606081018290529093507f25f1d03755df23c30e25db2dbd3891e31ce084bdfbfc46f9fe5e446ee5f9b2d49060800160405180910390a15050949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f805f612ef88661331c565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa158015612f40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f6491906136ce565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e8811115612fc557612fc56345c3193d60e11b84613358565b7001fffcb933bd6fad37aa2d162d1a5940016001821602600160801b186002821615613001576ffff97272373d413259a46990580e213a0260801c5b6004821615613020576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561303f576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b601082161561305e576fffcb9843d60f6159c9db58835c9266440260801c5b602082161561307d576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561309c576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156130bb576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156130db576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156130fb576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561311b576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561313b576fe7159475a2c29b7443b29c7fa6e889d90260801c5b61100082161561315b576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161561317b576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561319b576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156131bb576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156131dc576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156131fc576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561321b576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615613238576b048a170391f7dc42444e8fa20260801c5b5f841315613244575f19045b63ffffffff0160201c9392505050565b5f80846001600160a01b0316866001600160a01b0316116132815761327a8585856132d1565b91506132c8565b836001600160a01b0316866001600160a01b031610156132ba576132a68685856132d1565b91506132b3858785613367565b90506132c8565b6132c5858585613367565b90505b94509492505050565b5f6001600160a01b038416613312600160601b600160e01b03606085901b166132fa8787613f2f565b6001600160a01b0316866001600160a01b031661338e565b61123291906138fc565b6040515f9061333b908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f6112326001600160801b03831661337f8686613f2f565b6001600160a01b0316600160601b5b5f80805f19858709858702925082811083820303915050805f036133c2575f84116133b7575f80fd5b508290049050611235565b8084116133cd575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6001600160a01b0381168114611f33575f80fd5b5f6020828403121561345c575f80fd5b813561123581613438565b5f805f60608486031215613479575f80fd5b833561348481613438565b9250602084013561349481613438565b929592945050506040919091013590565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b80356001600160501b03811681146113b3575f80fd5b6001600160801b0381168114611f33575f80fd5b5f805f80848603610100811215613505575f80fd5b60a0811215613512575f80fd5b5084935061352260a086016134c6565b925061353060c086016134c6565b915060e0850135613540816134dc565b939692955090935050565b5f806040838503121561355c575f80fd5b823561356781613438565b946020939093013593505050565b80355f81900b81146113b3575f80fd5b5f8060408385031215613596575f80fd5b61359f83613575565b91506135ad602084016134c6565b90509250929050565b5f80604083850312156135c7575f80fd5b82356135d281613438565b915060208301356135e281613438565b809150509250929050565b5f602082840312156135fd575f80fd5b5035919050565b5f8060408385031215613615575f80fd5b6135d283613575565b5f805f60608486031215613630575f80fd5b833561363b81613438565b9250602084013561364b81613438565b9150604084013561365b81613438565b809150509250925092565b5f805f8060808587031215613679575f80fd5b61368285613575565b9350602085013561369281613438565b925060408501356136a281613438565b9150606085013563ffffffff81168114613540575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156136de575f80fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b805180151581146113b3575f80fd5b5f6020828403121561371d575f80fd5b611235826136fe565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6001600160a01b0392831681529116602082015260400190565b6020808252601a90820152792cb7ba903237903737ba103430bb32903832b936b4b9b9b4b7b760311b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f81810b9083900b01607f8113607f1982121715610c8f57610c8f6137c3565b6001815b600184111561383257808504811115613816576138166137c3565b600184161561382457908102905b60019390931c9280026137fb565b935093915050565b5f8261384857506001610c8f565b8161385457505f610c8f565b816001811461386a576002811461387457613890565b6001915050610c8f565b60ff841115613885576138856137c3565b50506001821b610c8f565b5060208310610133831016604e8410600b84101617156138b3575081810a610c8f565b6138bf5f1984846137f7565b805f19048211156138d2576138d26137c3565b029392505050565b5f61123560ff84168361383a565b634e487b7160e01b5f52601260045260245ffd5b5f8261390a5761390a6138e8565b500490565b805160ff811681146113b3575f80fd5b5f6020828403121561392f575f80fd5b6112358261390f565b5f82810b9082900b03607f198112607f82131715610c8f57610c8f6137c3565b5f81810b6080810161396c5761396c6137c3565b5f0392915050565b5f6001600160501b0383168061398c5761398c6138e8565b6001600160501b03929092169190910492915050565b8082028115828204841417610c8f57610c8f6137c3565b6001600160801b038181168382160190811115610c8f57610c8f6137c3565b6001600160801b038181168382160290811690818114611448576114486137c3565b5f6001600160801b03831680613a1257613a126138e8565b6001600160801b03929092169190910492915050565b80820180821115610c8f57610c8f6137c3565b5f60208284031215613a4b575f80fd5b8151611235816134dc565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613a9257613a92613a56565b604052919050565b805162ffffff811681146113b3575f80fd5b8051600281900b81146113b3575f80fd5b5f8082840360c0811215613acf575f80fd5b60a0811215613adc575f80fd5b5060405160a081016001600160401b0381118282101715613aff57613aff613a56565b6040528351613b0d81613438565b81526020840151613b1d81613438565b6020820152613b2e60408501613a9a565b6040820152613b3f60608501613aac565b60608201526080840151613b5281613438565b608082015260a0939093015192949293505050565b602080825282518282018190525f918401906040840190835b81811015613ba457835163ffffffff16835260209384019390920191600101613b80565b509095945050505050565b5f6001600160401b03821115613bc757613bc7613a56565b5060051b60200190565b5f82601f830112613be0575f80fd5b8151613bf3613bee82613baf565b613a6a565b8082825260208201915060208360051b860101925085831115613c14575f80fd5b602085015b83811015613c3a578051613c2c81613438565b835260209283019201613c19565b5095945050505050565b5f8060408385031215613c55575f80fd5b82516001600160401b03811115613c6a575f80fd5b8301601f81018513613c7a575f80fd5b8051613c88613bee82613baf565b8082825260208201915060208360051b850101925087831115613ca9575f80fd5b6020840193505b82841015613cd95783518060060b8114613cc8575f80fd5b825260209384019390910190613cb0565b6020870151909550925050506001600160401b03811115613cf8575f80fd5b613d0485828601613bd1565b9150509250929050565b600682810b9082900b03667fffffffffffff198112667fffffffffffff82131715610c8f57610c8f6137c3565b5f8160060b8360060b80613d5157613d516138e8565b667fffffffffffff1982145f1982141615613d6e57613d6e6137c3565b90059392505050565b5f60ff821680613d8957613d896137c3565b5f190192915050565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b5f60208284031215613dca575f80fd5b815161123581613438565b805161ffff811681146113b3575f80fd5b5f805f805f805f60e0888a031215613dfc575f80fd5b8751613e0781613438565b9650613e1560208901613aac565b9550613e2360408901613dd5565b9450613e3160608901613dd5565b9350613e3f60808901613dd5565b9250613e4d60a0890161390f565b9150613e5b60c089016136fe565b905092959891949750929550565b5f60ff821660ff8103613e7e57613e7e6137c3565b60010192915050565b62ffffff8281168282160390811115610c8f57610c8f6137c3565b5f60208284031215613eb2575f80fd5b61123582613a9a565b81516001600160a01b0390811682526020808401519091169082015260408083015162ffffff1690820152606080830151610100830191613efe908401826134a5565b506080830151608083015260a083015160a083015260c083015160c083015260e083015161144860e08401826134a5565b6001600160a01b038281168282160390811115610c8f57610c8f6137c356fe2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c46cca423c6ffc06e62a0acc433965e074b11c28479b0449250ce3ff65ac9e39fea264697066735822122049cfea26643004d302a33938eda666a8ad3750eb6cc1a639b7f7aa594ffe715564736f6c634300081a0033