425 txs
2.2k calls
constructor
constructor(address _poolManager)
functions
allowedFeeToTickSpacing
viewfunction allowedFeeToTickSpacing(uint24 fee) view returns (int24 tickSpacing)
EXPIRY_TIME
viewfunction EXPIRY_TIME() view returns (uint256)
GAS_FEE
viewfunction GAS_FEE() view returns (uint256)
getHooksRegistrationBitmap
purefunction getHooksRegistrationBitmap() pure returns (uint16)
getOrderId
viewfunction getOrderId(tuple key, int24 tickLower, bool zeroForOne) view returns (uint232)
getOrderUserInfo
viewfunction getOrderUserInfo(uint232 orderId, address owner) view returns (tuple)
getPendingFillOrderList
viewfunction getPendingFillOrderList(bytes32 poolId) view returns (uint232[])
getTickLowerLast
viewfunction getTickLowerLast(bytes32 poolId) view returns (int24)
isOperator
viewfunction isOperator(address) view returns (bool)
isPoolCreator
viewfunction isPoolCreator(address) view returns (bool)
MAX_EXPIRY_TIME
viewfunction MAX_EXPIRY_TIME() view returns (uint256)
MAX_GAS_FEE
viewfunction MAX_GAS_FEE() view returns (uint256)
MAX_PENDING_ORDER
viewfunction MAX_PENDING_ORDER() view returns (uint256)
MIN_EXPIRY_TIME
viewfunction MIN_EXPIRY_TIME() view returns (uint256)
orderInfos
viewfunction orderInfos(uint232 orderId) view returns (uint8 status, uint128 liquidityTotal, int24 tickLower, bool zeroForOne, uint256 accCurrency0PerLiquidity, uint256 accCurrency1PerLiquidity, bytes32 poolId)
owner
viewfunction owner() view returns (address)
pendingFillOrderLength
viewfunction pendingFillOrderLength(bytes32) view returns (uint256)
pendingOwner
viewfunction pendingOwner() view returns (address)
poolManager
viewfunction poolManager() view returns (address)
PRECISION
viewfunction PRECISION() view returns (uint256)
requirePermissionForPoolCreation
viewfunction requirePermissionForPoolCreation() view returns (bool)
TAKE_GAS_LIMIT_ERC20
viewfunction TAKE_GAS_LIMIT_ERC20() view returns (uint256)
TAKE_GAS_LIMIT_NATIVE
viewfunction TAKE_GAS_LIMIT_NATIVE() view returns (uint256)
vault
viewfunction vault() view returns (address)
acceptOwnership
nonpayablefunction acceptOwnership()
afterAddLiquidity
nonpayablefunction afterAddLiquidity(address sender, tuple key, tuple params, int256 delta, int256 feesAccrued, bytes hookData) returns (bytes4, int256)
afterDonate
nonpayablefunction afterDonate(address sender, tuple key, uint256 amount0, uint256 amount1, bytes hookData) returns (bytes4)
afterInitialize
nonpayablefunction afterInitialize(address sender, tuple key, uint160 sqrtPriceX96, int24 tick) returns (bytes4)
afterRemoveLiquidity
nonpayablefunction afterRemoveLiquidity(address sender, tuple key, tuple params, int256 delta, int256 feesAccrued, bytes hookData) returns (bytes4, int256)
afterSwap
nonpayablefunction afterSwap(address sender, tuple key, tuple params, int256 delta, bytes hookData) returns (bytes4, int128)
batchCancelOrderByOperator
nonpayablefunction batchCancelOrderByOperator(tuple[] params) returns (uint256[] amount0List, uint256[] amount1List)
batchWithdrawByOperator
nonpayablefunction batchWithdrawByOperator(tuple[] params) returns (uint256[] amount0List, uint256[] amount1List)
beforeAddLiquidity
nonpayablefunction beforeAddLiquidity(address sender, tuple key, tuple params, bytes hookData) returns (bytes4)
beforeDonate
nonpayablefunction beforeDonate(address sender, tuple key, uint256 amount0, uint256 amount1, bytes hookData) returns (bytes4)
beforeInitialize
nonpayablefunction beforeInitialize(address sender, tuple key, uint160 sqrtPriceX96) returns (bytes4)
beforeRemoveLiquidity
nonpayablefunction beforeRemoveLiquidity(address sender, tuple key, tuple params, bytes hookData) returns (bytes4)
beforeSwap
nonpayablefunction beforeSwap(address sender, tuple key, tuple params, bytes hookData) returns (bytes4, int256, uint24)
cancelOrder
nonpayablefunction cancelOrder(uint232 orderId, address to) returns (uint256, uint256)
collectGasFee
nonpayablefunction collectGasFee(address to)
lockAcquired
nonpayablefunction lockAcquired(bytes rawData) returns (bytes returnData)
placeOrder
payablefunction placeOrder(tuple key, int24 tick, bool zeroForOne, uint128 liquidity) payable returns (uint256 amount0, uint256 amount1)
renounceOwnership
nonpayablefunction renounceOwnership()
setExpiryTime
nonpayablefunction setExpiryTime(uint256 expiryTime)
setGasFee
nonpayablefunction setGasFee(uint256 gasFee)
setMaxPendingOrder
nonpayablefunction setMaxPendingOrder(uint256 maxPendingOrder)
setOperator
nonpayablefunction setOperator(address operator, bool isOperatorOrNot)
setPoolCreationPermission
nonpayablefunction setPoolCreationPermission(bool requirePermission)
setPoolCreator
nonpayablefunction setPoolCreator(address poolCreator, bool isCreator)
setTakeGasLimitERC20
nonpayablefunction setTakeGasLimitERC20(uint256 gasLimit)
setTakeGasLimitNative
nonpayablefunction setTakeGasLimitNative(uint256 gasLimit)
setTickSpacingOfFee
nonpayablefunction setTickSpacingOfFee(uint24 fee, int24 tickSpacing)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdraw
nonpayablefunction withdraw(uint232 orderId, address to) returns (uint256 amount0, uint256 amount1)
events
Cancel
event Cancel(address indexed caller, address indexed owner, uint232 indexed orderId, uint128 liquidity, uint128 amount0, uint128 amount1)
ExpiryTimeUpdated
event ExpiryTimeUpdated(uint256 expiryTime)
Fill
event Fill(uint232 indexed orderId)
GasFeeCollected
event GasFeeCollected(address indexed to, uint256 totalGasFee)
GasFeeUpdated
event GasFeeUpdated(uint256 gasFeeAmount)
MaxPendingOrderUpdated
event MaxPendingOrderUpdated(uint256 maxPendingOrder)
OperatorUpdated
event OperatorUpdated(address indexed operator, bool isOperatorOrNot)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
Pending
event Pending(uint232 indexed orderId)
Place
event Place(address indexed owner, uint232 indexed orderId, int24 tickLower, bool zeroForOne, uint48 expiry, uint128 liquidity, bytes32 poolId, uint128 amount0, uint128 amount1)
PoolCreationPermissionUpdated
event PoolCreationPermissionUpdated(bool requirePermission)
PoolCreatorUpdated
event PoolCreatorUpdated(address indexed poolCreator, bool isCreator)
TakeGasLimitERC20Updated
event TakeGasLimitERC20Updated(uint256 gasLimit)
TakeGasLimitNativeUpdated
event TakeGasLimitNativeUpdated(uint256 gasLimit)
TickSpacingOfFeeUpdated
event TickSpacingOfFeeUpdated(uint24 indexed fee, int24 indexed tickSpacing)
Withdraw
event Withdraw(address indexed caller, address indexed owner, uint232 indexed orderId, uint128 liquidity, uint128 amount0, uint128 amount1)
errors
CrossedRange
error CrossedRange()
ExceedMaxPendingOrder
error ExceedMaxPendingOrder()
Filled
error Filled()
HookNotImplemented
error HookNotImplemented()
InRange
error InRange()
InvalidCallbackType
error InvalidCallbackType()
InvalidExpiryTime
error InvalidExpiryTime()
InvalidFee
error InvalidFee()
InvalidGasFeeAmount
error InvalidGasFeeAmount()
InvalidLength
error InvalidLength()
InvalidNativeAmount
error InvalidNativeAmount()
InvalidPool
error InvalidPool()
InvalidTickSpacing
error InvalidTickSpacing()
InvalidTickSpacingOfFee
error InvalidTickSpacingOfFee()
LockFailure
error LockFailure()
NoPoolCreationPermission
error NoPoolCreationPermission()
NotFilled
error NotFilled()
NotOperator
error NotOperator()
NotPoolManager
error NotPoolManager()
NotSelf
error NotSelf()
NotVault
error NotVault()
OrderNotExpired
error OrderNotExpired()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
ZeroAddress
error ZeroAddress()
ZeroLiquidity
error ZeroLiquidity()
creation bytecode
0x60c0806040523461023e57602081614fa4803803809161001f8285610255565b83398101031261023e57516001600160a01b0381169081810361023e5760805260405163fbfa77cf60e01b815290602090829060049082905afa90811561024a575f91610204575b5060a05233156101f157600180546001600160a01b03199081169091555f8054339281168317825560405192916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a362093a806002556544364c5bb00060035560326004556146506005556136b0600655600780546001600160f01b031916610101179055614d17908161028d8239608051818181610293015281816103770152818161055301528181610609015281816106a10152818161083c015281816111990152818161137f01528181611cc10152818161288701528181612a0201528181612d16015281816136ef01528181613ebd01526145fd015260a0518181816103d7015281816109700152818161171301528181612dd301528181612e8d01528181612ecf01528181612f710152818161329001528181613413015281816137ee01528181613a6801528181613c72015281816142ab01528181614371015281816146900152818161477301528181614a480152614b610152f35b631e4fbdf760e01b5f525f60045260245ffd5b90506020813d602011610242575b8161021f60209383610255565b8101031261023e57516001600160a01b038116810361023e575f610067565b5f80fd5b3d9150610212565b6040513d5f823e3d90fd5b601f909101601f19168101906001600160401b0382119082101761027857604052565b634e487b7160e01b5f52604160045260245ffdfe60a06040526004361015610011575f80fd5b5f803560e01c8063105ce96314611e8a57806324558ae414611dba57806330fc4cff14611d4157806336d3cdc6146105405780633b488f3d14611c815780634141f72314611c3957806348225991146114745780634b602282146114575780634b6a682d1461136c5780634b9e51f21461143a5780634cb1e341146113c15780635304d44e1461136c578063558a7297146112ee578063598ed81b146112d15780636065a8ec146112af578063678edca3146112445780636d70f7ae146112075780636f6657cb14611142578063715018a6146110df578063763aa9bd1461102757806377beabab14610f9e57806379ba509714610f195780637be7bb2e14610efb5780638d23ba4314610e665780638d83334e14610d975780638da5cb5b14610d705780639173df4f14610d465780639510195614610c18578063956ac27914610bb657806396845094146109d25780639a94775d14610b795780639b9da82414610b4c578063a23c0c3414610b17578063a3e5bcb614610ae0578063a479c5a1146109d7578063aaf5eb68146109d2578063ab6291fe1461093d578063ab8bb55e14610920578063b41f73b0146108d4578063cb25b08d146108b7578063d489536a1461086b578063dc4c90d314610827578063e30c3978146107ff578063e592dc931461064a578063e8246c7f146105f6578063ea487cd1146105a5578063ec37068214610540578063ed8d6c8f14610524578063f2fde38b146104b2578063f961d1f414610406578063fbfa77cf146103c1578063fe70c9c9146103605763fecd215914610261575f80fd5b3461035d5761010036600319011261035d5761027b611f83565b5060c036602319011261035d5761029061205d565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361034e5760ff6007541680610337575b6103285760a43562ffffff8116809103610324578152600e602052604081205460020b62ffffff60c43560101c1660020b036103155760405163fecd215960e01b8152602090f35b6391fa766960e01b8152600490fd5b5080fd5b634743cb8d60e11b8152600490fd5b50328152600d60205260ff604082205416156102cd565b63570c108560e11b8152600490fd5b80fd5b503461035d57600490610372366123df565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330391506103b5905057630a85dc2960e01b8152fd5b63570c108560e11b8152fd5b503461035d578060031936011261035d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104ae575f3660031901126104ae576040516101c081018181106001600160401b0382111761049a575f916101a09160405260018152600160208201528260408201528260608201528260808201528260a0820152600160c0820152600160e082015282610100820152826101208201528261014082015282610160820152826101808201520152602060405160c38152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b346104ae5760203660031901126104ae576104cb611f83565b6104d3613013565b60018060a01b0316806bffffffffffffffffffffffff60a01b600154161760015560018060a01b035f54167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b346104ae575f3660031901126104ae576020604051610e108152f35b346104ae5761054e36611ff0565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506105969250505057630a85dc2960e01b5f5260045ffd5b63570c108560e11b5f5260045ffd5b346104ae5760403660031901126104ae5760406105da6105c3612383565b6105cb611f99565b906105d4613026565b33613b8f565b5f5f80516020614cc28339815191525d82519182526020820152f35b346104ae57610604366123df565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039150610596905057630a85dc2960e01b5f5260045ffd5b346104ae576101603660031901126104ae57610664611f83565b5060c03660231901126104ae5760603660e31901126104ae57610144356001600160401b0381116104ae5761069d903690600401611fc3565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036105965760c06106da36612158565b20805f52600b60205260405f208054908161070d575b606060405163e592dc9360e01b81525f60208201525f6040820152f35b825f52600c60205260405f2054908161074d575b505050805f52600b60205261073860405f2061305b565b5f52600c6020525f60408120558080806106f0565b5f5b83811061075d575b50610721565b61076781836136a4565b60018060e81b0391549060031b1c16805f52600a60205260405f2060ff81541660038110156107eb576001146107ad575b505082156107a85760010161074f565b610757565b906107c4916107be95939536612158565b91614534565b5f1981019081116107d757918580610798565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b346104ae575f3660031901126104ae576001546040516001600160a01b039091168152602090f35b346104ae575f3660031901126104ae576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104ae5760203660031901126104ae577f0c7595452b292cc30c3f9307d0057a434d539ccfe66b5cb83491daf8c29fb02a60206004356108aa613013565b80600455604051908152a1005b346104ae575f3660031901126104ae576020600654604051908152f35b346104ae5760203660031901126104ae577f15d57a95f6aa105369e24d74162599f425645485677669fafa05dd0c4106de5d6020600435610913613013565b80600555604051908152a1005b346104ae575f3660031901126104ae576020600354604051908152f35b346104ae5760203660031901126104ae576004356001600160401b0381116104ae5761096d903690600401611fc3565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036109c3576109bf916109ab9161271e565b6040519182916020835260208301906123bb565b0390f35b6362df054560e01b5f5260045ffd5b612399565b346104ae576109e536611ed6565b906109ee613026565b335f52600f60205260ff60405f20541615610ad1578115610ac257610a1282612455565b90610a1c83612455565b925f5b818110610a48575050505f5f80516020614cc28339815191525d6109bf60405192839283611f5b565b610a53818385612487565b90602082016001600160a01b03610a69826124ab565b1615610ab35760019281610a91610a8b610a85610a97956124ab565b936124bf565b916124ab565b91613b8f565b610aa183896124d3565b52610aac82876124d3565b5201610a1f565b63d92e233d60e01b5f5260045ffd5b63251f56a160e21b5f5260045ffd5b631f0853c160e21b5f5260045ffd5b346104ae5760203660031901126104ae5762ffffff610afd612146565b165f52600e602052602060405f205460020b604051908152f35b346104ae5760403660031901126104ae5760406105da610b35612383565b610b3d611f99565b90610b46613026565b3361308b565b346104ae5760203660031901126104ae576004355f526008602052602060405f205460020b604051908152f35b346104ae5760203660031901126104ae576001600160a01b03610b9a611f83565b165f52600d602052602060ff60405f2054166040519015158152f35b346104ae5760203660031901126104ae576004358015158091036104ae5760207fcec3e1f23a70ae11ade9ff0bcc17aa9f06710902be4506e26fef3cd43388751291610c00613013565b60ff196007541660ff821617600755604051908152a1005b346104ae5760403660031901126104ae57610c31612383565b610c39611f99565b905f60c0604051610c49816120b9565b8281528260208201528260408201528260608201528260808201528260a0820152015260018060e81b03165f52600a602052600460405f20019060018060a01b03165f5260205260e060405f2068ffffffffffffffffff6001600160801b0365ffffffffffff604051610cbb816120b9565b828554918180841697888352602083019460801c855281600182015491600260408601918385168352606087019460801c855201549889978b60c06080890198848c168a528c60a082019c60801c168c52019b60b01c168b526040519c8d52511660208c0152511660408a01525116606088015251166080860152511660a0840152511660c0820152f35b346104ae5760203660031901126104ae576004355f52600c602052602060405f2054604051908152f35b346104ae575f3660031901126104ae575f546040516001600160a01b039091168152602090f35b346104ae5760403660031901126104ae57610db0612146565b6024358060020b918282036104ae5762ffffff90610dcc613013565b16906280000082148015610e5a575b610e4b575f83128015610e40575b610e3157815f52600e60205260405f209062ffffff198254169062ffffff161790557fa7d9049ca81e7359d110d32387a8aa33180fdcaa25339c27c242bd0b9beb08395f80a3005b63013840ad60e51b5f5260045ffd5b50617fff8313610de9565b6358d620b360e01b5f5260045ffd5b50620f42408211610ddb565b346104ae5760203660031901126104ae576001600160e81b03610e87612383565b165f52600a60205260405f2080549060ff82169060018101549060036002820154910154916040519360038110156107eb5760e09560ff9186526001600160801b038160081c1660208701528060881c60020b604087015260a01c1615156060850152608084015260a083015260c0820152f35b346104ae575f3660031901126104ae5760206040516301e133808152f35b346104ae575f3660031901126104ae57600154336001600160a01b0390911603610f8b57600180546001600160a01b03199081169091555f805433928116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b63118cdaa760e01b5f523360045260245ffd5b346104ae5760403660031901126104ae57610fb7611f83565b610fbf61231c565b90610fc8613013565b6001600160a01b0316908115610ab35760207f7b4248bdfda01da18ff3fd013a411092cdc2cfec3380127110afebb392685ca291835f52600d825261101c8160405f209060ff801983541691151516179055565b6040519015158152a2005b346104ae5760203660031901126104ae576004355f52600b60205260405f20604051806020835491828152019081935f5260205f20905f5b8181106110c05750505081611075910382612125565b604051918291602083019060208452518091526040830191905f5b81811061109e575050500390f35b82516001600160e81b0316845285945060209384019390920191600101611090565b82546001600160e81b031684526020909301926001928301920161105f565b346104ae575f3660031901126104ae576110f7613013565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346104ae576101803660031901126104ae5761115c611f83565b5060c03660231901126104ae5760603660e31901126104ae57610164356001600160401b0381116104ae57611195903690600401611fc3565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610596576111cf613026565b60406111dd610144356136b9565b5f5f80516020614cc28339815191525d82516001600160e01b03199092168252600f0b6020820152f35b346104ae5760203660031901126104ae576001600160a01b03611228611f83565b165f52600f602052602060ff60405f2054166040519015158152f35b346104ae5760203660031901126104ae57600435611260613013565b670de0b6b3a764000081116112a0576020817f902352d147b3be1f5ea44e05f50189ab64f06aa375bdb9eaecb7210cf1cf292a92600355604051908152a1005b637cdc660160e01b5f5260045ffd5b346104ae575f3660031901126104ae57602060ff600754166040519015158152f35b346104ae575f3660031901126104ae576020600554604051908152f35b346104ae5760403660031901126104ae57611307611f83565b61130f61231c565b90611318613013565b6001600160a01b0316908115610ab35760207f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d91835f52600f825261101c8160405f209060ff801983541691151516179055565b346104ae5761137a3661232b565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303925061059691505057630a85dc2960e01b5f5260045ffd5b346104ae5760203660031901126104ae576113da611f83565b6113e2613013565b4790811561142b57602081611418847fc05ff61d06cec62a47049cabb006ed28db21af9ffe56c097c0387b10e3637211946134ca565b6040519384526001600160a01b031692a2005b63113a2f4b60e21b5f5260045ffd5b346104ae575f3660031901126104ae576020600454604051908152f35b346104ae575f3660031901126104ae576020600254604051908152f35b366003190161012081126104ae5760c0136104ae57611491612073565b61149961230d565b90610104356001600160801b038116928382036104ae576114b8613026565b6044356001600160a01b038116908190036104ae573003611c2b578315611c1c576114ec81846114e7366121ed565b61255a565b6001600160e81b03811680611c0b57505060075460081c6001600160e81b0316611515366121ed565b60405161153a8161152c8689602084019687612535565b03601f198101835282612125565b5190205f90815260096020908152604080832080546001600160e81b0319168517905560078054610100600160f01b03198116600891821c6001600160e81b031660010190911b610100600160f01b0316179055838352600a90915290209060c06115a4366121ed565b206003830155815463ffffffff60881b1916608886901b62ffffff60881b161783151560a01b60ff60a01b161782555b60ff82541660038110156107eb57611bfc57335f9081526004830160205260409081902090519096909261160784612083565b611610366121ed565b9687855260208501903382526040860194600160e81b6001900316968786526060870190151595868252608088019260020b9788845260a001938685526040519b60208d0161165e916124e7565b516001600160a01b031660e08c0152516001600160e81b03166101008b01525115156101208a01525160020b610140890152516001600160801b03166101608089019190915287526116b261018088612125565b604051966116bf8861209e565b5f88526020880152604051809760208201906116da91612591565b03601f19810188526116ec9088612125565b604051638154831960e01b8152602060048201529687906117119060248301906123bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691899103815a5f948591f1968715611bf1575f97611bcd575b506080878051810103126104ae5761176e6020880161263b565b95876001600160801b038061179d6080611796606061178f6040880161263b565b960161263b565b9c0161263b565b92169816985f9160043560018060a01b038116908181036104ae575015611bc5575b82341061142b57828c933411611aa6575b50611841846001600160801b0360029561182d611827611871998b988580998b6118a99f8380915460081c1694168481151580611a9d575b611a7a575b505050168181151580611a71575b611a51575b5050612669565b87612689565b8054828116806119bb575b50505416612669565b166001600160801b03198c5416178b556118966118766118718d6001600160801b036001860154915416906135ab565b613626565b8c546001600160801b031660809190911b6001600160801b031916178c55565b01546001600160801b038a5416906135ab565b6001600160801b036001890191166001600160801b03198254161790556118d26002544261265c565b9665ffffffffffff88116119a357600201805465ffffffffffff60801b1916608089901b65ffffffffffff60801b161790556040966001600160801b03929183919060c061191f366121ed565b209065ffffffffffff6119318b613626565b9361193b8b613626565b968d51998a5260208a0152168b880152606087015260808601521660a08401521660c08201527fade0e903bfd8162add97536a826aabfdca445ebfaf2c18ad2edd3b8afc31aae560e03392a35f5f80516020614cc28339815191525d82519182526020820152f35b876306dfcc6560e41b5f52603060045260245260445ffd5b611a30916119d36118716119dd9360018c01546135ab565b9060801c906126ab565b611a126119f26001850192835460801c612669565b82546001600160801b031660809190911b6001600160801b031916178255565b83611a276118718b8b015483875416906135ab565b915416906126ab565b82611a418984019282845416612669565b1683198254161790555f80611838565b611a5a91613514565b611a688c8c0191825461265c565b90555f81611820565b5080151561181b565b611a89600191611a9393613514565b920191825461265c565b90558b5f8461180d565b50801515611808565b611ab0903461264f565b60028401805468ffffffffffffffffff8160b01c161580611bb9575b611b1f575b5050846001600160801b0360029561182d611827611871996118a99b98858099896118419a611b0f575b50995050989b5050505095505094506117d0565b611b1990336134ca565b5f611afb565b90919293945060035468ffffffffffffffffff8111611ba2578e61182d611827896002996001600160801b036118a99d9a611b8f829b6118719f9a9b6118419c859b68ffffffffffffffffff60b01b9060b01b169068ffffffffffffffffff60b01b19161790556003549061264f565b9950995050989b50995050509550611ad1565b6306dfcc6560e41b5f52604860045260245260445ffd5b50600354831015611acc565b8a92506117bf565b611bea9197503d805f833e611be28183612125565b8101906125d9565b9588611754565b6040513d5f823e3d90fd5b63413e917360e11b5f5260045ffd5b5f52600a60205260405f20906115d4565b630200e8a960e31b5f5260045ffd5b62820f3560e61b5f5260045ffd5b346104ae576101003660031901126104ae576020611c6f611c59366121ed565b611c61612073565b611c6961230d565b9161255a565b6040516001600160e81b039091168152f35b346104ae576101203660031901126104ae57611c9b611f83565b5060c03660231901126104ae57611cb061205d565b50610104358060020b81036104ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361059657611d079062ffffff60c43560101c1660020b906144b5565b60c0611d1236612158565b205f52600860205260405f209062ffffff198254169062ffffff161790556020604051633b488f3d60e01b8152f35b346104ae5760203660031901126104ae57600435611d5d613013565b610e1081108015611dad575b611d9e576020817f2ab04bd6d1acb1305e97a76181bb26706177a2ad5eb7b48e902288f37457c06392600255604051908152a1005b6398e71feb60e01b5f5260045ffd5b506301e133808111611d69565b346104ae57611dc836611ed6565b90611dd1613026565b335f52600f60205260ff60405f20541615610ad1578115610ac257611df582612455565b90611dff83612455565b925f5b818110611e2b575050505f5f80516020614cc28339815191525d6109bf60405192839283611f5b565b611e36818385612487565b90602082016001600160a01b03611e4c826124ab565b1615610ab35760019281611e68610a8b610a85611e6e956124ab565b9161308b565b611e7883896124d3565b52611e8382876124d3565b5201611e02565b346104ae5760203660031901126104ae577f91f6367d35c59513f209ef004e967fd36b44f3e3bb8b333c4706bf03d3ad57f86020600435611ec9613013565b80600655604051908152a1005b9060206003198301126104ae576004356001600160401b0381116104ae57826023820112156104ae578060040135926001600160401b0384116104ae5760248460061b830101116104ae576024019190565b90602080835192838152019201905f5b818110611f455750505090565b8251845260209384019390920191600101611f38565b9091611f72611f8093604084526040840190611f28565b916020818403910152611f28565b90565b600435906001600160a01b03821682036104ae57565b602435906001600160a01b03821682036104ae57565b35906001600160a01b03821682036104ae57565b9181601f840112156104ae578235916001600160401b0383116104ae57602083818601950101116104ae57565b906101c06003198301126104ae576004356001600160a01b03811681036104ae579160c06023198201126104ae57602491608060e3198301126104ae5760e491610164359161018435916101a435906001600160401b0382116104ae5761205991600401611fc3565b9091565b60e435906001600160a01b03821682036104ae57565b60c435908160020b82036104ae57565b60c081019081106001600160401b0382111761049a57604052565b604081019081106001600160401b0382111761049a57604052565b60e081019081106001600160401b0382111761049a57604052565b608081019081106001600160401b0382111761049a57604052565b60a081019081106001600160401b0382111761049a57604052565b602081019081106001600160401b0382111761049a57604052565b90601f801991011681019081106001600160401b0382111761049a57604052565b6004359062ffffff821682036104ae57565b60c09060231901126104ae576040519061217182612083565b816024356001600160a01b03811681036104ae5781526044356001600160a01b03811681036104ae5760208201526064356001600160a01b03811681036104ae5760408201526084356001600160a01b03811681036104ae57606082015260a43562ffffff811681036104ae57608082015260a060c435910152565b60c09060031901126104ae576040519061220682612083565b816004356001600160a01b03811681036104ae5781526024356001600160a01b03811681036104ae5760208201526044356001600160a01b03811681036104ae5760408201526064356001600160a01b03811681036104ae57606082015260843562ffffff811681036104ae57608082015260a060a435910152565b91908260c09103126104ae5760405161229a81612083565b80926122a581611faf565b82526122b360208201611faf565b602083015260408101356001600160a01b03811681036104ae57604083015260608101356001600160a01b03811681036104ae576060830152608081013562ffffff811681036104ae57608083015260a090810135910152565b60e4359081151582036104ae57565b6024359081151582036104ae57565b6101406003198201126104ae576004356001600160a01b03811681036104ae579160c06023198301126104ae5760249160e43591610104359161012435906001600160401b0382116104ae5761205991600401611fc3565b600435906001600160e81b03821682036104ae57565b346104ae575f3660031901126104ae576020604051670de0b6b3a76400008152f35b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b906101806003198301126104ae576004356001600160a01b03811681036104ae579160c06023198201126104ae57602491608060e3198301126104ae5760e49161016435906001600160401b0382116104ae5761205991600401611fc3565b6001600160401b03811161049a5760051b60200190565b9061245f8261243e565b61246c6040519182612125565b828152809261247d601f199161243e565b0190602036910137565b91908110156124975760061b0190565b634e487b7160e01b5f52603260045260245ffd5b356001600160a01b03811681036104ae5790565b356001600160e81b03811681036104ae5790565b80518210156124975760209160051b010190565b80516001600160a01b0390811683526020808301518216908401526040808301518216908401526060808301519091169083015260808082015162ffffff169083015260a090810151910152565b919260e091949361254b846101008101976124e7565b60020b60c08401521515910152565b91906125749061152c604051938492602084019687612535565b5190205f908152600960205260409020546001600160e81b031690565b6020815281519160048310156107eb576020606091611f80948285015201519160408082015201906123bb565b6001600160401b03811161049a57601f01601f191660200190565b6020818303126104ae578051906001600160401b0382116104ae570181601f820112156104ae5780519061260c826125be565b9261261a6040519485612125565b828452602083830101116104ae57815f9260208093018386015e8301015290565b51906001600160801b03821682036104ae57565b919082039182116107d757565b919082018092116107d757565b906001600160801b03809116911601906001600160801b0382116107d757565b90610100600160881b0382549160081b1690610100600160881b031916179055565b906001600160801b03809116911603906001600160801b0382116107d757565b51906001600160a01b03821682036104ae57565b519062ffffff821682036104ae57565b51906001600160e81b03821682036104ae57565b519081151582036104ae57565b51908160020b82036104ae57565b919082015f926020818303126104ae578035906001600160401b0382116104ae57016040818303126104ae57604051906127578261209e565b803560048110156104ae5782526020810135906001600160401b0382116104ae570182601f820112156104ae57803590612790826125be565b9361279e6040519586612125565b828552602083830101116104ae57815f926020809301838701378401015260208101918252805160048110156107eb5715612b8a5780516004811015612ad857600114612aec5780516004811015612ad8576002146129815751600481101561296d576003146128175763038a1ff760e11b8352600483fd5b516020818051810103126129695761283d6020604051926128378461210a565b016126ef565b908190526001600160e81b0316808352600a60205260408320909290612861613dcf565b6003820154604051630716a42560e11b815260048101919091529490919060c0866024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa95861561295e5784959661290795918791889189918a918b9161291b575b5060a089015262ffffff1660808801526001600160a01b03908116606088015290811660408701529081166020860152168352614534565b60405190612916602083612125565b815290565b935050505062ffffff9250612948915060c03d60c011612957575b6129408183612125565b810190613dff565b909294959193949392916128cf565b503d612936565b6040513d86823e3d90fd5b8280fd5b634e487b7160e01b84526021600452602484fd5b509190915160a0818051810103126103245760405161299f816120ef565b60208201518082526040830151916020810192835260608401516040820190815260806129e060a06129d28389016126cb565b976060860198895201612703565b9201918252604051630716a42560e11b8152600481019390935260c0836024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa938415612acd5786938795612aa2575b505190519281612a83575b505081612a62575b5050505060405190612916602083612125565b612a7a9360018060a01b039051169051151592614b5d565b5f808080612a4f565b612a9b9160018060a01b038751168451151592614a46565b5f80612a47565b909450612abf91935060c03d60c011612957576129408183612125565b50505050929092935f612a3c565b6040513d88823e3d90fd5b634e487b7160e01b85526021600452602485fd5b50919091519060808280518101031261035d57612b5d61152c92611f809250612b53608060405192612b1d846120d4565b612b29602082016126ef565b8452612b3760408201612703565b6020850152612b48606082016126cb565b6040850152016126cb565b6060820152613e60565b604080516001600160801b0394851660208201529284169083015290911660608201529182906080820190565b509190915180805181010361016081126104ae5760c060405191612bad83612083565b126104ae5760405190612bbf82612083565b612bcb602084016126cb565b8252612bd9604084016126cb565b9360208301948552612bed606085016126cb565b6040840152612bfe608085016126cb565b6060840152612c0f60a085016126df565b608084015260c08401519260a08101938452808352612c3060e086016126cb565b9160208401928352612c4561010087016126ef565b9460408501958652612c5a6101208801612703565b906060860191825260a0612c84610160612c776101408c01612710565b9a8b60808b01520161263b565b9601958652612d1160405f925f985f9a6001600160801b03612cb762ffffff5f9f60020b955160101c1660020b85613686565b9251169060018060e81b0390511691845193612cd2856120d4565b845260020b6020840152838301526060820152815190612cf3602083612125565b5f82528251639371d11560e01b815293849283928a60048501613d59565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115611bf1575f905f92612fe1575b508160801d5f81600f0b13612f54575b508482600f0b13612eb7575b90612d7691614843565b908160801d998a600f0b8581125f14612e4257505050600f0b612e33575115612e2457505190516001600160a01b03908116956001600160801b0395948694909385939192612df89290911690612dcc90613666565b84169889917f000000000000000000000000000000000000000000000000000000000000000090614877565b816040519716602088015216604086015216606084015216608082015260808152611f8060a082612125565b63b319920d60e01b8152600490fd5b6323ac68e760e01b8252600482fd5b92975094509850612e335751612e2457505190516001600160801b0394938593909284926001600160a01b0390811692612eb29290911690612e8690600f0b613666565b84169283917f000000000000000000000000000000000000000000000000000000000000000090614877565b612df8565b8a516001600160801b0383169a506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116813b15612f50578b612f1e92889283604051809681958294636361ddf360e11b84523060048501613da5565b03925af18015612acd57908691612f37575b5050612d6c565b81612f4191612125565b612f4c57845f612f30565b8480fd5b8680fd5b86516001600160801b0390911699506001600160a01b03908116907f000000000000000000000000000000000000000000000000000000000000000016803b156104ae578a5f91612fbd9383604051809681958294636361ddf360e11b84523060048501613da5565b03925af18015611bf15715612d6057612fd99195505f90612125565b5f935f612d60565b9050613005915060403d60401161300c575b612ffd8183612125565b810190613d43565b905f612d50565b503d612ff3565b5f546001600160a01b03163303610f8b57565b5f80516020614cc28339815191525c61304c5760015f80516020614cc28339815191525d565b633ee5aeb560e01b5f5260045ffd5b8054905f81558161306a575050565b5f5260205f20908101905b818110613080575050565b5f8155600101613075565b926001600160a01b0390921691908215610ab3576001600160e81b03165f818152600a60205260409020805490949060ff1660038110156107eb57600114613377575b8454336001600160a01b03929092169182149460ff821660038110156107eb57600203613368576004870195835f528660205260405f20976001600160801b0389541693841561334457849060081c6001600160801b031690613130916126ab565b61313a9082612689565b8360018201549061314a916135ab565b895460801c6131589161264f565b84600283015490613168916135ab565b9060018b0154916001600160801b0383166131829161264f565b9160801c61318f9161265c565b99600201546001600160801b03166131a69161265c565b97855f5260205260405f205f8155600181015f90556002015f905560030154916040516131d2816120ef565b838152602081018a815260408201918a835260608101938452608001938452604051946020860152516040850152516060840152600160a01b60019003905116608083015251151560a082015260a0815261322e60c082612125565b6040519061323b8261209e565b6002825260208201526040518091602082019061325791612591565b03601f19810182526132699082612125565b604051638154831960e01b81526020600482015290819061328e9060248301906123bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691839103815a5f948591f18015611bf15761332c575b507f594eb7202c116d6e3caffbaafc89a5a1f416a21c4e6b4b7b438b7594fd3ec7d16132f987613626565b61330287613626565b604080516001600160801b03958616815292851660208401529316928101929092523391606090a4565b61333f903d805f833e611be28183612125565b6132ce565b505095505050505091501561336257630200e8a960e31b5f5260045ffd5b5f905f90565b6306cb6fbf60e41b5f5260045ffd5b6003850180545f52600c60205260405f208054905f1982019182116107d75755826040516133a48161210a565b5261340e5f61152c6133ec604051876020820152602081526133c7604082612125565b604051906133d48261209e565b60038252602082015260405192839160208301612591565b60405180938192638154831960e01b83526020600484015260248301906123bb565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611bf15761347c575b5054805f52600c60205260405f205415613463575b506130ce565b5f52600b60205261347660405f2061305b565b5f61345d565b61348f903d805f833e611be28183612125565b613448565b91906134ae9061152c604051938492602084019687612535565b5190205f52600960205260405f2062ffffff60e81b8154169055565b5f80809381935af1156134d957565b60405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b6044820152606490fd5b90670de0b6b3a76400008202905f19670de0b6b3a76400008409928280851094039380850394858411156104ae57146135a457670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b808202905f1983820990828083109203918083039283670de0b6b3a764000011156104ae5714613615577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000910990828211900360ee1b910360121c170290565b5050670de0b6b3a764000091500490565b6001600160801b038111613640576001600160801b031690565b6306dfcc6560e41b5f52608060045260245260445ffd5b908160209103126104ae575190565b600f0b6f7fffffffffffffffffffffffffffffff1981146107d7575f0390565b9060020b9060020b0190627fffff198212627fffff8313176107d757565b8054821015612497575f5260205f2001905f90565b62ffffff60c43560101c1660020b9060c06136d5366024612282565b20604051633205590760e21b8152600481018290529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690608081602481855afa8015611bf15785905f90613b23575b61373a92506144b5565b92805f52600860205260405f205460020b918460020b868482125f14613b0957613765915086613686565b92945b839560020b809460020b13613af457825f52600860205260405f209062ffffff198254169062ffffff1617905560e43590811594851583036104ae578215613a2457602435916001600160a01b03831683036104ae5760405163019161b160e51b81526001600160a01b03918216600482015292166024830152602082806044810103817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215611bf1575f926139ee575b5061383b6001600160801b039160801d613666565b161115905b50156138ce5750915b828160020b131561386657505050505b636f6657cb60e01b905f90565b838161387b84613893946114e7366024612282565b6001600160e81b0381169081613898575b5050613686565b613849565b6138c7916138b187856138ac366024612282565b613494565b5f52600a60205260405f206107be366024612282565b5f8061388c565b929390835f52600b60205260405f20925f955b828160020b13156139025750505050505f52600c60205260405f2055613859565b61391282826114e7366024612282565b6001600160e81b031680613931575b508361392c91613686565b6138e1565b90965f1981146107d7576001019660045488116139df578554906801000000000000000082101561049a5761392c926139718360018995018a55896136a4565b81546001600160e81b0360039290921b91821b19169083901b17905561399d85836138ac366024612282565b805f52600a60205260405f20600160ff198254161790557f0478b161a63aad0f6e9ef60a8ffded419a9f5de42d08fd55e61431e719b6a09a5f80a29150613921565b630b5bed4560e41b5f5260045ffd5b9091506020813d602011613a1c575b81613a0a60209383612125565b810103126104ae57519061383b613826565b3d91506139fd565b604435916001600160a01b03831683036104ae5760405163019161b160e51b81526001600160a01b03918216600482015292166024830152602082806044810103817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215611bf1575f92613abe575b50613ab56001600160801b0391600f0b613666565b16111590613840565b9091506020813d602011613aec575b81613ada60209383612125565b810103126104ae575190613ab5613aa0565b3d9150613acd565b50636f6657cb60e01b965f9650945050505050565b9003627fffff198112627fffff8213176107d75794613768565b50506080813d608011613b87575b81613b3e60809383612125565b810103126104ae5780516001600160a01b038116036104ae578481613b816060613b6d602061373a9601612710565b92613b7a604082016126df565b50016126df565b50613730565b3d9150613b31565b909290916001600160a01b03168015610ab3575f61152c613c4b613c6d9560018060a01b03169660405190613bc3826120d4565b60018060e81b0316948582526020820191338a148352606060408201918b83520191825260405192876020850152511515604084015260018060a01b03905116606083015260018060a01b03905116608082015260808152613c2660a082612125565b60405190613c338261209e565b60018252602082015260405192839160208301612591565b60405180958192638154831960e01b83526020600484015260248301906123bb565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1928315611bf1575f93613d27575b506060838051810103126104ae57613cc46020840161263b565b936001600160801b0380613ce66060613cdf6040890161263b565b970161263b565b169416946001600160801b038116613cfd57505050565b7f365bc9c83280b5a5575d11d31a6c6463acf78f777972f54abe585ebd1cb983aa6132f987613626565b613d3c9193503d805f833e611be28183612125565b915f613caa565b91908260409103126104ae576020825192015190565b6060611f809493613d6d83610160956124e7565b805160020b60c0840152602081015160020b60e0840152604081015161010084015201516101208201528161014082015201906123bb565b6001600160a01b039182168152911660208201526001600160801b03909116604082015260600190565b60405190613ddc82612083565b5f60a0838281528260208201528260408201528260608201528260808201520152565b91908260c09103126104ae57613e14826126cb565b91613e21602082016126cb565b91613e2e604083016126cb565b91613e3b606082016126cb565b9160a0613e4a608084016126df565b92015190565b600160ff1b81146107d7575f0390565b80515f9060018060e81b031692835f52600a60205260405f20916020840151159383549160ff831660038110156107eb5761449c57613e9d613dcf565b6003860154604051630716a42560e11b81526004810191909152909390917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660c084602481845afa938415611bf15789945f915f915f915f915f915f91614469575b5060a08c01608081815291905262ffffff909116908b01526001600160a01b0390811660608b01529081166040808b01919091529181166020808b0191909152928116895287820151165f81815260048c0193849052919091209a9099919290614443575b6001600160801b038b54169b8c1561441b578c61400d9392604092613fb86001600160801b03613fb162ffffff6080515160101c1660020b8c60881c60020b613686565b9416613e50565b845193613fc4856120d4565b8a60881c60020b855260020b6020850152848401526060830152825191613fec602084612125565b5f83525f8c855197889586948593639371d11560e01b855260048501613d59565b03925af1908115611bf15788958c938e935f915f916143fa575b508160801d5f81600f0b13614362575b508782600f0b1361428f575b6001600160801b038360081c166001600160801b038616145f146141ee57506140fe94936140ec60016140df6118716001600160801b039761409a6002986140f5989f60ff845460a01c169160881c8b0b90613494565b6140b36140ad878b845460081c166126ab565b82612689565b87896140d56140ca611871838b16898701546135ab565b8d5460801c906126ab565b97169101546135ab565b96015495858716906126ab565b9460801c612669565b9c015416612669565b9760018060a01b03165f526020525f60026040822082815582600182015501558160801d8181600f0b136141d2575b5081600f0b136141b6575b506001600160801b0386168061418e575b506001600160801b0385169081614161575b50505050565b6020909301516060909201516141859315926001600160a01b039182169116614b5d565b5f80808061415b565b835160608401516141b09284159290916001600160a01b039081169116614a46565b5f614149565b946141cb91956001600160801b031690612669565b935f614138565b976141e791986001600160801b031690612669565b965f61412d565b9750600291506140fe94936140ec60016140df6118716001600160801b039761421a8e6140f598614843565b9d8d8160801d9081600f0b13614266575b508d81600f0b1361423d575b5061409a565b614250908a80845460081c169116613514565b61425e89830191825461265c565b90555f614237565b614279908b80855460081c169116613514565b61428786840191825461265c565b90555f61422b565b60208c0151979850959692959194509250906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116813b1561435e5761430488928392604051948580948193636361ddf360e11b83528a6001600160801b0316903060048501613da5565b03925af1801561435357928a979695928f94928f9693614325575b50614043565b8899508893965061433c9295509790939697612125565b61434f57928b928d928a9796955f61431f565b8580fd5b6040513d89823e3d90fd5b8780fd5b8c519199506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811697509295509116853b156104ae576143ce955f9283604051809981958294636361ddf360e11b84526001600160801b0316903060048501613da5565b03925af1928315611bf1578a978f94958f9615614037576143f29198505f90612125565b5f965f614037565b9050614415915060403d60401161300c57612ffd8183612125565b5f614027565b5050505050509450505092505061443b57630200e8a960e31b5f5260045ffd5b5f905f905f90565b65ffffffffffff60028c015460801c16421015613f6d5763796c85f360e01b5f5260045ffd5b935050505062ffffff925061448d915060c03d60c011612957576129408183612125565b90929495919394939291613f08565b50505092505061443b5763413e917360e11b5f5260045ffd5b60020b9060020b90811561452057627fffff1981145f198314166107d75781810590825f82129182614511575b50506144fb575b60020b028060020b9081036107d75790565b60020b627fffff1981146107d7575f19016144e9565b0760020b15159050825f6144e2565b634e487b7160e01b5f52601260045260245ffd5b6001600160e81b0316915f91908361454c5750505050565b815460ff811660038110156107eb5760021461483c576145f89060881c60020b91600260ff1985541617845560406001600160801b03855460081c16936145a262ffffff60a085015160101c1660020b82613686565b6145ab86613e50565b908351926145b8846120d4565b835260020b6020830152828201528760608201528151906145da602083612125565b5f82528251639371d11560e01b815294859283928660048501613d59565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215611bf1575f9261481a575b508160801d5f81600f0b13614763575b508482600f0b13614682575b50505050807fd98538eb2bb9428ee547445fc099e4e07dba0662746617118320882d0189482c91a25f80808061415b565b602001516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116813b1561434f576146e986928392604051948580948193636361ddf360e11b8352896001600160801b0316903060048501613da5565b03925af180156147585761473f575b506002611a897fd98538eb2bb9428ee547445fc099e4e07dba0662746617118320882d0189482c9594936001600160801b036147349416613514565b9055905f8080614651565b61474a858092612125565b614754575f6146f8565b8380fd5b6040513d87823e3d90fd5b81516001600160a01b03908116907f000000000000000000000000000000000000000000000000000000000000000016803b156104ae57604051636361ddf360e11b8152915f9183918290849082906147cb906001600160801b038a16903060048501613da5565b03925af18015611bf157614805575b50836001600160801b036147ee9216613514565b6147fd6001860191825461265c565b90555f614645565b6148129196505f90612125565b5f94836147da565b61483491925060403d60401161300c57612ffd8183612125565b50905f614635565b5050505050565b614866906148588360801d8260801d03614c4e565b92600f0b90600f0b03614c4e565b6001600160801b03169060801b1790565b831561415b576001600160a01b0316918261493c57506001600160a01b0316803b156104ae5760405191632961046560e21b835260048301525a915f8160248183868198f18015611bf157614926575b50602090600460405180958193630476982d60e21b83525af190811561491a57506148ef5750565b6149109060203d602011614913575b6149088183612125565b810190613657565b50565b503d6148fe565b604051903d90823e3d90fd5b6149339192505f90612125565b5f9060206148c7565b91926001600160a01b0390911690813b156104ae57604051632961046560e21b815260048101859052925a935f816024818388819af18015611bf157614a2b575b509293849360209392916001600160a01b03909116903082146149f6576149d292604051926323b872dd60e01b8785015260248401528460448401526064830152606482526149cd608483612125565b614c69565b600460405180958193630476982d60e21b83525af190811561491a57506148ef5750565b614a269291506040519163a9059cbb60e01b868401528460248401526044830152604482526149cd606483612125565b6149d2565b602093929194505f614a3c91612125565b5f9390919261497d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156104ae57604051633dae446f60e21b81523060048201526001600160a01b0383166024820152604481018590525f9590868160648183875af18015611bf157614b48575b505a9015614b2d575b813b1561434f57604051630b0d9c0960e01b81526001600160a01b0393841660048201529290931660248301526044820193909352918391839160649183918591f18015614b2257614b10575050565b614b1b828092612125565b61035d5750565b6040513d84823e3d90fd5b506005546001600160a01b038316614ac05750600654614ac0565b614b559196505f90612125565b5f945f614ab7565b5f937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156104ae57604051633dae446f60e21b81523060048201526001600160a01b0384166024820152604481018690525f8160648183875af18015611bf157614c39575b505a9015614c2657813b1561434f57604051630b0d9c0960e01b81526001600160a01b0393841660048201529290931660248301526044820193909352918391839160649183918591f18015614b2257614b10575050565b506005548515614ac05750600654614ac0565b614c469196505f90612125565b5f945f614bce565b9081600f0b918203614c5c57565b6393dafdf15f526004601cfd5b905f602091828151910182855af115611bf1575f513d614cb857506001600160a01b0381163b155b614c985750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614c9156fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220903e6a7fa777b670afb26f2c43a6baaa2f6bb3a91db8dede725c0aacf39c47ed64736f6c634300081a0033000000000000000000000000a0ffb9c1ce1fe56963b0321b32e7a0302114058b