0 txs
3.6k calls
constructor
constructor()
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
AUCTION_APPROVER
viewfunction AUCTION_APPROVER() view returns (bytes32)
AUCTION_LAUNCHER
viewfunction AUCTION_LAUNCHER() view returns (bytes32)
auctionDelay
viewfunction auctionDelay() view returns (uint256)
auctionDetails
viewfunction auctionDetails(uint256 auctionId) view returns (tuple initialPrices, uint256 availableRuns)
auctionLength
viewfunction auctionLength() view returns (uint256)
auctions
viewfunction auctions(uint256) view returns (uint256 id, address sellToken, address buyToken, tuple sellLimit, tuple buyLimit, tuple prices, uint256 restrictedUntil, uint256 launchDeadline, uint256 startTime, uint256 endTime, uint256 k)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
BRAND_MANAGER
viewfunction BRAND_MANAGER() view returns (bytes32)
buyEnds
viewfunction buyEnds(address) view returns (uint256)
daoFeeRegistry
viewfunction daoFeeRegistry() view returns (address)
daoPendingFeeShares
viewfunction daoPendingFeeShares() view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
dustAmount
viewfunction dustAmount(address token) view returns (uint256 amount)
feeRecipients
viewfunction feeRecipients(uint256) view returns (address recipient, uint96 portion)
feeRecipientsPendingFeeShares
viewfunction feeRecipientsPendingFeeShares() view returns (uint256)
folio
viewfunction folio() view returns (address[] _assets, uint256[] _amounts)
getBid
viewfunction getBid(uint256 auctionId, uint256 timestamp, uint256 sellAmount) view returns (uint256 bidAmount)
getPendingFeeShares
viewfunction getPendingFeeShares() view returns (uint256)
getPrice
viewfunction getPrice(uint256 auctionId, uint256 timestamp) view returns (uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getRoleMember
viewfunction getRoleMember(bytes32 role, uint256 index) view returns (address)
getRoleMemberCount
viewfunction getRoleMemberCount(bytes32 role) view returns (uint256)
getRoleMembers
viewfunction getRoleMembers(bytes32 role) view returns (address[])
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isDeprecated
viewfunction isDeprecated() view returns (bool)
lastPoke
viewfunction lastPoke() view returns (uint256)
lot
viewfunction lot(uint256 auctionId, uint256 timestamp) view returns (uint256 sellAmount)
mandate
viewfunction mandate() view returns (string)
mintFee
viewfunction mintFee() view returns (uint256)
name
viewfunction name() view returns (string)
nextAuctionId
viewfunction nextAuctionId() view returns (uint256)
sellEnds
viewfunction sellEnds(address) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
toAssets
viewfunction toAssets(uint256 shares, uint8 rounding) view returns (address[] _assets, uint256[] _amounts)
totalAssets
viewfunction totalAssets() view returns (address[] _assets, uint256[] _amounts)
totalSupply
viewfunction totalSupply() view returns (uint256)
tvlFee
viewfunction tvlFee() view returns (uint256)
version
purefunction version() pure returns (string)
addToBasket
nonpayablefunction addToBasket(address token)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
approveAuction
nonpayablefunction approveAuction(address sell, address buy, tuple sellLimit, tuple buyLimit, tuple prices, uint256 ttl, uint256 runs)
bid
nonpayablefunction bid(uint256 auctionId, uint256 sellAmount, uint256 maxBuyAmount, bool withCallback, bytes data) returns (uint256 boughtAmt)
closeAuction
nonpayablefunction closeAuction(uint256 auctionId)
deprecateFolio
nonpayablefunction deprecateFolio()
distributeFees
nonpayablefunction distributeFees()
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(tuple _basicDetails, tuple _additionalDetails, address _creator, address _daoFeeRegistry)
mint
nonpayablefunction mint(uint256 shares, address receiver, uint256 minSharesOut) returns (address[] _assets, uint256[] _amounts)
openAuction
nonpayablefunction openAuction(uint256 auctionId, uint256 sellLimit, uint256 buyLimit, uint256 startPrice, uint256 endPrice)
openAuctionUnrestricted
nonpayablefunction openAuctionUnrestricted(uint256 auctionId)
poke
nonpayablefunction poke()
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address[] assets, uint256[] minAmountsOut) returns (uint256[] _amounts)
removeFromBasket
nonpayablefunction removeFromBasket(address token)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setAuctionDelay
nonpayablefunction setAuctionDelay(uint256 _newDelay)
setAuctionLength
nonpayablefunction setAuctionLength(uint256 _newLength)
setDustAmount
nonpayablefunction setDustAmount(address token, uint256 newDustAmount)
setFeeRecipients
nonpayablefunction setFeeRecipients(tuple[] _newRecipients)
setMandate
nonpayablefunction setMandate(string _newMandate)
setMintFee
nonpayablefunction setMintFee(uint256 _newFee)
setTVLFee
nonpayablefunction setTVLFee(uint256 _newFee)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
AuctionApproved
event AuctionApproved(uint256 indexed auctionId, address indexed from, address indexed to, (uint256 id, address sellToken, address buyToken, (uint256 spot, uint256 low, uint256 high) sellLimit, (uint256 spot, uint256 low, uint256 high) buyLimit, (uint256 start, uint256 end) prices, uint256 restrictedUntil, uint256 launchDeadline, uint256 startTime, uint256 endTime, uint256 k) auction, ((uint256 start, uint256 end) initialPrices, uint256 availableRuns) details)
AuctionBid
event AuctionBid(uint256 indexed auctionId, uint256 sellAmount, uint256 buyAmount)
AuctionClosed
event AuctionClosed(uint256 indexed auctionId)
AuctionDelaySet
event AuctionDelaySet(uint256 newAuctionDelay)
AuctionLengthSet
event AuctionLengthSet(uint256 newAuctionLength)
AuctionOpened
event AuctionOpened(uint256 indexed auctionId, (uint256 id, address sellToken, address buyToken, (uint256 spot, uint256 low, uint256 high) sellLimit, (uint256 spot, uint256 low, uint256 high) buyLimit, (uint256 start, uint256 end) prices, uint256 restrictedUntil, uint256 launchDeadline, uint256 startTime, uint256 endTime, uint256 k) auction, uint256 runsRemaining)
BasketTokenAdded
event BasketTokenAdded(address indexed token)
BasketTokenRemoved
event BasketTokenRemoved(address indexed token)
DustAmountSet
event DustAmountSet(address token, uint256 newDustAmount)
FeeRecipientsSet
event FeeRecipientsSet((address recipient, uint96 portion)[] recipients)
FolioDeprecated
event FolioDeprecated()
FolioFeePaid
event FolioFeePaid(address indexed recipient, uint256 amount)
Initialized
event Initialized(uint64 version)
MandateSet
event MandateSet(string newMandate)
MintFeeSet
event MintFeeSet(uint256 newFee)
ProtocolFeePaid
event ProtocolFeePaid(address indexed recipient, uint256 amount)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
TVLFeeSet
event TVLFeeSet(uint256 newFee, uint256 feeAnnually)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
Folio__AuctionCannotBeOpenedWithoutRestriction
error Folio__AuctionCannotBeOpenedWithoutRestriction()
Folio__AuctionCannotBeOpenedYet
error Folio__AuctionCannotBeOpenedYet()
Folio__AuctionCollision
error Folio__AuctionCollision()
Folio__AuctionNotOngoing
error Folio__AuctionNotOngoing()
Folio__AuctionTimeout
error Folio__AuctionTimeout()
Folio__BadFeeTotal
error Folio__BadFeeTotal()
Folio__BalanceNotDust
error Folio__BalanceNotDust()
Folio__BasketModificationFailed
error Folio__BasketModificationFailed()
Folio__EmptyAssets
error Folio__EmptyAssets()
Folio__ExcessiveBid
error Folio__ExcessiveBid()
Folio__FeeRecipientInvalidAddress
error Folio__FeeRecipientInvalidAddress()
Folio__FeeRecipientInvalidFeeShare
error Folio__FeeRecipientInvalidFeeShare()
Folio__FolioDeprecated
error Folio__FolioDeprecated()
Folio__InsufficientBalance
error Folio__InsufficientBalance()
Folio__InsufficientBid
error Folio__InsufficientBid()
Folio__InsufficientSharesOut
error Folio__InsufficientSharesOut()
Folio__InvalidArrayLengths
error Folio__InvalidArrayLengths()
Folio__InvalidAsset
error Folio__InvalidAsset()
Folio__InvalidAssetAmount
error Folio__InvalidAssetAmount(address asset)
Folio__InvalidAuctionDelay
error Folio__InvalidAuctionDelay()
Folio__InvalidAuctionLength
error Folio__InvalidAuctionLength()
Folio__InvalidAuctionRuns
error Folio__InvalidAuctionRuns()
Folio__InvalidAuctionTokens
error Folio__InvalidAuctionTokens()
Folio__InvalidAuctionTTL
error Folio__InvalidAuctionTTL()
Folio__InvalidBuyLimit
error Folio__InvalidBuyLimit()
Folio__InvalidPrices
error Folio__InvalidPrices()
Folio__InvalidSellLimit
error Folio__InvalidSellLimit()
Folio__MintFeeTooHigh
error Folio__MintFeeTooHigh()
Folio__SlippageExceeded
error Folio__SlippageExceeded()
Folio__TooManyFeeRecipients
error Folio__TooManyFeeRecipients()
Folio__TVLFeeTooHigh
error Folio__TVLFeeTooHigh()
Folio__TVLFeeTooLow
error Folio__TVLFeeTooLow()
Folio__Unauthorized
error Folio__Unauthorized()
Folio__ZeroInitialShares
error Folio__ZeroInitialShares()
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
PRBMath_MulDiv18_Overflow
error PRBMath_MulDiv18_Overflow(uint256 x, uint256 y)
PRBMath_UD60x18_Log_InputTooSmall
error PRBMath_UD60x18_Log_InputTooSmall(uint256 x)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x6080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615b95806100d96000396000f3fe608060405234801561001057600080fd5b50600436106103f15760003560e01c80637aeaafb311610215578063a9059cbb11610125578063ca15c873116100b8578063dd62ed3e11610087578063dd62ed3e14610949578063e1e7bd591461095c578063eddd0d9c1461096f578063f33a4dd914610982578063fc5284821461099557600080fd5b8063ca15c873146108fd578063cb4f14ba14610910578063d17618bf14610923578063d547741f1461093657600080fd5b8063b579605b116100f4578063b579605b146108cc578063bb57ad20146108df578063c4ec22ad146108e7578063c7178230146108f057600080fd5b8063a9059cbb14610870578063afb6de5114610883578063b0384a0b146108a3578063b200deda146108c357600080fd5b80639010d07c116101a85780639980cb23116101775780639980cb231461080f5780639f200bba146108225780639fa0bba414610835578063a217fddf14610848578063a3246ad31461085057600080fd5b80639010d07c146107c057806391d14854146107eb57806395d89b41146107fe578063979d50941461080657600080fd5b80638603d31a116101e45780638603d31a1461072857806389ab4e9a146107875780638a73d53c1461079a5780638cdf1288146107ad57600080fd5b80637aeaafb3146106f2578063820bc173146106fa578063834e630f1461070d578063836a10401461071557600080fd5b806336568abe11610310578063571a26a0116102a3578063647bec2511610272578063647bec251461067b57806370a08231146106835780637561e72c146106b9578063759e3d21146106e0578063783e93f0146106e957600080fd5b8063571a26a0146106165780635cf4ee91146106405780635dbb84e5146106535780636411fd1c1461066857600080fd5b806351fe9eff116102df57806351fe9eff14610595578063547d5f85146105cf57806354fd4d50146105e2578063558fe5421461060357600080fd5b806336568abe14610547578063374cbb2c1461055a57806339b1b96d1461056d57806339e0366e1461057557600080fd5b80631b3b547c11610388578063248a9ca311610357578063248a9ca3146105095780632f2ff15d1461051c578063313ce5671461052f578063325c25a21461053e57600080fd5b80631b3b547c1461049c5780631dda54b1146104bc578063236ed8f3146104e357806323b872dd146104f657600080fd5b8063095ea7b3116103c4578063095ea7b31461046257806313966db51461047557806318160ddd1461048c578063181783581461049457600080fd5b806301e1d114146103f657806301ffc9a71461041557806306fdde0314610438578063072c2f171461044d575b600080fd5b6103fe61099d565b60405161040c929190614c69565b60405180910390f35b610428610423366004614c8e565b610ae6565b604051901515815260200161040c565b610440610b11565b60405161040c9190614cb8565b61046061045b366004614d06565b610bd4565b005b610428610470366004614d34565b610c67565b61047e60065481565b60405190815260200161040c565b61047e610c7f565b610460610cd5565b61047e6104aa366004614d60565b60116020526000908152604090205481565b61047e7f2d8e650da9bd8c373ab2450d770f2ed39549bfc28d3630025cecc51511bcd37481565b6104606104f1366004614d06565b610cef565b610428610504366004614d7d565b610de1565b61047e610517366004614d06565b610e07565b61046061052a366004614dbe565b610e29565b6040516012815260200161040c565b61047e600f5481565b610460610555366004614dbe565b610e4b565b610460610568366004614d60565b610e83565b610440610eb8565b61047e610583366004614d60565b600d6020526000908152604090205481565b6105a86105a3366004614d06565b610f46565b604080516001600160a01b0390931683526001600160601b0390911660208301520161040c565b61047e6105dd366004614dee565b610f81565b6040805180820190915260058152640322e302e360dc1b6020820152610440565b610460610611366004614d34565b611189565b610629610624366004614d06565b6111d9565b60405161040c9b9a99989796959493929190614e10565b61047e61064e366004614dee565b6112a0565b61047e600080516020615b0983398151915281565b61047e610676366004614eb1565b6112cc565b6103fe61131c565b61047e610691366004614d60565b6001600160a01b03166000908152600080516020615b29833981519152602052604090205490565b61047e7f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df581565b61047e600e5481565b61047e60095481565b61046061133d565b610460610708366004614d06565b611381565b61047e6113a6565b6103fe610723366004614edd565b6113c2565b610767610736366004614d06565b6010602090815260009182526040918290208251808401909352805483526001810154918301919091526002015482565b60408051835181526020938401519381019390935282015260600161040c565b610460610795366004614f1c565b61165a565b6104606107a8366004614faa565b611d1c565b6104606107bb366004614d60565b6121e8565b6107d36107ce366004614dee565b6122f0565b6040516001600160a01b03909116815260200161040c565b6104286107f9366004614dbe565b61231f565b610440612357565b61047e60085481565b6000546107d3906001600160a01b031681565b610460610830366004615081565b612396565b610460610843366004614d06565b6123e0565b61047e600081565b61086361085e366004614d06565b6123fc565b60405161040c91906150c2565b61042861087e366004614d34565b612427565b61047e610891366004614d60565b600c6020526000908152604090205481565b6108b66108b1366004615119565b612435565b60405161040c91906151a8565b61047e60055481565b6104606108da366004614d06565b612600565b61046061261c565b61047e60075481565b600a546104289060ff1681565b61047e61090b366004614d06565b61282d565b61046061091e3660046151bb565b612853565b6103fe6109313660046151f6565b6129b2565b610460610944366004614dbe565b612a02565b61047e61095736600461521f565b612a1e565b61046061096a366004615309565b612a68565b61046061097d366004614d06565b612a84565b61047e6109903660046153b8565b612aa0565b600b5461047e565b6060806109b9600080516020615b698339815191525460021490565b156109d757604051633ee5aeb560e01b815260040160405180910390fd5b6109e16002613022565b8051909250806001600160401b038111156109fe576109fe61524d565b604051908082528060200260200182016040528015610a27578160200160208202803683370190505b50915060005b81811015610ae057838181518110610a4757610a4761541d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190615433565b838281518110610acd57610acd61541d565b6020908102919091010152600101610a2d565b50509091565b60006001600160e01b03198216635a05180f60e01b1480610b0b5750610b0b8261302f565b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace038054606091600080516020615b2983398151915291610b509061544c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7c9061544c565b8015610bc95780601f10610b9e57610100808354040283529160200191610bc9565b820191906000526020600020905b815481529060010190602001808311610bac57829003601f168201915b505050505091505090565b610bdc613064565b6000600b8281548110610bf157610bf161541d565b90600052602060002090601002019050600060106000848152602001908152602001600020905081600b0154421015610c3d576040516346f80f1f60e01b815260040160405180910390fd5b805460098301556001810154600a830155610c5a8282607861309c565b5050610c646133a0565b50565b600033610c758185856133b4565b5060019392505050565b6000806000610c8c6133c1565b915091508082610cba7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b610cc49190615496565b610cce9190615496565b9250505090565b610cdd613064565b610ce56136b1565b610ced6133a0565b565b610cf7613064565b610d0260003361231f565b80610d205750610d20600080516020615b098339815191523361231f565b80610d505750610d507f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df53361231f565b610d6d57604051637bdeee5360e11b815260040160405180910390fd5b610d786001426154a9565b600b8281548110610d8b57610d8b61541d565b60009182526020808320601092830201600e019390935583825290915260408082206002018290555182917fac4a907ec29adcc56774b757ecb1e1b4d597374fc9386107d05e2670259df7d391a2610c646133a0565b600033610def8582856136d0565b610dfa858585613730565b60019150505b9392505050565b6000908152600080516020615b49833981519152602052604090206001015490565b610e3282610e07565b610e3b8161378f565b610e458383613799565b50505050565b6001600160a01b0381163314610e745760405163334bd91960e11b815260040160405180910390fd5b610e7e82826137de565b505050565b6000610e8e8161378f565b610e978261381a565b610eb45760405163420aca6760e01b815260040160405180910390fd5b5050565b60018054610ec59061544c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef19061544c565b8015610f3e5780601f10610f1357610100808354040283529160200191610f3e565b820191906000526020600020905b815481529060010190602001808311610f2157829003601f168201915b505050505081565b60048181548110610f5657600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b90046001600160601b031682565b600080600b8481548110610f9757610f9761541d565b906000526020600020906010020190506000610fb1610c7f565b60018301546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110259190615433565b60028401546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190615433565b905060006110bc856003016000015485676765c793fa10079d601b1b6001613882565b905060008184116110ce5760006110d8565b6110d882856154a9565b905060006110fb876006016000015487676765c793fa10079d601b1b6000613882565b9050600081851061110d576000611117565b61111785836154a9565b90506f29c30f1029939b146664242d97d9f64960361b811115611144578298505050505050505050610b0b565b6000611150898c6138c6565b9050600061116c83676765c793fa10079d601b1b846000613882565b90506111788582613a12565b9d9c50505050505050505050505050565b61119460003361231f565b806111b257506111b2600080516020615b098339815191523361231f565b6111cf57604051637bdeee5360e11b815260040160405180910390fd5b610eb48282613a22565b600b81815481106111e957600080fd5b6000918252602091829020601091909102018054600182015460028301546040805160608082018352600387015482526004870154828901526005870154828401528251908101835260068701548152600787015481890152600887015481840152825180840190935260098701548352600a87015497830197909752600b860154600c870154600d880154600e890154600f90990154979a506001600160a01b039687169996909516979296939491939092908b565b6000610e00600b84815481106112b8576112b861541d565b9060005260206000209060100201836138c6565b6000806112f9600b86815481106112e5576112e561541d565b9060005260206000209060100201856138c6565b90506113138382676765c793fa10079d601b1b6001613882565b95945050505050565b60608061133561132e6012600a61559b565b60006129b2565b915091509091565b60006113488161378f565b600a805460ff191660011790556040517f0896631e72e873e636ab9ad7599a61ddc2f96c7961fa8e19e00a926e6512312390600090a150565b611389613064565b60006113948161378f565b61139d82613a7a565b50610c646133a0565b60008060006113b36133c1565b9092509050610cce8183615496565b6060806113cd613064565b600a5460ff16156113f15760405163539409e360e11b815260040160405180910390fd5b6113f96136b1565b600080546040516311a04fa160e11b8152306004820152829182916001600160a01b03909116906323409f4290602401608060405180830381865afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a91906155aa565b935093509350506000670de0b6b3a76400006001670de0b6b3a76400006006548c61149591906155e9565b61149f9190615496565b6114a991906154a9565b6114b39190615616565b90506000836001816114c588866155e9565b6114cf9190615496565b6114d991906154a9565b6114e39190615616565b90506000670de0b6b3a76400006001816114fd878f6155e9565b6115079190615496565b61151191906154a9565b61151b9190615616565b905080821061152a578161152c565b805b915081831061153b578261153d565b815b9250600061154b848d6154a9565b9050801580159061155c5750898110155b61157957604051632cf5f58f60e21b815260040160405180910390fd5b6115848c6001613ada565b8151919a50985060005b818110156115fd578981815181106115a8576115a861541d565b60200260200101516000146115f5576115f58b82815181106115cc576115cc61541d565b602002602001015133308d85815181106115e8576115e861541d565b6020026020010151613c0d565b60010161158e565b506116088c83613c74565b836008600082825461161a9190615496565b9091555061162a905084866154a9565b6009600082825461163b9190615496565b9250508190555050505050505050506116526133a0565b935093915050565b611662613064565b600080516020615b0983398151915261167a8161378f565b600a5460ff161561169e5760405163539409e360e11b815260040160405180910390fd5b6001600160a01b038816158015906116be57506001600160a01b03871615155b80156116dc5750866001600160a01b0316886001600160a01b031614155b6116f957604051632537aa5160e21b815260040160405180910390fd5b6f29c30f1029939b146664242d97d9f64960361b86604001351115801561172557508535602087013511155b801561173657508535604087013510155b611753576040516370fd6d8f60e01b815260040160405180910390fd5b60208501351580159061177d57506f29c30f1029939b146664242d97d9f64960361b856040013511155b801561178e57508435602086013511155b801561179f57508435604086013510155b6117bc5760405163369466a560e01b815260040160405180910390fd5b6020840135843510156117e257604051632bd7554760e21b815260040160405180910390fd5b6224ea0083111561180657604051634ec55c1960e11b815260040160405180910390fd5b816000036118265760405162acb91f60e11b815260040160405180910390fd5b6001600160a01b0387166000908152600c60205260409020544211801561186457506001600160a01b0388166000908152600d602052604090205442115b611881576040516302d19ba360e31b815260040160405180910390fd5b600061188d8442615496565b6001600160a01b038a166000908152600c60205260409020549091506118b39082613caa565b6001600160a01b03808b166000908152600c6020908152604080832094909455918b168152600d90915220546118e99082613caa565b6001600160a01b03808a166000818152600d6020908152604080832095909555845161016081018652600b548152938e16908401529282015260608101611935368b90038b018b61562a565b8152602001611949368a90038a018a61562a565b815260200160405180604001604052806000815260200160008152508152602001600e54426119789190615496565b815260208082018590526000604080840182905260608085018390526080948501839052600b8054600181018255908452865160109091027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9810191909155868501517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba820180546001600160a01b039283166001600160a01b031991821617909155888501517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb840180549190931691161790559086015180517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc830155808501517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbd8301558201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbe8201559385015180517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbf860155808401517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc08601558101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc185015560a085015180517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc2860155909201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc384015560c08401517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc484015560e08401517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc58401556101008401517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc68401556101208401517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc78401556101408401517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dc89093019290925580518082019091529192509080611c82368a90038a018a615689565b815260209081018790528351600090815260108252604090819020835180518255830151600182015591830151600290920191909155835190519192506001600160a01b03808d1692908e1691907f4748ea993957a820f165b4e9026aecb155d4b5bd4d3e986821c56353a616047590611cff90879087906156de565b60405180910390a450505050611d136133a0565b50505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015611d615750825b90506000826001600160401b03166001148015611d7d5750303b155b905081158015611d8b575080155b15611da95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611dd357845460ff60401b1916600160401b1785555b611e5c611de08a806157c8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e229250505060208c018c6157c8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613cba92505050565b611e64613ccc565b611e6c613ccc565b611e74613cd4565b611eda611e8460408a018a61580e565b808060200260200160405190810160405280939291908181526020016000905b82821015611ed057611ec160408302860136819003810190615857565b81526020019060010190611ea4565b5050505050613ce4565b611ee78860600135613f0e565b611ef48860800135614047565b611efe8835613a7a565b611f0b88602001356140a4565b611f55611f1b60a08a018a6157c8565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061410a92505050565b600080546001600160a01b0319166001600160a01b03881617815560808a01359003611f9457604051631f6d979160e11b815260040160405180910390fd5b6000611fa360408b018b615873565b9050905080600003611fc85760405163e9eaf68960e01b815260040160405180910390fd5b60005b81811015612177576000611fe260408d018d615873565b83818110611ff257611ff261541d565b90506020020160208101906120079190614d60565b6001600160a01b03160361202e5760405163445e1f2b60e11b815260040160405180910390fd5b600061203d60408d018d615873565b8381811061204d5761204d61541d565b90506020020160208101906120629190614d60565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156120a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cc9190615433565b90508015156120de60408e018e615873565b848181106120ee576120ee61541d565b90506020020160208101906121039190614d60565b9061213257604051631b58637360e21b81526001600160a01b0390911660048201526024015b60405180910390fd5b5061216d61214360408e018e615873565b848181106121535761215361541d565b90506020020160208101906121689190614d60565b61381a565b5050600101611fcb565b504260075561218a8860808c0135613c74565b612195600033613799565b505083156121dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b60006121f38161378f565b6121fb613064565b6040516370a0823160e01b8152306004820152600090612285906001600160a01b038516906370a0823190602401602060405180830381865afa158015612246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226a9190615433565b676765c793fa10079d601b1b61227e610c7f565b6001613882565b6001600160a01b0384166000908152601160205260409020549091508111156122c15760405163d11f763f60e01b815260040160405180910390fd5b6122ca83614146565b6122e75760405163420aca6760e01b815260040160405180910390fd5b50610eb46133a0565b6000828152600080516020615ae98339815191526020819052604082206123179084614187565b949350505050565b6000918252600080516020615b49833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace048054606091600080516020615b2983398151915291610b509061544c565b60006123a18161378f565b610e7e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061410a92505050565b60006123eb8161378f565b6123f361261c565b610eb482613f0e565b6000818152600080516020615ae98339815191526020819052604090912060609190610e0090613022565b600033610c75818585613730565b606061243f613064565b6124476136b1565b6060612454886000613ada565b925090506124623389614193565b8051858114801561247257508084145b61248f57604051635feae2b760e01b815260040160405180910390fd5b60005b818110156125eb578787828181106124ac576124ac61541d565b90506020020160208101906124c19190614d60565b6001600160a01b03168382815181106124dc576124dc61541d565b60200260200101516001600160a01b03161461250b5760405163445e1f2b60e11b815260040160405180910390fd5b85858281811061251d5761251d61541d565b905060200201358482815181106125365761253661541d565b602002602001015110158382815181106125525761255261541d565b60200260200101519061258457604051631b58637360e21b81526001600160a01b039091166004820152602401612129565b508381815181106125975761259761541d565b60200260200101516000146125e3576125e38382815181106125bb576125bb61541d565b60200260200101518a8684815181106125d6576125d661541d565b60200260200101516141c9565b600101612492565b5050506125f66133a0565b9695505050505050565b612608613064565b60006126138161378f565b61139d826140a4565b612624613064565b61262c6136b1565b60098054600091829055600454909190815b81811015612739576000670de0b6b3a7640000600483815481106126645761266461541d565b60009182526020909120015461268a90600160a01b90046001600160601b0316876155e9565b6126949190615616565b90506126a08185615496565b93506126d3600483815481106126b8576126b861541d565b6000918252602090912001546001600160a01b031682613c74565b600482815481106126e6576126e661541d565b600091825260209182902001546040518381526001600160a01b03909116917f168a65529db3a11aa555b702a0e4594e364bfeebed05918eeb405d36e744fa51910160405180910390a25060010161263e565b506000828460085461274b9190615496565b61275591906154a9565b600080546040516311a04fa160e11b815230600482015292935090916001600160a01b03909116906323409f4290602401608060405180830381865afa1580156127a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c791906155aa565b50505090506127d68183613c74565b806001600160a01b03167fb87e607f6030a23ed9b7dac1a717610f3a3b07325269f18808ba763bdcefe7ae8360405161281191815260200190565b60405180910390a25050600060085550610ced91506133a09050565b6000818152600080516020615ae9833981519152602081905260408220610e00906141fa565b61285b613064565b7f13ff1b2625181b311f257c723b5e6d366eb318b212d9dd694c48fcf227659df56128858161378f565b6000600b878154811061289a5761289a61541d565b600091825260208083208a84526010918290526040909320805492909102909201925085108015906128d0575060018101548410155b80156128f15750805415806128f1575080546128ed9060646155e9565b8511155b61290e57604051632bd7554760e21b815260040160405180910390fd5b60048201548710801590612926575060058201548711155b612943576040516370fd6d8f60e01b815260040160405180910390fd5b6007820154861080159061295b575060088201548611155b6129785760405163369466a560e01b815260040160405180910390fd5b600382018790556006820186905560098201859055600a82018490556129a08282600061309c565b5050506129ab6133a0565b5050505050565b6060806129ce600080516020615b698339815191525460021490565b156129ec57604051633ee5aeb560e01b815260040160405180910390fd5b6129f68484613ada565b915091505b9250929050565b612a0b82610e07565b612a148161378f565b610e4583836137de565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6000612a738161378f565b612a7b61261c565b610eb482613ce4565b6000612a8f8161378f565b612a9761261c565b610eb482614047565b6000612aaa613064565b600a5460ff1615612ace5760405163539409e360e11b815260040160405180910390fd5b6000600b8881548110612ae357612ae361541d565b906000526020600020906010020190506000612aff82426138c6565b9050612b198882676765c793fa10079d601b1b6001613882565b9250868311158015612b2a57508215155b612b47576040516376904b2d60e01b815260040160405180910390fd5b506000612b52610c7f565b60018301546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc69190615433565b90506000612be9846003016000015484676765c793fa10079d601b1b6001613882565b90506000818311612bfb576000612c05565b612c0582846154a9565b9050808b1115612c28576040516366d3726760e11b815260040160405180910390fd5b6002850154612c3f906001600160a01b031661381a565b506001850154612c59906001600160a01b0316338d6141c9565b604080518c8152602081018890528d917f6110599fef1b0aac49ca735ecbf5651784cdf9e35aa5fe703d48dc3d3b64e851910160405180910390a260018501546040516370a0823160e01b8152306004820152600091612d1d916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d099190615433565b676765c793fa10079d601b1b876001613882565b60018701546001600160a01b03166000908152601160205260409020549091508111612d4a576000612d71565b60018601546001600160a01b0316600090815260116020526040902054612d7190826154a9565b60038701549091508111612dc357612d8a6001426154a9565b600e87015560008d8152601060205260408120600201819055819003612dc3576001860154612dc1906001600160a01b0316614146565b505b8915612f465760028601546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e389190615433565b6002880154604051633886eee760e11b8152919250339163710dddce91612e73916001600160a01b03909116908c908f908f906004016158bc565b600060405180830381600087803b158015612e8d57600080fd5b505af1158015612ea1573d6000803e3d6000fd5b5050505060028701546040516370a0823160e01b8152306004820152899183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f179190615433565b612f2191906154a9565b1015612f4057604051633442e5f760e01b815260040160405180910390fd5b50612f60565b6002860154612f60906001600160a01b031633308a613c0d565b6000612f81876006016000015487676765c793fa10079d601b1b6000613882565b60028801546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff49190615433565b1115613013576040516336d6288f60e11b815260040160405180910390fd5b505050505050506125f66133a0565b60606000610e0083614204565b60006001600160e01b03198216637965db0b60e01b1480610b0b57506301ffc9a760e01b6001600160e01b0319831614610b0b565b600080516020615b6983398151915280546001190161309657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b600a5460ff16156130c05760405163539409e360e11b815260040160405180910390fd5b8083600e01546130d09190615496565b42116130ef5760405163a355a51360e01b815260040160405180910390fd5b82600c0154421115613114576040516396af9bb360e01b815260040160405180910390fd5b6000600f54426131249190615496565b60018501546001600160a01b03166000908152600c602052604090205490915061314e9082613caa565b60018501546001600160a01b039081166000908152600c602090815260408083209490945560028801549092168152600d909152205461318e9082613caa565b60028501546001600160a01b03166000908152600d6020526040902055600a8401546009850154108015906131c65750600a84015415155b80156131e9575060098401546f29c30f1029939b146664242d97d9f64960361b10155b801561320c5750600a8401546009850154633b9aca009161320991615616565b11155b61322957604051632bd7554760e21b815260040160405180910390fd5b826002015460000361324d5760405162acb91f60e11b815260040160405180910390fd5b6002838101805460001901815542600d8701819055600e8701849055865491546040805184815260018a01546001600160a01b039081166020830152958a0154909516908501526003880154606085015260048801546080850152600588015460a0850152600688015460c0850152600788015460e085015260088801546101008501526009880154610120850152600a880154610140850152600b880154610160850152600c8801546101808501526101a08401919091526101c08301849052600f8701546101e0840152610200830152907f141fb8cd64933789f8f0c349fb279430bdf2b17e78bf8147bb3a0b0269c0609a906102200160405180910390a2600f54600a8501546009860154613388916133859161337690670de0b6b3a7640000906155e9565b6133809190615616565b614260565b90565b6133929190615616565b84600f018190555050505050565b6001600080516020615b6983398151915255565b610e7e8383836001614295565b600854600954600081836133f37f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b6133fd9190615496565b6134079190615496565b905060006007544261341991906154a9565b600080546040516311a04fa160e11b81523060048201529293509091829182916001600160a01b03909116906323409f4290602401608060405180830381865afa15801561346b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348f91906155aa565b93509350935050600073761ef3626e70100f0e33d14412c7f73d23036689632e4c697f83670de0b6b3a76400006134c691906154a9565b6040516001600160e01b031960e084901b16815260048101919091526407620d06ef6024820152604401602060405180830381865af415801561350d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135319190615433565b61354390670de0b6b3a76400006154a9565b9050600060055482116135585760055461355a565b815b905060008761357e6133858961357886670de0b6b3a76400006154a9565b9061437c565b613590670de0b6b3a76400008b6155e9565b61359a9190615616565b6135a491906154a9565b90506000826001816135be670de0b6b3a7640000886155e9565b6135c89190615496565b6135d291906154a9565b6135dc9190615616565b90506000866001816135f6670de0b6b3a76400008c6155e9565b6136009190615496565b61360a91906154a9565b6136149190615616565b821161364b57866001816136288b876155e9565b6136329190615496565b61363c91906154a9565b6136469190615616565b61367f565b670de0b6b3a764000060018161366185876155e9565b61366b9190615496565b61367591906154a9565b61367f9190615616565b905061368b818d615496565b9b5061369781846154a9565b6136a1908c615496565b9a50505050505050505050509091565b42600754036136bc57565b6136c46133c1565b60095560085542600755565b60006136dc8484612a1e565b90506000198114610e45578181101561372157604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401612129565b610e4584848484036000614295565b6001600160a01b03831661375a57604051634b637e8f60e11b815260006004820152602401612129565b6001600160a01b0382166137845760405163ec442f0560e01b815260006004820152602401612129565b610e7e8383836143dc565b610c64813361451a565b6000600080516020615ae9833981519152816137b58585614553565b905080156123175760008581526020839052604090206137d590856145f8565b50949350505050565b6000600080516020615ae9833981519152816137fa858561460d565b905080156123175760008581526020839052604090206137d59085614689565b60006001600160a01b0382166138435760405163445e1f2b60e11b815260040160405180910390fd5b6040516001600160a01b038316907f59b7c8b22741836fc393dc21baa2e8157e039b28c3ee59310f38b2847a2dd29c90600090a2610b0b6002836145f8565b60006138b16138908361469e565b80156138ac5750600084806138a7576138a7615600565b868809115b151590565b6138bc8686866146cb565b6113139190615496565b600082600d015482101580156138e0575082600e01548211155b6138fd576040516328b38be160e21b815260040160405180910390fd5b82600d0154820361391357506009820154610b0b565b82600e015482036139295750600a820154610b0b565b600083600d01548361393b91906154a9565b9050670de0b6b3a764000073761ef3626e70100f0e33d14412c7f73d2303668963e46751e38387600f015461397091906155e9565b61397c90600019615904565b6040518263ffffffff1660e01b815260040161399a91815260200190565b602060405180830381865af41580156139b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139db9190615433565b60098601546139ea91906155e9565b6139f49190615616565b600a850154909250821015613a0b57600a84015491505b5092915050565b6000828218828410028218610e00565b6001600160a01b038216600081815260116020908152604091829020849055815192835282018390527f12ce30b647b329ea4f13f72afd80a6733e5fd2c12fe447478bfa2b0ac68bae42910160405180910390a15050565b62093a80811115613a9e5760405163f930754160e01b815260040160405180910390fd5b600e8190556040518181527fe01ac977c7cf5139f7266e22982c26d93b492fd614f2bc12012540e81ff60e71906020015b60405180910390a150565b6060806000613ae7610c7f565b9050613af36002613022565b8051909350806001600160401b03811115613b1057613b1061524d565b604051908082528060200260200182016040528015613b39578160200160208202803683370190505b50925060005b81811015613c03576000858281518110613b5b57613b5b61541d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bcf9190615433565b9050613bdd8882868a613882565b858381518110613bef57613bef61541d565b602090810291909101015250600101613b3f565b5050509250929050565b6040516001600160a01b038481166024830152838116604483015260648201839052610e459186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614786565b6001600160a01b038216613c9e5760405163ec442f0560e01b815260006004820152602401612129565b610eb4600083836143dc565b6000828218828411028218610e00565b613cc26147f7565b610eb48282614840565b610ced6147f7565b613cdc6147f7565b610ced614891565b7fb8dde4be9101cab9d9d994925b7817605b5ce5834e63618484b8b4e5bef6a54881604051613d139190615934565b60405180910390a160045460005b81811015613d5a576004805480613d3a57613d3a615995565b600082815260208120820160001990810191909155019055600101613d21565b508151905080600003613d6b575050565b6040811115613d8d57604051636516935760e11b815260040160405180910390fd5b60008060005b83811015613ee557826001600160a01b0316858281518110613db757613db761541d565b6020026020010151600001516001600160a01b031611613dea576040516341dc215f60e11b815260040160405180910390fd5b848181518110613dfc57613dfc61541d565b6020026020010151602001516001600160601b0316600003613e315760405163011becf960e01b815260040160405180910390fd5b848181518110613e4357613e4361541d565b6020026020010151602001516001600160601b031682613e639190615496565b9150848181518110613e7757613e7761541d565b60200260200101516000015192506004858281518110613e9957613e9961541d565b602090810291909101810151825460018181018555600094855293839020825192909301516001600160601b0316600160a01b026001600160a01b039092169190911791015501613d93565b50670de0b6b3a76400008114610e455760405163f79b6e4960e01b815260040160405180910390fd5b67016345785d8a0000811115613f37576040516302aec4d160e11b815260040160405180910390fd5b73761ef3626e70100f0e33d14412c7f73d23036689632e4c697f613f6383670de0b6b3a76400006154a9565b6040516001600160e01b031960e084901b16815260048101919091526407620d06ef6024820152604401602060405180830381865af4158015613faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fce9190615433565b613fe090670de0b6b3a76400006154a9565b600555801580613ff1575060055415155b61400e57604051637c379aa760e11b815260040160405180910390fd5b60055460408051918252602082018390527f504285076b3e8a5b35bb309459af128be9f7cf48f7aab9e599332a1e79cb541e9101613acf565b66b1a2bc2ec5000081111561406f5760405163330e445d60e01b815260040160405180910390fd5b60068190556040518181527f97aee230ba41961438e908e115df76fa8113f85a0586d85b19ba5be50e6a227490602001613acf565b603c81101580156140b8575062093a808111155b6140d55760405163bb80f28f60e01b815260040160405180910390fd5b600f8190556040518181527f99578d7fe3e20e279feceaa076eb8032d475ca1a49391ec0a740445152a5971390602001613acf565b600161411682826159f2565b507f7332b59e42a46838955f2abeac0a553dd3870441c46bbfb13728d9b2cc5fb6d481604051613acf9190614cb8565b6040516000906001600160a01b038316907f4e3a022fa7a66b1e055fe6b819a1afe69dc1d44c43de4af7b32f095e603884ae908390a2610b0b600283614689565b6000610e008383614899565b6001600160a01b0382166141bd57604051634b637e8f60e11b815260006004820152602401612129565b610eb4826000836143dc565b6040516001600160a01b03838116602483015260448201839052610e7e91859182169063a9059cbb90606401613c42565b6000610b0b825490565b60608160000180548060200260200160405190810160405280929190818152602001828054801561425457602002820191906000526020600020905b815481526020019060010190808311614240575b50505050509050919050565b6000610b0b6714057b7ef767814f670de0b6b3a7640000614283613385866148c3565b028161429157614291615600565b0490565b600080516020615b298339815191526001600160a01b0385166142ce5760405163e602df0560e01b815260006004820152602401612129565b6001600160a01b0384166142f857604051634a1406b160e11b815260006004820152602401612129565b6001600160a01b038086166000908152600183016020908152604080832093881683529290522083905581156129ab57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161436d91815260200190565b60405180910390a35050505050565b600082816001841661439657670de0b6b3a7640000614398565b815b9050600184901c93505b83156143d6576143b282836149f2565b915060018416156143ca576143c781836149f2565b90505b600184901c93506143a2565b80611313565b600080516020615b298339815191526001600160a01b038416614418578181600201600082825461440d9190615496565b9091555061448a9050565b6001600160a01b0384166000908152602082905260409020548281101561446b5760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401612129565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b0383166144a85760028101805483900390556144c7565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161450c91815260200190565b60405180910390a350505050565b614524828261231f565b610eb45760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401612129565b6000600080516020615b4983398151915261456e848461231f565b6145ee576000848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556145a43390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610b0b565b6000915050610b0b565b6000610e00836001600160a01b038416614aa8565b6000600080516020615b49833981519152614628848461231f565b156145ee576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610b0b565b6000610e00836001600160a01b038416614af7565b600060028260038111156146b4576146b4615ab0565b6146be9190615ac6565b60ff166001149050919050565b6000838302816000198587098281108382030391505080600003614702578382816146f8576146f8615600565b0492505050610e00565b808411614719576147196003851502601118614be0565b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600080602060008451602086016000885af1806147a9576040513d6000823e3d81fd5b50506000513d915081156147c15780600114156147ce565b6001600160a01b0384163b155b15610e4557604051635274afe760e01b81526001600160a01b0385166004820152602401612129565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610ced57604051631afcd79f60e31b815260040160405180910390fd5b6148486147f7565b600080516020615b298339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361488284826159f2565b5060048101610e4583826159f2565b6133a06147f7565b60008260000182815481106148b0576148b061541d565b9060005260206000200154905092915050565b600081670de0b6b3a76400008110156148f25760405163036d32ef60e41b815260048101849052602401612129565b600061497d670de0b6b3a7640000830460016fffffffffffffffffffffffffffffffff821160071b91821c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211871b91821c969096119490961792909217171791909117919091171790565b9050670de0b6b3a7640000810282821c670de0b6b3a763ffff1981016149a357816125f6565b671bc16d674ec800006706f05b59d3b200005b80156149e657670de0b6b3a76400008380020492508183106149de579283019260019290921c915b60011c6149b6565b50919695505050505050565b6000808060001984860984860292508281108382030391505080600003614a265750670de0b6b3a764000090049050610b0b565b670de0b6b3a76400008110614a5857604051635173648d60e01b81526004810186905260248101859052604401612129565b6000670de0b6b3a764000085870962040000818503049310909103600160ee1b02919091177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690291505092915050565b6000818152600183016020526040812054614aef57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0b565b506000610b0b565b600081815260018301602052604081205480156145ee576000614b1b6001836154a9565b8554909150600090614b2f906001906154a9565b9050808214614b94576000866000018281548110614b4f57614b4f61541d565b9060005260206000200154905080876000018481548110614b7257614b7261541d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614ba557614ba5615995565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b0b565b634e487b71600052806020526024601cfd5b600081518084526020840193506020830160005b82811015614c2d5781516001600160a01b0316865260209586019590910190600101614c06565b5093949350505050565b600081518084526020840193506020830160005b82811015614c2d578151865260209586019590910190600101614c4b565b604081526000614c7c6040830185614bf2565b82810360208401526113138185614c37565b600060208284031215614ca057600080fd5b81356001600160e01b031981168114610e0057600080fd5b602081526000825180602084015260005b81811015614ce65760208186018101516040868401015201614cc9565b506000604082850101526040601f19601f83011684010191505092915050565b600060208284031215614d1857600080fd5b5035919050565b6001600160a01b0381168114610c6457600080fd5b60008060408385031215614d4757600080fd5b8235614d5281614d1f565b946020939093013593505050565b600060208284031215614d7257600080fd5b8135610e0081614d1f565b600080600060608486031215614d9257600080fd5b8335614d9d81614d1f565b92506020840135614dad81614d1f565b929592945050506040919091013590565b60008060408385031215614dd157600080fd5b823591506020830135614de381614d1f565b809150509250929050565b60008060408385031215614e0157600080fd5b50508035926020909101359150565b8b81526001600160a01b038b811660208301528a1660408201526102008101614e50606083018b8051825260208082015190830152604090810151910152565b885160c0830152602089015160e08301526040890151610100830152875161012083015260208801516101408301526101608201969096526101808101949094526101a08401929092526101c08301526101e0909101529695505050505050565b600080600060608486031215614ec657600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215614ef257600080fd5b833592506020840135614dad81614d1f565b600060608284031215614f1657600080fd5b50919050565b6000806000806000806000878903610180811215614f3957600080fd5b8835614f4481614d1f565b97506020890135614f5481614d1f565b9650614f638a60408b01614f04565b9550614f728a60a08b01614f04565b9450604060ff1982011215614f8657600080fd5b50959894975092959194505061010081019261014082013592506101609091013590565b60008060008060808587031215614fc057600080fd5b84356001600160401b03811115614fd657600080fd5b850160a08188031215614fe857600080fd5b935060208501356001600160401b0381111561500357600080fd5b850160c0818803121561501557600080fd5b9250604085013561502581614d1f565b9150606085013561503581614d1f565b939692955090935050565b60008083601f84011261505257600080fd5b5081356001600160401b0381111561506957600080fd5b6020830191508360208285010111156129fb57600080fd5b6000806020838503121561509457600080fd5b82356001600160401b038111156150aa57600080fd5b6150b685828601615040565b90969095509350505050565b602081526000610e006020830184614bf2565b60008083601f8401126150e757600080fd5b5081356001600160401b038111156150fe57600080fd5b6020830191508360208260051b85010111156129fb57600080fd5b6000806000806000806080878903121561513257600080fd5b86359550602087013561514481614d1f565b945060408701356001600160401b0381111561515f57600080fd5b61516b89828a016150d5565b90955093505060608701356001600160401b0381111561518a57600080fd5b61519689828a016150d5565b979a9699509497509295939492505050565b602081526000610e006020830184614c37565b600080600080600060a086880312156151d357600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561520957600080fd5b82359150602083013560048110614de357600080fd5b6000806040838503121561523257600080fd5b823561523d81614d1f565b91506020830135614de381614d1f565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156152855761528561524d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156152b3576152b361524d565b604052919050565b6000604082840312156152cd57600080fd5b6152d5615263565b905081356152e281614d1f565b815260208201356001600160601b03811681146152fe57600080fd5b602082015292915050565b60006020828403121561531b57600080fd5b81356001600160401b0381111561533157600080fd5b8201601f8101841361534257600080fd5b80356001600160401b0381111561535b5761535b61524d565b61536a60208260051b0161528b565b8082825260208201915060208360061b85010192508683111561538c57600080fd5b6020840193505b828410156125f6576153a587856152bb565b8252602082019150604084019350615393565b60008060008060008060a087890312156153d157600080fd5b863595506020870135945060408701359350606087013580151581146153f657600080fd5b925060808701356001600160401b0381111561541157600080fd5b61519689828a01615040565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561544557600080fd5b5051919050565b600181811c9082168061546057607f821691505b602082108103614f1657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610b0b57610b0b615480565b81810381811115610b0b57610b0b615480565b6001815b6001841115611652578085048111156154db576154db615480565b60018416156154e957908102905b60019390931c9280026154c0565b60008261550657506001610b0b565b8161551357506000610b0b565b816001811461552957600281146155335761554f565b6001915050610b0b565b60ff84111561554457615544615480565b50506001821b610b0b565b5060208310610133831016604e8410600b8410161715615572575081810a610b0b565b61557f60001984846154bc565b806000190482111561559357615593615480565b029392505050565b6000610e0060ff8416836154f7565b600080600080608085870312156155c057600080fd5b84516155cb81614d1f565b60208601516040870151606090970151919890975090945092505050565b8082028115828204841417610b0b57610b0b615480565b634e487b7160e01b600052601260045260246000fd5b60008261562557615625615600565b500490565b6000606082840312801561563d57600080fd5b50604051600090606081016001600160401b03811182821017156156635761566361524d565b604090815284358252602080860135908301529384013593810193909352509092915050565b6000604082840312801561569c57600080fd5b506156a5615263565b823581526020928301359281019290925250919050565b6156d182825180518252602090810151910152565b6020015160409190910152565b82518152602080840151610260830191615702908401826001600160a01b03169052565b50604084015161571d60408401826001600160a01b03169052565b50606084015161574460608401828051825260208082015190830152604090810151910152565b506080840151805160c0840152602081015160e084015260408101516101008401525060a0840151805161012084015260208101516101408401525060c084015161016083015260e08401516101808301526101008401516101a08301526101208401516101c08301526101408401516101e0830152610e006102008301846156bc565b6000808335601e198436030181126157df57600080fd5b8301803591506001600160401b038211156157f957600080fd5b6020019150368190038213156129fb57600080fd5b6000808335601e1984360301811261582557600080fd5b8301803591506001600160401b0382111561583f57600080fd5b6020019150600681901b36038213156129fb57600080fd5b60006040828403121561586957600080fd5b610e0083836152bb565b6000808335601e1984360301811261588a57600080fd5b8301803591506001600160401b038211156158a457600080fd5b6020019150600581901b36038213156129fb57600080fd5b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b80820260008212600160ff1b8414161561592057615920615480565b8181058314821517610b0b57610b0b615480565b602080825282518282018190526000918401906040840190835b8181101561598a57835180516001600160a01b031684526020908101516001600160601b0316818501529093019260409092019160010161594e565b509095945050505050565b634e487b7160e01b600052603160045260246000fd5b601f821115610e7e57806000526020600020601f840160051c810160208510156159d25750805b601f840160051c820191505b818110156129ab57600081556001016159de565b81516001600160401b03811115615a0b57615a0b61524d565b615a1f81615a19845461544c565b846159ab565b6020601f821160018114615a535760008315615a3b5750848201515b600019600385901b1c1916600184901b1784556129ab565b600084815260208120601f198516915b82811015615a835787850151825560209485019460019092019101615a63565b5084821015615aa15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b600060ff831680615ad957615ad9615600565b8060ff8416069150509291505056fec1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320002be23b023f3eee571adc019cdcf3f0bcf041151e6ff405a4bf0c4bfc6faea8c952c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081c000a