8 txs
13 calls
constructor
constructor(address _poolManager, address _positionManager, address _lpFeeReceiver, address _collectFeeReceiver, address _autoCollectAccount)
functions
AUTO_COLLECT_ACCOUNT
viewfunction AUTO_COLLECT_ACCOUNT() view returns (address)
balanceOf
viewfunction balanceOf(address owner) view returns (uint256)
baseExtension
viewfunction baseExtension() view returns (string)
baseURI
viewfunction baseURI() view returns (string)
blacklistedHooks
viewfunction blacklistedHooks(address) view returns (bool)
collectFee
viewfunction collectFee() view returns (uint256)
ETERNAL_LOCK
viewfunction ETERNAL_LOCK() view returns (uint256)
FEE_ADDR_COLLECT
viewfunction FEE_ADDR_COLLECT() view returns (address)
FEE_ADDR_LP
viewfunction FEE_ADDR_LP() view returns (address)
FEE_DENOMINATOR
viewfunction FEE_DENOMINATOR() view returns (uint256)
flatFee
viewfunction flatFee() view returns (uint256)
getApproved
viewfunction getApproved(uint256 tokenId) view returns (address)
getLockInfo
viewfunction getLockInfo(uint256 lockId) view returns (tuple)
getUserLockAt
viewfunction getUserLockAt(address user, uint256 index) view returns (uint256)
getUserLockCount
viewfunction getUserLockCount(address user) view returns (uint256)
isApprovedForAll
viewfunction isApprovedForAll(address owner, address operator) view returns (bool)
isLocked
viewfunction isLocked(uint256 lockId) view returns (bool)
locks
viewfunction locks(uint256) view returns (uint256 lockId, address owner, uint256 tokenId, tuple poolKey, uint256 amount, uint256 unlockTime, address collectAddress, bool isNFTized, uint256 ucf)
lpFee
viewfunction lpFee() view returns (uint256)
MIGRATOR
viewfunction MIGRATOR() view returns (address)
name
viewfunction name() view returns (string)
NATIVE_ETH
viewfunction NATIVE_ETH() view returns (address)
onERC721Received
purefunction onERC721Received(address, address, uint256, bytes) pure returns (bytes4)
owner
viewfunction owner() view returns (address)
ownerOf
viewfunction ownerOf(uint256 tokenId) view returns (address)
permissionMode
viewfunction permissionMode() view returns (uint8)
poolManager
viewfunction poolManager() view returns (address)
positionManager
viewfunction positionManager() view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
tokenURI
viewfunction tokenURI(uint256 tokenId) view returns (string)
verifyNFTOwnership
viewfunction verifyNFTOwnership(uint256 tokenId, address expectedOwner) view
whitelistedForFreeLock
viewfunction whitelistedForFreeLock(address) view returns (bool)
whitelistedHooks
viewfunction whitelistedHooks(address) view returns (bool)
adminRescueETH
nonpayablefunction adminRescueETH(uint256 amount, address receiver)
adminRescueTokens
nonpayablefunction adminRescueTokens(address token, address receiver, uint256 amount)
approve
nonpayablefunction approve(address to, uint256 tokenId)
collect
nonpayablefunction collect(uint256 lockId, address recipient) returns (uint256 amount0, uint256 amount1, uint256 fee0, uint256 fee1)
decreaseLiquidity
nonpayablefunction decreaseLiquidity(uint256 lockId, uint128 liquidityDecrease, uint256 amount0Min, uint256 amount1Min) returns (uint256 amount0, uint256 amount1)
lockFromMigration
nonpayablefunction lockFromMigration(uint256 oldLockId, address oldLocker) returns (uint256 lockId)
lockNFTPosition
payablefunction lockNFTPosition(uint256 tokenId, uint256 unlockTime, bool mintLockNFT) payable returns (uint256 lockId)
migrate
payablefunction migrate(uint256 lockId) payable
relock
nonpayablefunction relock(uint256 lockId, uint256 newUnlockTime)
renounceOwnership
nonpayablefunction renounceOwnership()
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId, bytes data)
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId)
setApprovalForAll
nonpayablefunction setApprovalForAll(address operator, bool approved)
setBaseExtension
nonpayablefunction setBaseExtension(string _newBaseExtension)
setBaseURI
nonpayablefunction setBaseURI(string _newBaseURI)
setCollectAddress
nonpayablefunction setCollectAddress(uint256 lockId, address newCollectAddress)
setFeeAddresses
nonpayablefunction setFeeAddresses(address _lpFeeReceiver, address _collectFeeReceiver, address _autoCollectAccount)
setFees
nonpayablefunction setFees(uint256 _lpFee, uint256 _collectFee)
setFlatFee
nonpayablefunction setFlatFee(uint256 _flatFee)
setHookBlacklist
nonpayablefunction setHookBlacklist(address hook, bool blacklisted)
setHookWhitelist
nonpayablefunction setHookWhitelist(address hookAddress, bool status)
setMigrator
nonpayablefunction setMigrator(address _migrator)
setPermissionMode
nonpayablefunction setPermissionMode(uint8 _mode)
setUCF
nonpayablefunction setUCF(uint256 _lockId, uint256 _ucf)
setWhitelistForFreeLock
nonpayablefunction setWhitelistForFreeLock(address user, bool status)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 tokenId)
transferLockOwnership
nonpayablefunction transferLockOwnership(uint256 lockId, address newOwner)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unlockLiquidity
nonpayablefunction unlockLiquidity(uint256 lockId)
events
Approval
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
ApprovalForAll
event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
CollectAddressUpdated
event CollectAddressUpdated(uint256 indexed lockId, address indexed newCollectAddress)
FeesSet
event FeesSet(uint256 _lpFee, uint256 _collectFee)
FlatFeeSet
event FlatFeeSet(uint256 _flatFee)
HookBlacklisted
event HookBlacklisted(address hook, bool blacklisted)
HookWhitelisted
event HookWhitelisted(address indexed hookAddress, bool status)
LiquidityDecreased
event LiquidityDecreased(uint256 indexed lockId)
LiquidityLocked
event LiquidityLocked(uint256 indexed lockId, address indexed owner, address positionManager, uint256 tokenId, bytes32 indexed poolId, uint256 amount, uint256 unlockTime)
LiquidityUnlocked
event LiquidityUnlocked(uint256 indexed lockId, address indexed owner, address token, uint256 tokenId, bytes32 indexed poolId, uint256 amount)
LockExtended
event LockExtended(uint256 indexed lockId, uint256 newUnlockTime)
LockMigrated
event LockMigrated(uint256 indexed lockId, address indexed migrator)
LockOwnershipTransferred
event LockOwnershipTransferred(uint256 indexed lockId, address indexed previousOwner, address indexed newOwner)
MigrateInContractSet
event MigrateInContractSet(address migrateIn)
MigratorSet
event MigratorSet(address migrator)
onSetUCF
event onSetUCF(uint256 indexed _lockId, uint256 _ucf)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PermissionModeChanged
event PermissionModeChanged(uint8 newMode)
Transfer
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
WhitelistedForFreeLock
event WhitelistedForFreeLock(address indexed user, bool status)
errors
AlreadyUnlocked
error AlreadyUnlocked()
CannotRescueNFTs
error CannotRescueNFTs()
CollectFeeTooHigh
error CollectFeeTooHigh()
ERC721IncorrectOwner
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)
ERC721InsufficientApproval
error ERC721InsufficientApproval(address operator, uint256 tokenId)
ERC721InvalidApprover
error ERC721InvalidApprover(address approver)
ERC721InvalidOperator
error ERC721InvalidOperator(address operator)
ERC721InvalidOwner
error ERC721InvalidOwner(address owner)
ERC721InvalidReceiver
error ERC721InvalidReceiver(address receiver)
ERC721InvalidSender
error ERC721InvalidSender(address sender)
ERC721NonexistentToken
error ERC721NonexistentToken(uint256 tokenId)
EternalLock
error EternalLock()
ETHTransferFailed
error ETHTransferFailed()
HookIsBlacklisted
error HookIsBlacklisted()
HookNotWhitelisted
error HookNotWhitelisted()
InsufficientFlatFee
error InsufficientFlatFee()
InsufficientLiquidity
error InsufficientLiquidity()
InvalidAmount
error InvalidAmount()
InvalidAutoCollectAccount
error InvalidAutoCollectAccount()
InvalidCollectAddress
error InvalidCollectAddress()
InvalidCollectFee
error InvalidCollectFee()
InvalidCollectFeeReceiver
error InvalidCollectFeeReceiver()
InvalidFeeAmount
error InvalidFeeAmount()
InvalidFeeRecipient
error InvalidFeeRecipient()
InvalidHookAddress
error InvalidHookAddress()
InvalidHookAddressFormat
error InvalidHookAddressFormat()
InvalidHookBlacklist
error InvalidHookBlacklist()
InvalidHookWhitelist
error InvalidHookWhitelist()
InvalidLiquidity
error InvalidLiquidity()
InvalidLockId
error InvalidLockId()
InvalidLPFee
error InvalidLPFee()
InvalidLPFeeReceiver
error InvalidLPFeeReceiver()
InvalidMigrateInContract
error InvalidMigrateInContract()
InvalidMigrator
error InvalidMigrator()
InvalidNewOwner
error InvalidNewOwner()
InvalidPermissionMode
error InvalidPermissionMode()
InvalidPoolManager
error InvalidPoolManager()
InvalidPositionManager
error InvalidPositionManager()
InvalidReceiver
error InvalidReceiver()
InvalidRecipient
error InvalidRecipient()
InvalidTokenAddress
error InvalidTokenAddress()
InvalidTokenId
error InvalidTokenId()
InvalidUCF
error InvalidUCF()
InvalidUnlockTime
error InvalidUnlockTime()
InvalidUnlockTimeRange
error InvalidUnlockTimeRange()
LockIsNFTized
error LockIsNFTized()
LockNotActive
error LockNotActive()
LPFeeTooHigh
error LPFeeTooHigh()
MigrationFailed
error MigrationFailed()
MigratorNotSet
error MigratorNotSet()
NFTNotInLocker
error NFTNotInLocker()
NFTOwnerMismatch
error NFTOwnerMismatch(address expected, address actual)
NoChange
error NoChange()
NoLiquidityInPosition
error NoLiquidityInPosition()
NotOwner
error NotOwner()
NotYetExpired
error NotYetExpired()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PoolNotInitialized
error PoolNotInitialized()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StillLocked
error StillLocked()
TransferFailed
error TransferFailed(string reason)
TransferToZeroAddress
error TransferToZeroAddress()
UCFCanOnlyBeDecreased
error UCFCanOnlyBeDecreased()
UnlockTimeInPast
error UnlockTimeInPast()
ZeroLiquidity
error ZeroLiquidity()
creation bytecode
0x60c0604052346104e35761555e60a0813803918261001c816104e7565b9384928339810103126104e3576100328161050c565b9061003f6020820161050c565b9061004c6040820161050c565b610064608061005d6060850161050c565b930161050c565b9361006f60406104e7565b600c81526b554e4358205634204c6f636b60a01b602082015261009260406104e7565b600c81526b554e43582d56342d4c4f434b60a01b6020820152815190916001600160401b0382116104145781906100c95f54610520565b601f8111610496575b50602090601f8311600114610433575f92610428575b50508160011b915f199060031b1c1916175f555b8051906001600160401b03821161041457819061011a600154610520565b601f81116103bb575b50602090601f8311600114610355575f9261034a575b50508160011b915f199060031b1c1916176001555b33156103375760068054336001600160a01b0319821681179092556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a360016007556032600f5560c860105567016345785d8a00006011556101bc601654610520565b601f81116102f9575b50600a64173539b7b760d91b016016556001600160a01b03169283156102ea576001600160a01b03169081156102db576001600160a01b03169182156102cc576001600160a01b03169283156102bd5760805260a05260018060a01b0319600c541617600c5560018060a01b0319600d541617600d5560018060a01b031660018060a01b0319600e541617600e5560ff1960125416601255604051614fef908161056f82396080518181816104940152610e63015260a05181818161037e01528181610d1001528181611bca0152818161261c015281816127f901528181612e4501528181612ee50152818161339a01526139a90152f35b633621ffa560e11b5f5260045ffd5b630b670b9760e21b5f5260045ffd5b63ed5f09f160e01b5f5260045ffd5b63bc12814760e01b5f5260045ffd5b60165f5261033190601f0160051c7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990810190610558565b5f6101c5565b631e4fbdf760e01b5f525f60045260245ffd5b015190505f80610139565b60015f9081528281209350601f198516905b8181106103a3575090846001959493921061038b575b505050811b0160015561014e565b01515f1960f88460031b161c191690555f808061037d565b92936020600181928786015181550195019301610367565b60015f52610404907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c8101916020861061040a575b601f0160051c0190610558565b5f610123565b90915081906103f7565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100e8565b5f8080528281209350601f198516905b81811061047e5750908460019594939210610466575b505050811b015f556100fc565b01515f1960f88460031b161c191690555f8080610459565b92936020600181928786015181550195019301610443565b5f80526104dd907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563601f850160051c8101916020861061040a57601f0160051c0190610558565b5f6100d2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761041457604052565b51906001600160a01b03821682036104e357565b90600182811c9216801561054e575b602083101461053a57565b634e487b7160e01b5f52602260045260245ffd5b91607f169161052f565b818110610563575050565b5f815560010161055856fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908163011e116714613f015750806301ffc9a714613e94578063066b58c714613e6c57806306fdde0314613da5578063081812fc14613d69578063095ea7b314613c7f5780630ae300bf14613c575780630b78f9c014613bd7578063150b7a0214613b685780631c76046e146137305780631f113fc31461370757806322758802146136c857806323b872dd146136b057806323cf31181461367057806323fa495a1461362257806342842e0e146135f8578063454b06081461332457806355f804b3146131da5780635a04fb691461308a5780636352211e146130595780636c0360eb1461303d5780636d3b96c314612ffe578063704ce43e14612fe057806370a0823114612f8d578063715018a614612f3057806375eb8e6914612f14578063791b98bc14612ecf5780637dccbb9914612e84578063879905a114612e145780638d3c100a1461277b5780638da5cb5b146127525780638e5f59771461251857806393ac8305146124c557806395d89b411461241e57806396e8392414611b655780639b7d02ad14611b2c5780639caf4f0b14611a925780639ecd747214611a69578063a22cb465146119c5578063aa1ef5981461190b578063aa67bf3a14611860578063b2fb30cb146117a3578063b707a288146116f1578063b88d4fde1461168e578063c45d7c56146115ec578063c668286214611530578063c87b56dd1461127d578063c9102afd1461110d578063ce79eb6014611049578063d4d5d32a1461102b578063d73792a91461100e578063d9eb594714610ff0578063da3ef23f14610e92578063dc4c90d314610e4d578063e4877d3f14610e0e578063e985e9c514610db6578063eb3a79ed14610cd7578063ef24894414610c68578063f0cf6c9614610c3e578063f2fde38b14610bb5578063f4dadc6114610b0a578063f62f5a23146103235763f6aacfb10361000f573461032057602036600319011261032057604060209160043581526008835220600681015415159081610312575b506040519015158152f35b60079150015442105f610307565b80fd5b50606036600319011261032057604435600435811515602435818403610b065761034b6149ab565b338552601760205260ff60408620541615610aed575b42811115610ade576402540be40081101580610ad3575b610ac4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610ac057604051632142170760e11b8152336004820152306024820152604481018590528690818160648183895af1801561091157610aab575b5050604051637ba03aad60e01b8152600481018590529560c087602481875afa968715610a9e578197610a6c575b50604051631efeed3360e01b81526004810186905291602083602481885afa928315610911578293610a4b575b506001600160801b0383168015610a3c5760a0892060405160208101918252600660408201526040815261047460608261401f565b519020604051631e2eaeaf60e01b815260048101919091526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610a315784916109fb575b506001600160a01b0316156109ec5760808901516001600160a01b031680610960575b50600f5480151580610949575b6107aa575b5050600b549661051088614317565b600b5561079b575b8760806001600160801b036040519561053087613fe9565b898752876020880152846040880152169485606082015201526009601054886040519361055c85613fb9565b81855260208501338152604086018b81528d6060880190815260808801918a835260a08901938c855260c08a019633885260e08b019687526101008b019889528b52600860205260408b2099518a5560018060a01b0390511660018a019060018060a01b03166001600160601b0360a01b8254161790555160028901555160018060a01b03815116600389019060018060a01b03166001600160601b0360a01b8254161790556004880160018060a01b0360018060a01b03602084015116166001600160601b0360a01b82541617815560408201518154606084015160b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b191617179055608060018060a01b0391015116600588019060018060a01b03166001600160601b0360a01b825416179055516006870155516007860155600885019160018060a01b039060018060a01b03905116166001600160601b0360a01b83541617825551151581549060ff60a01b9060a01b169060ff60a01b191617905551910155338152600a6020526106f58660408320614e25565b50338152601760205260ff6040822054161580610792575b610762575b5060a060209620936040519384528684015260408301526060820152827f49def1ccceea7771ce91254bcad08254733e55bec4be0b3b47a01b7f2cb53b0060803393a46001600755604051908152f35b8080808060018060a01b03600c541634905af161077d6145c6565b50610712575b63b12d13eb60e01b8152600490fd5b5034151561070d565b6107a587336147fb565b610518565b610863929450816107cf6127106107c76108139461085e966145f5565b048092614608565b506107d8614ad3565b604051918a6020840152604083015285606083015285608083015260a0808301528560c083015260c0825261080e60e08361401f565b614b6f565b60018060a01b038a51169060018060a01b0360208c01511660018060a01b03600c541690604051936020850152604084015260608301526060825261085960808361401f565b614c7a565b614d77565b603c42019081421161093557853b156109315760405163dd46508f60e01b8152918391839182916108989190600484016145aa565b038183895af180156109115790829161091c575b5050604051631efeed3360e01b815260048101869052602081602481885afa9081156109115782916108e2575b50915f80610501565b610904915060203d60201161090a575b6108fc818361401f565b81019061458b565b5f6108d9565b503d6108f2565b6040513d84823e3d90fd5b816109269161401f565b61032057805f6108ac565b8280fd5b634e487b7160e01b83526011600452602483fd5b50338452601760205260ff604085205416156104fc565b60ff6012541660038110156109d857600281036109a257508352600960205260ff60408420541615610993575b5f6104ef565b632812ca3b60e21b8352600483fd5b6001146109b0575b5061098d565b8352601360205260ff6040842054166109c9575f6109aa565b6308ed3ca360e01b8352600483fd5b634e487b7160e01b85526021600452602485fd5b63486aa30760e01b8352600483fd5b90506020813d602011610a29575b81610a166020938361401f565b81010312610a2557515f6104cc565b8380fd5b3d9150610a09565b6040513d86823e3d90fd5b6378b8b76160e01b8352600483fd5b610a6591935060203d60201161090a576108fc818361401f565b915f61043f565b610a8f91975060c03d60c011610a97575b610a87818361401f565b81019061456d565b50955f610412565b503d610a7d565b50604051903d90823e3d90fd5b81610ab59161401f565b610ac057855f6103e4565b8580fd5b6352aba6d360e11b8552600485fd5b505f19811415610378565b63ae130dfb60e01b8552600485fd5b601154341015610361576340b7d5ed60e11b8552600485fd5b8480fd5b50346103205760203660031901126103205760406101a091600435815260086020522080549060ff60018060a01b03600183015416916002810154610b5160038301614224565b610b856006840154916007850154936009600887015496015497604051998a5260208a0152604089015260608801906141ba565b6101008601526101208501526001600160a01b03811661014085015260a01c161515610160830152610180820152f35b503461032057602036600319011261032057610bcf613f3d565b610bd76147d4565b6001600160a01b03168015610c2a57600680546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b631e4fbdf760e01b82526004829052602482fd5b5034610320578060031936011261032057610c6460ff60125416604051918291826141fd565b0390f35b503461032057610c7736613f69565b610c7f6147d4565b8183526008602052600960408420018054821015610cc857817fa4b63b21571e7c2b944a681b0a39cda220f85f67aaa7aa4d23fcf7d31e2379a39260209255604051908152a280f35b630927c5af60e41b8452600484fd5b503461032057604036600319011261032057610cf1613f53565b6040516331a9108f60e11b8152600480359082015291906020836024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa928315610911578293610d76575b506001600160a01b039081169216828103610d61575080f35b604492634877b8df60e01b8352600452602452fd5b9092506020813d602011610dae575b81610d926020938361401f565b81010312610daa57610da390614277565b915f610d48565b5080fd5b3d9150610d85565b5034610320576040366003190112610320576040610dd2613f3d565b91610ddb613f53565b9260018060a01b031681526005602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346103205760203660031901126103205760209060ff906040906001600160a01b03610e39613f3d565b168152601784522054166040519015158152f35b50346103205780600319360112610320576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461032057610ea136614091565b90610eaa6147d4565b81516001600160401b038111610fdc57610ec56016546140cf565b601f8111610f74575b50602092601f8211600114610f0a57928293829392610eff575b50508160011b915f199060031b1c19161760165580f35b015190505f80610ee8565b60168352601f198216935f80516020614f9a83398151915291845b868110610f5c5750836001959610610f44575b505050811b0160165580f35b01515f1960f88460031b161c191690555f8080610f38565b91926020600181928685015181550194019201610f25565b60168352601f820160051c5f80516020614f9a833981519152019060208310610fc7575b601f0160051c5f80516020614f9a83398151915201905b818110610fbc5750610ece565b838155600101610faf565b5f80516020614f9a8339815191529150610f98565b634e487b7160e01b82526041600452602482fd5b50346103205780600319360112610320576020601154604051908152f35b503461032057806003193601126103205760206040516127108152f35b50346103205780600319360112610320576020601054604051908152f35b503461032057604036600319011261032057611063613f3d565b61106b6141ab565b906110746147d4565b6001600160a01b03169081156110fe57818352600960205260ff6040842054169080151580921515146110ef577f5b2460eb1f1133b6714bb07afb85ae0d9c49f24afa50d9800c1cc6d789f4acc7916110e560209285875260098452604087209060ff801983541691151516179055565b604051908152a280f35b63a88ee57760e01b8452600484fd5b632a96f9e160e21b8352600483fd5b5034610320576020366003190112610320576040816101a092610100835161113481613fb9565b8281528260208201528285820152845161114d81613fe9565b838152836020820152838682015283606082015283608082015260608201528260808201528260a08201528260c08201528260e0820152015260043581526008602052206040519061119e82613fb9565b8054825260018101546001600160a01b03166020830190815260028201546040840190815290916111d160038201614224565b6060850190815260068201546080860190815261124d60078401549260a08801938452600885015495600960c08a019660018060a01b038916885260ff60e08c019960a01c16151589520154976101008a0198895260405199518a5260018060a01b0390511660208a01525160408901525160608801906141ba565b5161010086015251610120850152516001600160a01b031661014084015251151561016083015251610180820152f35b503461032057602036600319011261032057600435808252600260205260408220546001600160a01b03161561151e576112b5614107565b8051909190156115035782818072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8110156114dd575b50806d04ee2d6d415b85acef8100000000600a9210156114c2575b662386f26fc100008110156114ae575b6305f5e10081101561149d575b61271081101561148e575b6064811015611480575b1015611478575b6001810191600a602161136061134a86614040565b95611358604051978861401f565b808752614040565b602086019490601f19013686378501015b5f1901916f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530490811561139f57600a90611371565b505060209182604051948051918291018587015e84019083820190868252519283915e010182815260165490836113d5836140cf565b926001811690811561145b5750600114611417575b50505061140381610c649303601f19810183528261401f565b604051918291602083526020830190613f19565b90919350601681525f80516020614f9a8339815191525b84821061144757505081610c64936114039201936113ea565b60018160209254848601520191019061142e565b60ff19168352505081151590910201915061140381610c646113ea565b600101611335565b60646002910492019161132e565b61271060049104920191611324565b6305f5e10060089104920191611319565b662386f26fc100006010910492019161130c565b6d04ee2d6d415b85acef8100000000602091049201916112fc565b6040925072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90049050600a6112e1565b5050604051610c649161151760208361401f565b8152611403565b637e27328960e01b8252600452602490fd5b5034610320578060031936011261032057604051908060165490611553826140cf565b80855291600181169081156115c5575060011461157b575b610c64846114038186038261401f565b601681525f80516020614f9a833981519152939250905b8082106115ab575090915081016020016114038261156b565b919260018160209254838588010152019101909291611592565b60ff191660208087019190915292151560051b85019092019250611403915083905061156b565b5034610320576020366003190112610320576004356003811015610daa576116126147d4565b60125460ff8116600381101561167a57821461166b5760ff191660ff8216176012556040517fd2e6f9601313cfd1c3bd69d8a281aed29a764c8a456a0ac3fe12a4767608c16891819061166590826141fd565b0390a180f35b63a88ee57760e01b8352600483fd5b634e487b7160e01b84526021600452602484fd5b5034610320576080366003190112610320576116a8613f3d565b6116b0613f53565b606435916001600160401b038311610a255736602384011215610a25576116e46116ee93369060248160040135910161405b565b9160443591614687565b80f35b50346103205760403660031901126103205760043561170e613f53565b6117166149ab565b6001600160a01b03169081156117945780835260086020526040832060018101546001600160a01b031633036117855760080180546001600160a01b031916831790557f570a1ee460fe39844fcfa359db528b53324ce4c22fa7080d3834db0a6349ed808380a3600160075580f35b6330cd747160e01b8452600484fd5b635447822f60e01b8352600483fd5b5034610320576117b236613f69565b6117ba6149ab565b81835260086020526040832060018101546001600160a01b031633036117855742821115611851576007018054821115611837576402540be40082101580611846575b61183757817f4e4187a5cfd31a235276a431f3c394962d1b05cc4da52f6fa4e5460a5808ee219260209255604051908152a2600160075580f35b6352aba6d360e11b8452600484fd5b505f198214156117fd565b63ae130dfb60e01b8452600484fd5b50346103205760403660031901126103205761187a613f3d565b6118826141ab565b9061188b6147d4565b6001600160a01b03169081156110fe57818352601360205260ff6040842054169080151580921515146110ef57916040916118fd7f4cc0d8bbc18f4db77c5226d5370b9a94a5e93e3cf2671017043e55c190be6d6d9483875260136020528487209060ff801983541691151516179055565b82519182526020820152a180f35b503461032057606036600319011261032057611925613f3d565b61192d613f53565b6044356001600160a01b0381169290839003610a255761194b6147d4565b6001600160a01b03169081156119b6576001600160a01b03169081156119a7576001600160601b0360a01b600c541617600c556001600160601b0360a01b600d541617600d556001600160601b0360a01b600e541617600e5580f35b633621ffa560e11b8452600484fd5b630b670b9760e21b8452600484fd5b5034610320576040366003190112610320576119df613f3d565b6119e76141ab565b6001600160a01b03909116908115611a5557338352600560205260408320825f52602052611a248160405f209060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b630b61174360e31b83526004829052602483fd5b50346103205780600319360112610320576014546040516001600160a01b039091168152602090f35b503461032057604036600319011261032057611aac613f3d565b611ab46141ab565b90611abd6147d4565b6001600160a01b0316908115611b1d5760207fee6dc5e65d61241c43ff3037dcd8a7857d0780c354fac7a12f99285a476cf9ed9183855260178252611b1181604087209060ff801983541691151516179055565b6040519015158152a280f35b630f58058360e11b8352600483fd5b5034610320576020366003190112610320576020906040906001600160a01b03611b54613f3d565b168152600a83522054604051908152f35b503461032057602036600319011261032057600435611b826149ab565b80825260086020526040822060018101546001600160a01b0316338103611785576007820154421061240f576006820180548015612400576002840154938660018060a01b037f00000000000000000000000000000000000000000000000000000000000000001693604051637ba03aad60e01b815287600482015260c081602481895afa9081156123f55783916123d5575b50604051631efeed3360e01b8152600481018990526020816024818a5afa8015610a31576001600160801b039185916123b6575b5016611f1c575b5055838752600a602052611c678660408920614e94565b5060ff600882015460a01c16611e17575b823b15611e13576040516323b872dd60e01b81523060048201526001600160a01b03851660248201526044810186905287808260648183895af19182611dfa575b5050611d6257868060033d11611d51575b506308c379a014611d15575b6040516312dfddb360e01b81526020600482015260166024820152752ab735b737bbb7103a3930b739b332b91032b93937b960511b6044820152606490fd5b611d1d614615565b80611d285750611cd6565b6040516312dfddb360e01b815260206004820152908190611d4d906024830190613f19565b0390fd5b9050600481803e5160e01c81611cca565b85927fba4a3f8e2e6613ba4f7a58a5f3afbe56fdaae5ed213275b0d9bec44761f6cb059260a0611d96600360609501614224565b209660405192835260208301526040820152a481526008602052611df26040822060095f918281558260018201558260028201558260038201558260048201558260058201558260068201558260078201558260088201550155565b600160075580f35b81611e049161401f565b611e0f57875f611cb9565b8780fd5b8680fd5b858752600260205260408720546001600160a01b0316801590811580611ee9575b888a52600260205260408a2080546001600160a01b0319169055888a837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4888a52600860205260ff600860408c20015460a01c16611ec3575b508881895f80516020614f7a8339815191528380a45015611c7857637e27328960e01b87526004869052602487fd5b611ece575b5f611e94565b808952600a602052611ee38860408b20614e94565b50611ec8565b5f89815260046020526040902080546001600160a01b0319169055818a52600360205260408a2080545f19019055611e38565b909150843b156123b25760405163095ea7b360e01b81526001600160a01b03861660048201526024810188905289908181604481838b5af180156109115761239d575b5050611fb2611f6c614ad3565b6040519061080e82611fa48c6020830160c09181525f60208201525f60408201525f606082015260a060808201525f60a08201520190565b03601f19810184528361401f565b815160208084018051604080516001600160a01b0395861694810194909452931692820192909252306060820152909291611ff89161085e916108598260808101611fa4565b603c42019081421161238957908b94939291883b15610ac05760405163dd46508f60e01b8152918691839182916120339190600484016145aa565b0381838c5af190811561237e578591612369575b50505190516001600160a01b039081169116878215821580156122f15747935b8491831561227657475b809660098c0154908161213b575b505050826120e3575b50505082612099575b505050611c50565b929492156120d45782939450829182915af16120b36145c6565b50156120c55787905b5f808781612091565b63b12d13eb60e01b8852600488fd5b6120de92946149cb565b6120bc565b97939192949596975f14612125575082809281925af16121016145c6565b50156121165790878b9493925b5f8080612088565b63b12d13eb60e01b8b5260048bfd5b9181612136929498979695936149cb565b61210e565b61216298508192955061216b6127108061215861217195856145f5565b049a8b95896145f5565b04938492614608565b95614608565b96806121fd575b5080612186575b808061207f565b909294849697989992945f146121d95750600d54829182918291906001600160a01b03165af16121b46145c6565b50156121ca57918d96959493918b935b5f61217f565b63b12d13eb60e01b8e5260048efd5b9492906121f89060018060a09c9b9a9997959c1b03600d5416896149cb565b6121c4565b90929496979899919395845f146122525750600d54829182918291906001600160a01b03165af161222c6145c6565b501561224357918b93918f98979695935b5f612178565b63b12d13eb60e01b8f5260048ffd5b959391999897969492906122719060018060a01b03600d5416856149cb565b61223d565b6040516370a0823160e01b815230600482015294506020856024818a5afa80156122e6578d958a916122a9575b50612071565b95505097506020843d6020116122de575b816122c76020938361401f565b810103126122da578e978c94515f6122a3565b5f80fd5b3d91506122ba565b6040513d8b823e3d90fd5b6040516370a0823160e01b81523060048201529250602083602481875afa801561235e578b938891612325575b5093612067565b93505095506020823d602011612356575b816123436020938361401f565b810103126122da578c958a92515f61231e565b3d9150612336565b6040513d89823e3d90fd5b816123739161401f565b610a2557835f612047565b6040513d87823e3d90fd5b634e487b7160e01b8c52601160045260248cfd5b816123a79161401f565b6123b257885f611f5f565b8880fd5b6123cf915060203d60201161090a576108fc818361401f565b5f611c49565b6123ee915060c03d60c011610a9757610a87818361401f565b505f611c15565b6040513d85823e3d90fd5b6328486b6360e11b8652600486fd5b636100d92960e11b8452600484fd5b5034610320578060031936011261032057604051908060015490612441826140cf565b80855291600181169081156115c5575060011461246857610c64846114038186038261401f565b600181527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106124ab575090915081016020016114038261156b565b919260018160209254838588010152019101909291612492565b503461032057604036600319011261032057808080806124e3613f53565b6124eb6147d4565b6124f36149ab565b600435906001600160a01b03165af161250a6145c6565b501561078357600160075580f35b503461032057608036600319011261032057600435602435916001600160801b0383168093036103205761254a6149ab565b81815260086020526040812060018101546001600160a01b031633036127435760078101545f19811461273157421115612722578315612713576006810190815485116127045761261a906125e06125a0614ad3565b6002830154906040519160208301528860408301526044356060830152606435608083015260a0808301528660c083015260c0825261080e60e08361401f565b6003820154600490920154604080516001600160a01b03948516602082015293909116908301523360608301526108598260808101611fa4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169061264e90614d77565b90603c4201918242116126f057813b15610b0657918491612686938360405180968195829463dd46508f60e01b8452600484016145aa565b03925af180156123f5576126db575b506126a36040948254614608565b90558251917f64d0c470254fcda065fe0e66b5395405b2b6f2997de63b73f166031c81c4bdbb8280a260016007558082526020820152f35b6126e683809261401f565b610daa575f612695565b634e487b7160e01b85526011600452602485fd5b63bb55fd2760e01b8352600483fd5b630200e8a960e31b8252600482fd5b632cc8960360e11b8252600482fd5b600162f96b2f60e01b03198352600483fd5b6330cd747160e01b8252600482fd5b50346103205780600319360112610320576006546040516001600160a01b039091168152602090f35b503461032057604036600319011261032057612795613f53565b9061279e6149ab565b808081908260043581526008602052604081209560018060a01b0360018801541633141580612dff575b612743576001600160a01b03811615612df057600287018054604051637ba03aad60e01b81526004810182905290987f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169290919060c082602481875afa918215612de5578692612dc3575b50604051631efeed3360e01b8152600481018c9052602081602481885afa90811561235e57906001600160801b03918891612da4575b501661289b575b60808a8a8a8a6001600755604051938452602084015260408301526060820152f35b92859a9194979899508096509491943b15610daa5760405163095ea7b360e01b81526001600160a01b038716600482015260248101919091528181604481838a5af1801561091157612d8f575b5050611fa46129309161080e6128fc614ad3565b91546040519384916020830160c09181525f60208201525f60408201525f606082015260a060808201525f60a08201520190565b815160208084018051604080516001600160a01b03958616948101949094529316928201929092523060608201529094916129769161085e916108598260808101611fa4565b603c4201804211612d7b579082918a933b15610a25576129af9284928360405180968195829463dd46508f60e01b8452600484016145aa565b03925af1801561091157612d66575b50505191516001600160a01b0392831680159693909116928315928715612cf85747965b878515612c8a5747935b849260098501938d855415155f14612bdc575050505050918796959391612a3f612a3761271080612a24612a2e9e9a9854809d6145f5565b049c8d9b866145f5565b049b8c9b614608565b9a8b93614608565b9660018060a01b03600e541633145f14612bc7578b8a825b8b612b74575b81612b39575b5050600e546001600160a01b03163314159050612b305750600801546001600160a01b03169485905b82612afb575b5050505083612aaf575b505050608094505b5f8080808080612879565b15612ae757508580808481945af1612ac56145c6565b5015612ad857608094505b5f8080612a9c565b63b12d13eb60e01b8552600485fd5b60809650612af69183916149cb565b612ad0565b15612b22578a809350809281925af1612b126145c6565b50156120c5575b5f878482612a92565b612b2b926149cb565b612b19565b90508095612a8c565b8715612b64578293949550829182915af1612b526145c6565b5015612116579089915b8b8a5f612a63565b612b6f9250886149cb565b612b5c565b9293949190895f14612bb2575080808093508c855af1612b926145c6565b5015612ba357908b8a8c9493612a5d565b63b12d13eb60e01b8c5260048cfd5b9091949392612bc28c82896149cb565b612a5d565b600d548c908b906001600160a01b0316612a57565b9450989597945098958a929b87929b612c46575b505050505083612c08575b5050505060809450612aa4565b15612c3257508680809381935af1612c1e6145c6565b5015612ad857608094505b5f808080612bfb565b6080975090612c4192916149cb565b612c29565b15612c7b575082809281925af1612c5b6145c6565b5015612c6c575b885f848180612bf0565b63b12d13eb60e01b8952600489fd5b612c8593506149cb565b612c62565b6040516370a0823160e01b81523060048201526020816024818b5afa908115612ced578c91612cbb575b50936129ec565b90506020813d602011612ce5575b81612cd66020938361401f565b810103126122da57515f612cb4565b3d9150612cc9565b6040513d8e823e3d90fd5b6040516370a0823160e01b8152306004820152602081602481875afa908115612d5b578a91612d29575b50966129e2565b90506020813d602011612d53575b81612d446020938361401f565b810103126122da57515f612d22565b3d9150612d37565b6040513d8c823e3d90fd5b81612d709161401f565b611e1357865f6129be565b634e487b7160e01b8a52601160045260248afd5b81612d999161401f565b611e0f57875f6128e8565b612dbd915060203d60201161090a576108fc818361401f565b5f612872565b612ddd91925060c03d60c011610a9757610a87818361401f565b50905f61283c565b6040513d88823e3d90fd5b634e46966960e11b8252600482fd5b50600e546001600160a01b03163314156127c8565b503461032057612e2336613f7f565b909291612e2e6147d4565b612e366149ab565b6001600160a01b0390811693907f0000000000000000000000000000000000000000000000000000000000000000168414612e7557611df292936149cb565b633d8647d760e11b8352600483fd5b503461032057604036600319011261032057602090612ec0906001600160a01b03612ead613f3d565b168152600a835260406024359120614e10565b90549060031b1c604051908152f35b50346103205780600319360112610320576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461032057806003193601126103205760206040515f198152f35b5034610320578060031936011261032057612f496147d4565b600680546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610320576020366003190112610320576001600160a01b03612faf613f3d565b168015612fcc578160409160209352600383522054604051908152f35b6322718ad960e21b82526004829052602482fd5b50346103205780600319360112610320576020600f54604051908152f35b50346103205760203660031901126103205760209060ff906040906001600160a01b03613029613f3d565b168152600984522054166040519015158152f35b5034610320578060031936011261032057610c64611403614107565b50346103205760203660031901126103205760206130786004356147a0565b6040516001600160a01b039091168152f35b503461032057604036600319011261032057600435906130a8613f53565b916130b16149ab565b6001600160a01b0383169283156131cb578183526008602052604083206001810180549091906001600160a01b031633036131bc576008019060ff825460a01c165f1461316b57506001600160a01b039161310e91508390614838565b16928361312957637e27328960e01b83526004829052602483fd5b919233810361314f57505b33905f80516020614f7a8339815191528480a4600160075580f35b6364283d7b60e01b845233600452602491909152604452606482fd5b909150939293338552600a6020526131868360408720614e94565b50838552600a60205261319c8360408720614e25565b5080546001600160a01b0319908116851790915581541683179055613134565b6330cd747160e01b8552600485fd5b632a52b3c360e11b8352600483fd5b5034610320576131e936614091565b906131f26147d4565b81516001600160401b038111610fdc5761320d6015546140cf565b601f81116132bc575b50602092601f821160011461325257928293829392613247575b50508160011b915f199060031b1c19161760155580f35b015190505f80613230565b60158352601f198216935f80516020614f5a83398151915291845b8681106132a4575083600195961061328c575b505050811b0160155580f35b01515f1960f88460031b161c191690555f8080613280565b9192602060018192868501518155019401920161326d565b60158352601f820160051c5f80516020614f5a83398151915201906020831061330f575b601f0160051c5f80516020614f5a83398151915201905b8181106133045750613216565b8381556001016132f7565b5f80516020614f5a83398151915291506132e0565b5060203660031901126103205760043561333c6149ab565b6014546001600160a01b031680156135e957818352600860205260408320600181018054909291906001600160a01b031633036131bc576006810154156135da5760020180546040516331a9108f60e11b81526004810182905291927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692602081602481875afa9081156135cf578891613595575b50306001600160a01b039091160361358657908691833b156109315760405163095ea7b360e01b81526001600160a01b039190911660048201526024810191909152818160448183875af1801561091157613571575b5050601454915460405163277c45f560e11b81526004810186905260248101929092526044820152906020908290606490829034906001600160a01b03165af1908115610a31578491613537575b501561352857546001600160a01b03168252600a602052604082206134a4908290614e94565b5080825260086020526134ef6040832060095f918281558260018201558260028201558260038201558260048201558260058201558260068201558260078201558260088201550155565b6014546001600160a01b0316907f44428b5f080165ed3e2574589b3d8fdfed8c7aeddd00fb5e847fb6034dcea7b38380a3600160075580f35b63513dfed160e11b8352600483fd5b90506020813d602011613569575b816135526020938361401f565b81010312610a25576135639061430a565b5f61347e565b3d9150613545565b8161357b9161401f565b610b0657845f613430565b63213eeaa160e21b8752600487fd5b90506020813d6020116135c7575b816135b06020938361401f565b81010312611e0f576135c190614277565b5f6133da565b3d91506135a3565b6040513d8a823e3d90fd5b6304a417d360e31b8552600485fd5b632ed9bf5360e21b8352600483fd5b5034610320576116ee61360a36613f7f565b906040519261361a60208561401f565b858452614687565b5034610320576020366003190112610320577f02e6220a8c55d7fd57319e91a44a9aac5a5fd4c64a19bb34bb83c8cedbf3f39860206004356136626147d4565b80601155604051908152a180f35b50346103205760203660031901126103205761368a613f3d565b6136926147d4565b60018060a01b03166001600160601b0360a01b601454161760145580f35b5034610320576116ee6136c236613f7f565b91614339565b50346103205760203660031901126103205760209060ff906040906001600160a01b036136f3613f3d565b168152601384522054166040519015158152f35b5034610320578060031936011261032057600d546040516001600160a01b039091168152602090f35b346122da5760403660031901126122da57613749613f53565b6014546001600160a01b03163303613b595760405163c9102afd60e01b81526004803590820152906101a090829060249082906001600160a01b03165afa908115613a7b575f91613aa4575b50600b546137a281614317565b600b5560e082018051613a86575b6020830160018060a01b0381511693604081019184600984519560608501948551996080820198895160a084019c8d519261010060018060a01b0360c0880151169601519651151594604051996138068b613fb9565b808b5260208b0191825260408b0192835260608b0193845260808b0194855260a08b0195865260c08b0197885260e08b019687526101008b019889525f52600860205260405f2099518a5560018060a01b0390511660018a019060018060a01b03166001600160601b0360a01b8254161790555160028901555160018060a01b03815116600389019060018060a01b03166001600160601b0360a01b8254161790556004880160018060a01b0360018060a01b03602084015116166001600160601b0360a01b82541617815560408201518154606084015160b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b191617179055608060018060a01b0391015116600588019060018060a01b03166001600160601b0360a01b825416179055516006870155516007860155600885019160018060a01b039060018060a01b03905116166001600160601b0360a01b83541617825551151581549060ff60a01b9060a01b169060ff60a01b19161790555191015560018060a01b038151165f52600a6020526139a48560405f20614e25565b5082517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156122da576040516323b872dd60e01b815233600482015230602482015260448101929092525f8260648183855af1938415613a7b5760209860a07f49def1ccceea7771ce91254bcad08254733e55bec4be0b3b47a01b7f2cb53b00956080958b98613a6b575b50600180831b03905116975192512097519051916040519384528a84015260408301526060820152a4604051908152f35b5f613a759161401f565b5f613a3a565b6040513d5f823e3d90fd5b6020830151613a9f9083906001600160a01b03166147fb565b6137b0565b90506101a03d8111613b52575b613abb818361401f565b8101906101a0818303126122da5761018090613b0560405193613add85613fb9565b82518552613aed60208401614277565b6020860152604083015160408601526060830161428b565b6060840152610100810151608084015261012081015160a0840152613b2d6101408201614277565b60c0840152613b3f610160820161430a565b60e0840152015161010082015281613795565b503d613ab1565b6323479f3d60e21b5f5260045ffd5b346122da5760803660031901126122da57613b81613f3d565b50613b8a613f53565b506064356001600160401b0381116122da57366023820112156122da5780600401356001600160401b0381116122da57369101602401116122da57604051630a85bd0160e11b8152602090f35b346122da57613be536613f69565b613bed6147d4565b6103e88211613c48576103e88111613c3957816040917f93525d3c7f4fafe56faedbca6d501a13c63f47857d8b30d8282ec2dd806259a793600f558060105582519182526020820152a1005b63596b468d60e01b5f5260045ffd5b632df1c0af60e01b5f5260045ffd5b346122da575f3660031901126122da57600c546040516001600160a01b039091168152602090f35b346122da5760403660031901126122da57613c98613f3d565b602435613ca4816147a0565b33151580613d56575b80613d29575b613d165781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f90815260046020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b5f523360045260245ffd5b506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff1615613cb3565b506001600160a01b038116331415613cad565b346122da5760203660031901126122da57600435613d86816147a0565b505f526004602052602060018060a01b0360405f205416604051908152f35b346122da575f3660031901126122da576040515f8054613dc4816140cf565b8084529060018116908115613e485750600114613dec575b610c64836114038185038261401f565b5f8080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b808210613e2e57509091508101602001611403613ddc565b919260018160209254838588010152019101909291613e16565b60ff191660208086019190915291151560051b840190910191506114039050613ddc565b346122da575f3660031901126122da57600e546040516001600160a01b039091168152602090f35b346122da5760203660031901126122da5760043563ffffffff60e01b81168091036122da576020906380ac58cd60e01b8114908115613ef0575b8115613edf57506040519015158152f35b6301ffc9a760e01b14905082610307565b635b5e139f60e01b81149150613ece565b346122da575f3660031901126122da57805f60209252f35b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036122da57565b602435906001600160a01b03821682036122da57565b60409060031901126122da576004359060243590565b60609060031901126122da576004356001600160a01b03811681036122da57906024356001600160a01b03811681036122da579060443590565b61012081019081106001600160401b03821117613fd557604052565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b03821117613fd557604052565b604081019081106001600160401b03821117613fd557604052565b90601f801991011681019081106001600160401b03821117613fd557604052565b6001600160401b038111613fd557601f01601f191660200190565b92919261406782614040565b91614075604051938461401f565b8294818452818301116122da578281602093845f960137010152565b60206003198201126122da57600435906001600160401b0382116122da57806023830112156122da578160246140cc9360040135910161405b565b90565b90600182811c921680156140fd575b60208310146140e957565b634e487b7160e01b5f52602260045260245ffd5b91607f16916140de565b604051905f826015549161411a836140cf565b808352926001811690811561418c5750600114614140575b61413e9250038361401f565b565b5060155f90815290915f80516020614f5a8339815191525b81831061417057505090602061413e92820101614132565b6020919350806001915483858901015201910190918492614158565b6020925061413e94915060ff191682840152151560051b820101614132565b6024359081151582036122da57565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b9190602083019260038210156142105752565b634e487b7160e01b5f52602160045260245ffd5b9060405161423181613fe9565b82546001600160a01b0390811682526001840154808216602084015260a081901c62ffffff16604084015260b81c600290810b6060840152909301549092166080830152565b51906001600160a01b03821682036122da57565b91908260a09103126122da576040516142a381613fe9565b80926142ae81614277565b82526142bc60208201614277565b6020830152604081015162ffffff811681036122da5760408301526060810151908160020b82036122da57606083019190915260800151906001600160a01b03821682036122da5760800152565b519081151582036122da57565b5f1981146143255760010190565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b039091169190821561455a575f828152600260205260409020546001600160a01b031692331515806144ca575b5083151580614497575b815f52600360205260405f2060018154019055835f52600260205260405f20826001600160601b0360a01b8254161790558382867fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4835f52600860205260ff600860405f20015460a01c1661442b575b5083835f80516020614f7a8339815191525f80a46001600160a01b031680830361441357505050565b6364283d7b60e01b5f5260045260245260445260645ffd5b61447c575b805f52600a6020526144458360405f20614e25565b505f83815260086020819052604082206001810180546001600160a01b0319908116861790915591018054909116831790556143ea565b835f52600a6020526144918360405f20614e94565b50614430565b5f84815260046020526040902080546001600160a01b0319169055845f52600360205260405f205f198154019055614377565b80614509575b156144db575f61436d565b82846144f357637e27328960e01b5f5260045260245ffd5b63177e802f60e01b5f523360045260245260445ffd5b503384148015614538575b806144d057505f838152600460205260409020546001600160a01b031633146144d0565b505f84815260056020908152604080832033845290915290205460ff16614514565b633250574960e11b5f525f60045260245ffd5b919060c0838203126122da5761458560a0918461428b565b92015190565b908160209103126122da57516001600160801b03811681036122da5790565b9291906145c1602091604086526040860190613f19565b930152565b3d156145f0573d906145d782614040565b916145e5604051938461401f565b82523d5f602084013e565b606090565b8181029291811591840414171561432557565b9190820391821161432557565b5f60443d106140cc576040513d600319016004823e8051913d60248401116001600160401b0384111761468157828201928351916001600160401b038311614679573d8401600319018584016020011161467957506140cc9291016020019061401f565b949350505050565b92915050565b9291614694818386614339565b813b6146a1575b50505050565b604051630a85bd0160e11b81523360048201526001600160a01b03948516602482015260448101919091526080606482015292169190602090829081906146ec906084830190613f19565b03815f865af15f918161475b575b5061472857506147086145c6565b805190816147235782633250574960e11b5f5260045260245ffd5b602001fd5b6001600160e01b03191663757a42ff60e11b0161474957505f80808061469b565b633250574960e11b5f5260045260245ffd5b9091506020813d602011614798575b816147776020938361401f565b810103126122da57516001600160e01b0319811681036122da57905f6146fa565b3d915061476a565b5f818152600260205260409020546001600160a01b03169081156147c2575090565b637e27328960e01b5f5260045260245ffd5b6006546001600160a01b031633036147e857565b63118cdaa760e01b5f523360045260245ffd5b906001600160a01b0382161561455a576001600160a01b039161481e9190614838565b1661482557565b6339e3563760e11b5f525f60045260245ffd5b5f828152600260205260409020546001600160a01b0316918215159183919083614978575b6001600160a01b0316928315159081614960575b825f52600260205260405f20856001600160601b0360a01b8254161790558285857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4825f52600860205260ff600860405f20015460a01c166148e7575b50505f80516020614f7a8339815191525f80a490565b614945575b6148f8575b5f806148d1565b825f52600a60205261490d8160405f20614e25565b505f8181526008602081905260409091206001810180546001600160a01b0319908116871790915591018054909116841790556148f1565b825f52600a60205261495a8260405f20614e94565b506148ec565b845f52600360205260405f2060018154019055614871565b5f82815260046020526040902080546001600160a01b0319169055825f52600360205260405f205f19815401905561485d565b6002600754146149bc576002600755565b633ee5aeb560e01b5f5260045ffd5b60405163a9059cbb60e01b60208083019182526001600160a01b0394909416602483015260448083019590955293815290925f91614a0a60648261401f565b519082855af115613a7b575f513d614a5157506001600160a01b0381163b155b614a315750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614a2a565b60405190614a6782614004565b60606020838281520152565b6001600160401b038111613fd55760051b60200190565b90614a9482614a73565b614aa1604051918261401f565b8281528092614ab2601f1991614a73565b01905f5b828110614ac257505050565b806060602080938501015201614ab6565b614adb614a5a565b506040516020614aeb818361401f565b5f825260405190614afc818361401f565b5f8252601f198101815f5b828110614b265750505060405192614b1e84614004565b835282015290565b6060828287010152018290614b07565b8051821015614b4a5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b908151811015614b4a570160200190565b614b77614a5a565b506020810190815151916001830180931161432557614b9583614040565b92614ba3604051948561401f565b808452614bb2601f1991614040565b013660208501378051516001810180911161432557614bd090614a8a565b945f5b86515f19810190811161432557811015614c315780614bf56001928551614b36565b51614c00828a614b36565b52614c0b8189614b36565b5060ff60f81b614c1c828751614b5e565b51165f1a614c2a8288614b5e565b5301614bd3565b50949290919383515f19810190811161432557614c5991614c528287614b36565b5284614b36565b5082515f19810190811161432557614c7360019183614b5e565b5383525290565b614c82614a5a565b506020810190815151916001830180931161432557614ca083614040565b92614cae604051948561401f565b808452614cbd601f1991614040565b013660208501378051516001810180911161432557614cdb90614a8a565b945f5b86515f19810190811161432557811015614d3c5780614d006001928551614b36565b51614d0b828a614b36565b52614d168189614b36565b5060ff60f81b614d27828751614b5e565b51165f1a614d358288614b5e565b5301614cde565b50949290919383515f19810190811161432557614d5d91614c528287614b36565b5082515f19810190811161432557614c7360119183614b5e565b614d9a906020815191015190604051928391604060208401526060830190613f19565b91601f19828403016040830152805180845260208401936020808360051b8301019301945f915b838310614ddf57505050506140cc925003601f19810183528261401f565b91936001919395506020614dfe8192601f198682030187528951613f19565b97019301930190928694929593614dc1565b8054821015614b4a575f5260205f2001905f90565b6001810190825f528160205260405f2054155f14614e8d57805468010000000000000000811015613fd557614e7a614e64826001879401855584614e10565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f14614f51575f1981018181116143255782545f1981019190821161432557818103614f1c575b50505080548015614f08575f190190614ee98282614e10565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b614f3c614f2c614e649386614e10565b90549060031b1c92839286614e10565b90555f528360205260405f20555f8080614ed0565b505050505f9056fe55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47594cb47eeeeb76a68c4d24f7c656bc9e63d5bc82211fc7784b33e438103b2f873d833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289a26469706673582212204bf628d5ced724f675c8299577c4436c4da370b916d16697f9968330db207a8f64736f6c634300081a0033000000000000000000000000360e68faccca8ca495c1b759fd9eee466db9fb32000000000000000000000000d88f38f930b7952f2db2432cb002e7abbf3dd86900000000000000000000000090cf3e1fb9d1b35fad621649ca503ea13cf3716300000000000000000000000090cf3e1fb9d1b35fad621649ca503ea13cf3716300000000000000000000000090cf3e1fb9d1b35fad621649ca503ea13cf37163