0 txs
159 calls
constructor
constructor()
functions
BASE_POINTS
viewfunction BASE_POINTS() view returns (uint256)
commitBalance
viewfunction commitBalance() view returns (uint256)
commitCancellableAt
viewfunction commitCancellableAt(uint256 commitId) view returns (uint256 cancellableAt)
commitCancellableTime
viewfunction commitCancellableTime() view returns (uint256)
commitIdByDigest
viewfunction commitIdByDigest(bytes32 commitDigest) view returns (uint256 commitId)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
FUNDS_RECEIVER_MANAGER_ROLE
viewfunction FUNDS_RECEIVER_MANAGER_ROLE() view returns (bytes32)
fundsReceiver
viewfunction fundsReceiver() view returns (address)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hashCommit
viewfunction hashCommit(tuple commit) view returns (bytes32)
hashFulfillment
purefunction hashFulfillment(bytes32 digest, address marketplace, uint256 orderAmount, bytes orderData, address token, uint256 tokenId, uint256 payoutAmount, uint8 choice) pure returns (bytes32)
hashPack
purefunction hashPack(uint8 packType, uint256 packPrice, tuple[] buckets) pure returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isCancelled
viewfunction isCancelled(uint256 commitId) view returns (bool cancelled)
isCosigner
viewfunction isCosigner(address cosigner) view returns (bool active)
isFulfilled
viewfunction isFulfilled(uint256 commitId) view returns (bool fulfilled)
MAX_BUCKETS
viewfunction MAX_BUCKETS() view returns (uint256)
maxPackPrice
viewfunction maxPackPrice() view returns (uint256)
maxPackRewardMultiplier
viewfunction maxPackRewardMultiplier() view returns (uint256)
maxReward
viewfunction maxReward() view returns (uint256)
MIN_BUCKETS
viewfunction MIN_BUCKETS() view returns (uint256)
MIN_COMMIT_CANCELLABLE_TIME
viewfunction MIN_COMMIT_CANCELLABLE_TIME() view returns (uint256)
MIN_NFT_FULFILLMENT_EXPIRY_TIME
viewfunction MIN_NFT_FULFILLMENT_EXPIRY_TIME() view returns (uint256)
minPackPrice
viewfunction minPackPrice() view returns (uint256)
minPackRewardMultiplier
viewfunction minPackRewardMultiplier() view returns (uint256)
minReward
viewfunction minReward() view returns (uint256)
nftFulfillmentExpiresAt
viewfunction nftFulfillmentExpiresAt(uint256 commitId) view returns (uint256 expiresAt)
nftFulfillmentExpiryTime
viewfunction nftFulfillmentExpiryTime() view returns (uint256)
onERC1155BatchReceived
purefunction onERC1155BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data) pure returns (bytes4)
onERC1155Received
purefunction onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes data) pure returns (bytes4)
onERC721Received
purefunction onERC721Received() pure returns (bytes4)
OPS_ROLE
viewfunction OPS_ROLE() view returns (bytes32)
packCount
viewfunction packCount(address receiver) view returns (uint256 counter)
packs
viewfunction packs(uint256) view returns (uint256 id, address receiver, address cosigner, uint256 seed, uint256 counter, uint256 packPrice, bytes32 packHash)
paused
viewfunction paused() view returns (bool)
PRNG
viewfunction PRNG() view returns (address)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
RESCUE_ROLE
viewfunction RESCUE_ROLE() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
treasuryBalance
viewfunction treasuryBalance() view returns (uint256)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
verify
viewfunction verify(bytes32 digest, bytes signature) view returns (address)
verifyCommit
viewfunction verifyCommit(tuple commit, bytes signature) view returns (address)
verifyHash
purefunction verifyHash(bytes32 hash, bytes signature) pure returns (address)
addCosigner
nonpayablefunction addCosigner(address cosigner_)
addOpsUser
nonpayablefunction addOpsUser(address user)
addRescueUser
nonpayablefunction addRescueUser(address user)
cancel
nonpayablefunction cancel(uint256 commitId_)
commit
payablefunction commit(address receiver_, address cosigner_, uint256 seed_, uint8 packType_, tuple[] buckets_, bytes signature_) payable returns (uint256)
emergencyWithdraw
nonpayablefunction emergencyWithdraw()
fulfill
payablefunction fulfill(uint256 commitId_, address marketplace_, bytes orderData_, uint256 orderAmount_, address token_, uint256 tokenId_, uint256 payoutAmount_, bytes commitSignature_, bytes fulfillmentSignature_, uint8 choice_) payable
fulfillByDigest
payablefunction fulfillByDigest(bytes32 commitDigest_, address marketplace_, bytes orderData_, uint256 orderAmount_, address token_, uint256 tokenId_, uint256 payoutAmount_, bytes commitSignature_, bytes fulfillmentSignature_, uint8 choice_) payable
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address initialOwner_, address fundsReceiver_, address prng_, address fundsReceiverManager_)
pause
nonpayablefunction pause()
removeCosigner
nonpayablefunction removeCosigner(address cosigner_)
removeOpsUser
nonpayablefunction removeOpsUser(address user)
removeRescueUser
nonpayablefunction removeRescueUser(address user)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
rescueERC1155
nonpayablefunction rescueERC1155(address token, address to, uint256 tokenId, uint256 amount)
rescueERC1155Batch
nonpayablefunction rescueERC1155Batch(address[] tokens, address[] tos, uint256[] tokenIds, uint256[] amounts)
rescueERC20
nonpayablefunction rescueERC20(address token, address to, uint256 amount)
rescueERC20Batch
nonpayablefunction rescueERC20Batch(address[] tokens, address[] tos, uint256[] amounts)
rescueERC721
nonpayablefunction rescueERC721(address token, address to, uint256 tokenId)
rescueERC721Batch
nonpayablefunction rescueERC721Batch(address[] tokens, address[] tos, uint256[] tokenIds)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setCommitCancellableTime
nonpayablefunction setCommitCancellableTime(uint256 commitCancellableTime_)
setFundsReceiver
nonpayablefunction setFundsReceiver(address fundsReceiver_)
setMaxPackPrice
nonpayablefunction setMaxPackPrice(uint256 maxPackPrice_)
setMaxPackRewardMultiplier
nonpayablefunction setMaxPackRewardMultiplier(uint256 maxPackRewardMultiplier_)
setMaxReward
nonpayablefunction setMaxReward(uint256 maxReward_)
setMinPackPrice
nonpayablefunction setMinPackPrice(uint256 minPackPrice_)
setMinPackRewardMultiplier
nonpayablefunction setMinPackRewardMultiplier(uint256 minPackRewardMultiplier_)
setMinReward
nonpayablefunction setMinReward(uint256 minReward_)
setNftFulfillmentExpiryTime
nonpayablefunction setNftFulfillmentExpiryTime(uint256 nftFulfillmentExpiryTime_)
transferAdmin
nonpayablefunction transferAdmin(address newAdmin)
transferFundsReceiverManager
nonpayablefunction transferFundsReceiverManager(address newFundsReceiverManager_)
unpause
nonpayablefunction unpause()
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
withdrawTreasury
nonpayablefunction withdrawTreasury(uint256 amount)
events
Commit
event Commit(address indexed sender, uint256 indexed commitId, address indexed receiver, address cosigner, uint256 seed, uint256 counter, uint256 packPrice, bytes32 packHash, bytes32 digest)
CommitCancellableTimeUpdated
event CommitCancellableTimeUpdated(uint256 oldCommitCancellableTime, uint256 newCommitCancellableTime)
CommitCancelled
event CommitCancelled(uint256 indexed commitId, bytes32 digest)
CosignerAdded
event CosignerAdded(address indexed cosigner)
CosignerRemoved
event CosignerRemoved(address indexed cosigner)
EIP712DomainChanged
event EIP712DomainChanged()
EmergencyWithdrawal
event EmergencyWithdrawal(address indexed sender, uint256 amount, address fundsReceiver)
ERC1155BatchRescued
event ERC1155BatchRescued(address[] tokens, address[] to, uint256[] tokenIds, uint256[] amounts)
ERC20BatchRescued
event ERC20BatchRescued(address[] tokens, address[] to, uint256[] amounts)
ERC721BatchRescued
event ERC721BatchRescued(address[] tokens, address[] to, uint256[] tokenIds)
ETHRescued
event ETHRescued(address to, uint256 amount)
Fulfillment
event Fulfillment(address indexed sender, uint256 indexed commitId, uint256 rng, uint256 odds, uint256 bucketIndex, uint256 payout, address token, uint256 tokenId, uint256 amount, address receiver, uint8 choice, uint8 fulfillmentType, bytes32 digest)
FundsReceiverManagerTransferred
event FundsReceiverManagerTransferred(address indexed oldFundsReceiverManager, address indexed newFundsReceiverManager)
FundsReceiverUpdated
event FundsReceiverUpdated(address indexed oldFundsReceiver, address indexed newFundsReceiver)
Initialized
event Initialized(uint64 version)
MaxPackPriceUpdated
event MaxPackPriceUpdated(uint256 oldMaxPackPrice, uint256 newMaxPackPrice)
MaxPackRewardMultiplierUpdated
event MaxPackRewardMultiplierUpdated(uint256 oldMaxPackRewardMultiplier, uint256 newMaxPackRewardMultiplier)
MaxRewardUpdated
event MaxRewardUpdated(uint256 oldMaxReward, uint256 newMaxReward)
MinPackPriceUpdated
event MinPackPriceUpdated(uint256 oldMinPackPrice, uint256 newMinPackPrice)
MinPackRewardMultiplierUpdated
event MinPackRewardMultiplierUpdated(uint256 oldMinPackRewardMultiplier, uint256 newMinPackRewardMultiplier)
MinRewardUpdated
event MinRewardUpdated(uint256 oldMinReward, uint256 newMinReward)
NftFulfillmentExpiryTimeUpdated
event NftFulfillmentExpiryTimeUpdated(uint256 oldNftFulfillmentExpiryTime, uint256 newNftFulfillmentExpiryTime)
Paused
event Paused(address account)
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)
TransferFailure
event TransferFailure(uint256 indexed commitId, address indexed receiver, uint256 amount, bytes32 digest)
TreasuryDeposit
event TreasuryDeposit(address indexed sender, uint256 amount)
TreasuryWithdrawal
event TreasuryWithdrawal(address indexed sender, uint256 amount, address fundsReceiver)
Unpaused
event Unpaused(address account)
Upgraded
event Upgraded(address indexed implementation)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AlreadyCosigner
error AlreadyCosigner()
AlreadyFulfilled
error AlreadyFulfilled()
ArrayLengthMismatch
error ArrayLengthMismatch()
BucketSelectionFailed
error BucketSelectionFailed()
CommitIsCancelled
error CommitIsCancelled()
CommitNotCancellable
error CommitNotCancellable()
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
EnforcedPause
error EnforcedPause()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
InitialOwnerCannotBeZero
error InitialOwnerCannotBeZero()
InsufficientBalance
error InsufficientBalance()
InvalidAddress
error InvalidAddress()
InvalidAmount
error InvalidAmount()
InvalidBuckets
error InvalidBuckets()
InvalidCommitCancellableTime
error InvalidCommitCancellableTime()
InvalidCommitId
error InvalidCommitId()
InvalidCommitOwner
error InvalidCommitOwner()
InvalidFundsReceiverManager
error InvalidFundsReceiverManager()
InvalidInitialization
error InvalidInitialization()
InvalidNftFulfillmentExpiryTime
error InvalidNftFulfillmentExpiryTime()
InvalidOwner
error InvalidOwner()
InvalidPackPrice
error InvalidPackPrice()
InvalidPackRewardMultiplier
error InvalidPackRewardMultiplier()
InvalidReward
error InvalidReward()
InvalidZeroAddress
error InvalidZeroAddress()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
TransferFailed
error TransferFailed()
Unauthorized
error Unauthorized()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
WithdrawalFailed
error WithdrawalFailed()
creation bytecode
0x60a060405234610743575f51602061586e5f395f51905f5254604081901c60ff1615906001600160401b03168015908161073b575b6001149081610731575b159081610728575b5061040f575f51602061586e5f395f51905f5280546001600160401b0319166001179055806106ee575b61007861097d565b61008133610747565b5061008b336107bd565b5061009533610850565b5061009e61097d565b60408051919082016001600160401b038111838210176105db57604090815260058352645061636b7360d81b60208401528051919082016001600160401b038111838210176105db5760405260018252603160f81b602083015261010061097d565b61010861097d565b61011061097d565b61011861097d565b82516001600160401b0381116105db575f51602061578e5f395f51905f5254600181811c911680156106e4575b60208210146105bd57601f8111610675575b506020601f82116001146105fa57819293945f926105ef575b50508160011b915f199060031b1c1916175f51602061578e5f395f51905f52555b81516001600160401b0381116105db575f5160206157ee5f395f51905f5254600181811c911680156105d1575b60208210146105bd57601f811161054e575b50602092601f82116001146104d557928192935f926104ca575b50508160011b915f199060031b1c1916175f5160206157ee5f395f51905f52555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015561025961097d565b61026161097d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00554780610474575b5060025f525f51602061584e5f395f51905f526020527fc9f481c22def2a4ce87eafcae72b21ebdae40df784b4fcdff1e5811e60e7a7175460ff16610465576001805460026001600160a01b0319821681179092556001600160a01b03167f8e72b2cf2be54e3a933095b67f13c3927802840d4808120dc36219da676d79175f80a35f80546001600160a01b03191660031790556103286108e3565b50662386f26fc10000600e55674563918244f40000600f55662386f26fc100006010556703782dace9d90000601155611388601255620493e06013556201518060065561025860085561041e575b306080525f51602061586e5f395f51905f525460ff8160401c1661040f576002600160401b03196001600160401b038216016103cc575b604051614da590816109a9823960805181818161271401526127a50152f35b6001600160401b0319166001600160401b039081175f51602061586e5f395f51905f52556040519081525f5160206157ce5f395f51905f5290602090a15f6103ad565b63f92ee8a960e01b5f5260045ffd5b68ff0000000000000000195f51602061586e5f395f51905f5254165f51602061586e5f395f51905f52555f5160206157ce5f395f51905f52602060405160018152a1610376565b63296d5bdd60e21b5f5260045ffd5b6004548181018091116104b6576004556040519081527fe3407208b14fa025330ca187030f118a1c0cdb604aba93ba45c862e6095aee2760203392a25f61028c565b634e487b7160e01b5f52601160045260245ffd5b015190505f806101ea565b601f198216935f5160206157ee5f395f51905f525f52805f20915f5b868110610536575083600195961061051e575b505050811b015f5160206157ee5f395f51905f525561020b565b01515f1960f88460031b161c191690555f8080610504565b919260206001819286850151815501940192016104f1565b5f5160206157ee5f395f51905f525f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f830160051c810191602084106105b3575b601f0160051c01905b8181106105a857506101d0565b5f815560010161059b565b9091508190610592565b634e487b7160e01b5f52602260045260245ffd5b90607f16906101be565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610170565b601f198216905f51602061578e5f395f51905f525f52805f20915f5b81811061065d57509583600195969710610645575b505050811b015f51602061578e5f395f51905f5255610191565b01515f1960f88460031b161c191690555f808061062b565b9192602060018192868b015181550194019201610616565b5f51602061578e5f395f51905f525f527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f830160051c810191602084106106da575b601f0160051c01905b8181106106cf5750610157565b5f81556001016106c2565b90915081906106b9565b90607f1690610145565b6801000000000000000068ff0000000000000000195f51602061586e5f395f51905f525416175f51602061586e5f395f51905f5255610070565b9050155f610046565b303b15915061003e565b829150610034565b5f80fd5b6001600160a01b0381165f9081525f51602061580e5f395f51905f52602052604090205460ff166107b8576001600160a01b03165f8181525f51602061580e5f395f51905f5260205260408120805460ff191660011790553391905f51602061574e5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206157ae5f395f51905f52602052604090205460ff166107b8576001600160a01b03165f8181525f5160206157ae5f395f51905f5260205260408120805460ff191660011790553391907f65aa5eac1b32fde55d4db583460221274367300ae805596cf543907b5d458c00905f51602061574e5f395f51905f529080a4600190565b6001600160a01b0381165f9081525f51602061582e5f395f51905f52602052604090205460ff166107b8576001600160a01b03165f8181525f51602061582e5f395f51905f5260205260408120805460ff191660011790553391907fc4c453d647953c0fd35db5a34ee76e60fb4abc3a8fb891a25936b70b38f29253905f51602061574e5f395f51905f529080a4600190565b60045f525f51602061584e5f395f51905f526020525f51602061576e5f395f51905f525460ff166109795760045f8181525f51602061584e5f395f51905f526020525f51602061576e5f395f51905f52805460ff191660011790553391907f9b0ee324ca44438714d8c36348cae5ef5f61255bb6eb57c650755cacd7a2c29b905f51602061574e5f395f51905f529080a4600190565b5f90565b60ff5f51602061586e5f395f51905f525460401c161561099957565b631afcd79f60e31b5f5260045ffdfe60806040526004361015610023575b3615610018575f80fd5b610021346148bc565b005b5f3560e01c8063017baf801461301e57806301ffc9a714612fc85780630900804d14612f9e5780630914902014612f6f57806309d2e76614612f545780630f3ba02314612f1a57806311f1fc9914612e69578063141edd5814612e4057806315aaea1714612e25578063183dd40314612e085780631c39d42b14612dec5780631c9eeebf14612dcc57806323c7e09c14612da4578063248a9ca314612d6d578063258ae58214612d0a57806325c33e1314612d0f5780632749deb114612d0a5780632e6b86cb14612ced5780632f2ff15d14612ca3578063313dab2014612c8657806336568abe14612c425780633f4ba83a14612bc457806340e58ee514612a05578063474bf3b5146129cd5780634b359e04146129635780634c2adcb01461293a5780634f1ef2861461276857806352d1902d14612702578063564ef91d146126db57806358ce98e7146126a15780635c975abb146126735780635f5581e4146125ff578063622edc20146125e257806366a78e6c146125c5578063688b308b146125675780636bd803531461248a5780636dbf1655146123fa578063702220821461239c57806375829def14612336578063778822e3146122c9578063787c3b38146121fb5780637df325e1146121565780638456cb59146120e557806384b0196e14611fc657806384d76f5e14611f9f5780638a5a456d14611f4b5780638b2d141d14611f2157806391d1485414611ecc578063920a78a814611ea257806392826eda146117ec578063a217fddf146117d2578063a41c9d5a14611766578063a8fcc41714611744578063ad3cb1cc146116f9578063aec2259f146116bc578063af156d4b1461169f578063b1a9f80914611678578063b2118a8d146115d3578063b28c8ac31461158c578063b2fb7c2d1461156f578063b5ab1c5d14611553578063b6a1cb2b146114f5578063b84c139214611471578063ba16d60014611454578063bc197c81146113bc578063c0a3f32914611393578063ca29195c14611376578063cdf92c2714611347578063d371f924146112cd578063d43a768a14611260578063d4cbb9d214611243578063d547741f146111f4578063db2e21bc1461108a578063e9b6302c1461101d578063eb97d8d114610fa1578063f23a6e6114610f4b578063f57f678414610f30578063f63f28c114610a04578063f8c8765e146103f8578063fb1c11f3146103cf5763fb74f6a70361000e57346103cb5760203660031901126103cb576100216103be6130f9565b6103c6613865565b61407d565b5f80fd5b346103cb5760203660031901126103cb576100216103eb6130f9565b6103f3613865565b613f6e565b346103cb5760803660031901126103cb576104116130f9565b6104196130cd565b906044356001600160a01b03811691908290036103cb576064356001600160a01b03811681036103cb575f516020614d305f395f51905f52549260ff8460401c1615936001600160401b038116801590816109fc575b60011490816109f2575b1590816109e9575b506109da5767ffffffffffffffff1981166001175f516020614d305f395f51905f5255846109ae575b506001600160a01b0383161561099f576104c261493b565b6104ca61493b565b60015f516020614cf05f395f51905f52556104e361493b565b6104ec33613cea565b506104f633613d5b565b5061050033613c65565b5061050961493b565b60409485516105188782613229565b60058152645061636b7360d81b60208201528651906105378883613229565b60018252603160f81b602083015261054d61493b565b61055561493b565b61055d61493b565b61056561493b565b8051906001600160401b03821161088857819061058f5f516020614bd05f395f51905f52546146a2565b601f8111610925575b50602090601f83116001146108a7575f9261089c575b50508160011b915f199060031b1c1916175f516020614bd05f395f51905f52555b8051906001600160401b038211610888576105f75f516020614c105f395f51905f52546146a2565b601f8111610819575b50602090601f831160011461078f5792826106b6959361069b936107189998965f92610784575b50508160011b915f199060031b1c1916175f516020614c105f395f51905f52555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101554780610775575b50613979565b6bffffffffffffffffffffffff60a01b5f5416175f55613dee565b50662386f26fc10000600e55674563918244f40000600f55662386f26fc100006010556703782dace9d90000601155611388601255620493e06013556201518060065561025860085561070881613cea565b5061071281613d5b565b50613c65565b5061071f57005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff0000000000000000195f516020614d305f395f51905f5254165f516020614d305f395f51905f52555160018152a1005b61077e906148bc565b89610695565b015190508b80610627565b90601f198316915f516020614c105f395f51905f525f52815f20925f5b81811061080157509361069b9361071899989693600193836106b69a98106107e9575b505050811b015f516020614c105f395f51905f5255610648565b01515f1960f88460031b161c191690558b80806107cf565b929360206001819287860151815501950193016107ac565b5f516020614c105f395f51905f525f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c8101916020851061087e575b601f0160051c01905b8181106108735750610600565b5f8155600101610866565b909150819061085d565b634e487b7160e01b5f52604160045260245ffd5b0151905089806105ae565b5f516020614bd05f395f51905f525f9081528281209350601f198516905b81811061090d57509084600195949392106108f5575b505050811b015f516020614bd05f395f51905f52556105cf565b01515f1960f88460031b161c191690558980806108db565b929360206001819287860151815501950193016108c5565b5f516020614bd05f395f51905f525f529091507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c81019160208510610995575b90601f859493920160051c01905b8181106109875750610598565b5f815584935060010161097a565b909150819061096c565b63f6b2911f60e01b5f5260045ffd5b68ffffffffffffffffff191668010000000000000001175f516020614d305f395f51905f5255856104aa565b63f92ee8a960e01b5f5260045ffd5b90501587610481565b303b159150610479565b86915061046f565b60c03660031901126103cb57610a186130f9565b610a206130cd565b60443560643560028110156103cb576084356001600160401b0381116103cb57610a4e90369060040161330c565b9160a4356001600160401b0381116103cb57610a6e90369060040161329b565b93610a77613806565b3415610f21576010543410610f21576011543411610f21576001600160a01b03165f818152600a602052604090205490959060ff1615610f12578515610f12576001600160a01b0316948515610f12576001845110610c13576005845111610c13575f95929495925f96600e5491600f549360125495601354975b89518c1015610c76576020610b078d8c613752565b51015115610c67576040610b1b8d8c613752565b51015115610c67578b6040610b3f6020610b35848f613752565b510151928d613752565b51015110610c6757856020610b548e8d613752565b51015110610c6757866040610b698e8d613752565b51015111610c67576020610b7d8d8c613752565b510151612710610b8d8a346137f3565b0411610c67576040610b9f8d8c613752565b510151612710610baf8b346137f3565b0410610c6757610bbf8c8b613752565b515115610c1357612710610bd38d8c613752565b515111610c135789515f198101908111610c53578c1080610c22575b610c1357610c0b600191610c038e8d613752565b51519061369d565b9b019a610af2565b6322e55e0960e11b5f5260045ffd5b506040610c2f8d8c613752565b51015160018d01808e11610c5357610c496020918d613752565b5101511115610bef565b634e487b7160e01b5f52601160045260245ffd5b6314414f4160e11b5f5260045ffd5b8995506127108b9103610c1357610c9c610c9587610ca59334906137b1565b9586614966565b909291926149a0565b6001600160a01b0316828103610f12575f52600a60205260ff60405f20541615610f125760025493835f52600b60205260405f208054905f198214610c5357600182019055610cf63460055461369d565b600555604051610d05816131f2565b8681526020810186815260408201868152606083018681526080840185815260a085019134835260c086019c8d5260e0860193888552600254600160401b81101561088857806001610d5a92016002556134b9565b969096610eff5787518755516001870180546001600160a01b03199081166001600160a01b03938416179091559151600288018054909316911617905551600385015551600484015551600583015598518051600683019a91600160401b8211610888578b54828d55808310610eb1575b506020019a5f5260205f209a5f905b828210610e865760208c8c818d8d8d8d610e2b8e8e60078f51910155610e026006544261369d565b875f5260078b5260405f2055610e1a6008544261369d565b875f5260098b5260405f2055614184565b92835f52600389528560405f2055604051948552888501526040840152346060840152608083015260a08201527f07845d47c471aefa7ffae36892e493397b5ff6888b8e5e30a2bd13402e2962d160c03392a4604051908152f35b60036020828f60026040600196518051845585810151888501550151910155019d019101909b610dda565b80600302906003820403610c535782600302600381048403610c53578d5f5260205f2091820191015b818110610ee75750610dcb565b805f600392555f60018201555f600282015501610eda565b634e487b7160e01b5f525f60045260245ffd5b63e6c4247b60e01b5f5260045ffd5b63162908e360e11b5f5260045ffd5b346103cb575f3660031901126103cb576020604051601e8152f35b346103cb5760a03660031901126103cb57610f646130f9565b50610f6d6130cd565b506084356001600160401b0381116103cb57610f8d903690600401613123565b505060405163f23a6e6160e01b8152602090f35b346103cb5760203660031901126103cb57610fba6130f9565b610fc26138a1565b6001600160a01b03811690811561100e57610fe690610fe033613fff565b50613dee565b50337f80acf2f79a4dfe0caf6e77f8ad8c8468f2e6be9ee862d901edd70cd5300e7feb5f80a3005b63296d5bdd60e21b5f5260045ffd5b346103cb5760203660031901126103cb57600435611039613865565b601154811161107b5760407fd3fc3f1a25a1a4e1e35a99f8a06f6bb9e67dce0b35ae9e24b1cbf0a33336abe891601054908060105582519182526020820152a1005b637b2d293f60e01b5f5260045ffd5b346103cb575f3660031901126103cb576110a261382d565b6110aa613865565b5f600481905560055560015447906001600160a01b03168015610f12578115610f21578147106111e5575f80808085855af16110e46134f6565b50156111d657604080516001600160a01b03929092168252602082018390527fb3579861130e4da8bb7b87c54d2d139937f23bcd6e4ebed9e75d0f78ab1cc11891a161112e613806565b600160ff195f516020614cb05f395f51905f525416175f516020614cb05f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1600154604080519283526001600160a01b03909116602083015233917f3ab9db27a4cdd8c603a752b62d5fbd93b4b3509fe2596708e9688e42bbac357691819081015b0390a260015f516020614cf05f395f51905f5255005b6312171d8360e31b5f5260045ffd5b631e9acf1760e31b5f5260045ffd5b346103cb5760403660031901126103cb576100216004356112136130cd565b9061123e611239825f525f516020614c705f395f51905f52602052600160405f20015490565b613933565b6140fb565b346103cb575f3660031901126103cb576020601354604051908152f35b346103cb5760203660031901126103cb5760043561127c613865565b60125481106112be5760407fc3f2642832798d7a52d70b309159ba3fcb20a730087dbb0426757e87ded64d2e91601354908060135582519182526020820152a1005b632cd4b11f60e11b5f5260045ffd5b346103cb5760203660031901126103cb576112e66130f9565b6112ee613865565b6001600160a01b03165f818152600a602052604090205460ff1615610f1257805f52600a60205260405f2060ff1981541690557f38b7b3681542fcc6180d9061bd856f02ced2138f14eba25334973c6f881003f45f80a2005b346103cb5760203660031901126103cb576004355f52600d602052602060ff60405f2054166040519015158152f35b346103cb575f3660031901126103cb576020600854604051908152f35b346103cb5760203660031901126103cb576100216113af6130f9565b6113b7613865565b613d5b565b346103cb5760a03660031901126103cb576113d56130f9565b506113de6130cd565b506044356001600160401b0381116103cb576113fe903690600401613150565b50506064356001600160401b0381116103cb5761141f903690600401613150565b50506084356001600160401b0381116103cb57611440903690600401613123565b505060405163bc197c8160e01b8152602090f35b346103cb575f3660031901126103cb576020600e54604051908152f35b346103cb5760203660031901126103cb576004356002548110156103cb5761149a60e0916134b9565b5080549060018060a01b036001820154169060018060a01b0360028201541660038201546004830154916007600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b346103cb5760203660031901126103cb57600435611511613865565b600f548111610c675760407fb7f03b24f260f6916e8db92db6297575c4bb14396e4e161593501102a808815991600e549080600e5582519182526020820152a1005b346103cb575f3660031901126103cb5760206040516127108152f35b346103cb575f3660031901126103cb576020601054604051908152f35b346103cb576100216115bd6115c56115cd6115a636613180565b96936115b69892989591956138ea565b3691613525565b953691613525565b923691613579565b9161457c565b346103cb576100216115e436613428565b91906115ee6138ea565b6040928351916115fe8584613229565b60018352601f198501938436602086013785519461161c8787613229565b600186528036602088013761163387519788613229565b6001875236602088013761164684613745565b6001600160a01b03909116905261165c84613745565b6001600160a01b03909116905261167284613745565b52613a5f565b346103cb575f3660031901126103cb5760206040515f516020614d505f395f51905f528152f35b346103cb575f3660031901126103cb576020600554604051908152f35b346103cb5760203660031901126103cb576001600160a01b036116dd6130f9565b165f52600a602052602060ff60405f2054166040519015158152f35b346103cb575f3660031901126103cb5761174060405161171a604082613229565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613462565b0390f35b346103cb575f3660031901126103cb5760405163a8fcc41760e01b8152602090f35b346103cb5760203660031901126103cb57600435611782613865565b601e81106117c35760407f85cb82ecd716544f28be67fbc7423b62151044de9e312eb5bafa1c1fbaf45ab591600854908060085582519182526020820152a1005b636c9b6cf160e01b5f5260045ffd5b346103cb575f3660031901126103cb5760206040515f8152f35b6101403660031901126103cb576004356118046130cd565b6044356001600160401b0381116103cb57611823903690600401613123565b919061182d6130e3565b9160e4356001600160401b0381116103cb5761184d903690600401613123565b939091610104356001600160401b0381116103cb57611870903690600401613123565b96909560026101243510156103cb57611887613806565b61188f61382d565b600254891015611e93576118a2896134b9565b50600201546001600160a01b03163303611e85576001600160a01b03831615610f125734611e77575b600454606435116111e557885f52600c60205260ff60405f205416611e6857885f52600d60205260ff60405f205416611e595760643560c43511610f215761191b6119158a6134b9565b506135c5565b9461193b610c9c61192d368585613265565b61193689614184565b614966565b60408701516001600160a01b0391821691168103610f12575f52600a60205260ff60405f20541615610f12578160209160018060a01b035f5416906044604051809681958294638d9dca6f60e01b8452886004850152816024850152848401375f828201840152601f01601f191681010301915afa908115611e4e575f91611e0d575b50610c9c63ffffffff611a10921698611a0a6119d988614184565b99611a02610124358c8c8b60c435926119f760a435938d3691613265565b908d606435916136c8565b923691613265565b90614966565b60408501516001600160a01b0391821691168103610f12575f52600a60205260ff60405f20541615610f125760c0840191611a57611a4f84518a6148f9565b809451613752565b519160208301805160643510610f21576040840190815160643511610f21575160c43510610f21575160c43511610f21576101243596611a96886136aa565b610124351580611df8575b611def575b8a5f52600c60205260405f20600160ff1982541617905560a08701611ace81516005546134e9565b6005555f80808060018060a01b03600154168551905af1611aed6134f6565b5015611dd9575b50611afe886136aa565b87611cbe5791815f938493604051928392833781018481520391606435905af1611b266134f6565b5015611be857611b3a6064356004546134e9565b600455516020938401516040805198895294880191909152928601525f60608601526001600160a01b03908116608086015260a43560a086015260643560c08601521660e0840152611b8e610124356136aa565b61012435610100840152611ba1816136aa565b6101208301526101408201527f79aca79eb9427e50f574c0dbfd1dab0d52d04e57f203f46c1331b92c29c55dcf6101603392a35b60015f516020614cf05f395f51905f5255005b611c74925093839460207f79aca79eb9427e50f574c0dbfd1dab0d52d04e57f203f46c1331b92c29c55dcf9793989501955f80808060643560018060a01b038c51165af1611c346134f6565b5015611c7c5750611c496064356004546134e9565b6004555b51945160405133989096879661012435936001600160a01b03169260643592909189614856565b0390a3611bd5565b5160018060a01b03875116907f2fe4261deda7f4dbb7162c3156cc66fd51f70c8cf8875d0bfd70e388f23a8dc4604080516064358152876020820152a3611c4d565b505050611c749250937f79aca79eb9427e50f574c0dbfd1dab0d52d04e57f203f46c1331b92c29c55dcf9591969394611cfb60c4356064356134e9565b60208701965f80808060c43560018060a01b038d51165af1611d1b6134f6565b5015611d975750611d3060c4356004546134e9565b6004555b80611d62575b5051945160405133989096879661012435936001600160a01b03169260c43592909189614856565b5f8080808460018060a01b03600154165af1611d7c6134f6565b5015611d3a57611d8e906004546134e9565b60045589611d3a565b5160018060a01b03885116907f2fe4261deda7f4dbb7162c3156cc66fd51f70c8cf8875d0bfd70e388f23a8dc46040805160c4358152886020820152a3611d34565b611de6905160045461369d565b6004558b611af4565b60019750611aa6565b508a5f52600960205260405f20544211611aa1565b90506020813d602011611e46575b81611e2860209383613229565b810103126103cb575163ffffffff811681036103cb57610c9c6119be565b3d9150611e1b565b6040513d5f823e3d90fd5b6304ccf4d560e21b5f5260045ffd5b634a4117f960e01b5f5260045ffd5b611e80346148bc565b6118cb565b6282b42960e81b5f5260045ffd5b633e1d0a9160e11b5f5260045ffd5b346103cb5760203660031901126103cb576004355f526003602052602060405f2054604051908152f35b346103cb5760403660031901126103cb57611ee56130cd565b6004355f525f516020614c705f395f51905f5260205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103cb5760203660031901126103cb576004355f526009602052602060405f2054604051908152f35b346103cb5760603660031901126103cb5760043560028110156103cb576044356001600160401b0381116103cb57602091611f8d611f9792369060040161330c565b90602435906137b1565b604051908152f35b346103cb575f3660031901126103cb5760206040515f516020614bb05f395f51905f528152f35b346103cb575f3660031901126103cb577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1005415806120bc575b1561207f5761205161200f6146da565b61174061201a6147a9565b61205f6040519161202c602084613229565b5f83525f368137604051958695600f60f81b875260e0602088015260e0870190613462565b908582036040870152613462565b904660608501523060808501525f60a085015283820360c0850152613486565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415611fff565b346103cb575f3660031901126103cb576120fd613865565b612105613806565b600160ff195f516020614cb05f395f51905f525416175f516020614cb05f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b346103cb5761002161216736613428565b91906121716138ea565b6040928351916121818584613229565b60018352601f198501938436602086013785519461219f8787613229565b60018652803660208801376121b687519788613229565b600187523660208801376121c984613745565b6001600160a01b0390911690526121df84613745565b6001600160a01b0390911690526121f584613745565b5261457c565b346103cb5760803660031901126103cb576004356001600160401b0381116103cb5761222b903690600401613150565b906024356001600160401b0381116103cb5761224b903690600401613150565b91906044356001600160401b0381116103cb5761226c903690600401613150565b919094606435916001600160401b0383116103cb57610021966122b36122bb926122ab6122a06122c3973690600401613150565b9990966115b66138ea565b983691613525565b943691613579565b933691613579565b926142be565b346103cb5760203660031901126103cb576004356122e5613865565b610e1081106123275760407f15c5fb1eab366b7926ae691891590eeed09db94b870081c268b98778042d7d2591600654908060065582519182526020820152a1005b63317eae7160e21b5f5260045ffd5b346103cb5760203660031901126103cb5761234f6130f9565b612357613865565b6001600160a01b0381161561238d578061237361237992613cea565b50613d5b565b5061238333613eff565b5061002133613f6e565b6349e27cff60e01b5f5260045ffd5b346103cb5760203660031901126103cb576004356123b8613865565b60135481116112be5760407f01e288d0ef1d70a454bb538a891c8f9e2e3ee15aaa634203e9370843723c9dae91601254908060125582519182526020820152a1005b346103cb5760203660031901126103cb576124136130f9565b61241b613865565b6001600160a01b03168015610f1257805f52600a60205260ff60405f20541661247b57805f52600a60205260405f20600160ff198254161790557f758f46d6402b2cfe183c96029286524f6abcfbe17b1cc7db2834ecc3f23640d55f80a2005b633628149f60e21b5f5260045ffd5b346103cb5760803660031901126103cb576100216124a66130f9565b6124ae6130cd565b6124b66138ea565b60409182516124c58482613229565b60018152601f19840192833660208401378451926124e38685613229565b60018452843660208601378551946124fb8787613229565b600186528036602088013761251287519788613229565b6001875236602088013761252583613745565b6001600160a01b03909116905261253b83613745565b6001600160a01b03909116905260443561255484613745565b5260643561256185613745565b526142be565b346103cb5760203660031901126103cb57600435612583613865565b601054811061107b5760407f905618debd54082867e8ff4edb7cea7d2cc41b4e445ce11dc92482a6821a70df91601154908060115582519182526020820152a1005b346103cb575f3660031901126103cb576020600f54604051908152f35b346103cb575f3660031901126103cb576020600654604051908152f35b346103cb5760403660031901126103cb576004356001600160401b0381116103cb5761262f903690600401613397565b602435906001600160401b0382116103cb57610c9c6126619161193661265b602095369060040161329b565b91614184565b6040516001600160a01b039091168152f35b346103cb575f3660031901126103cb57602060ff5f516020614cb05f395f51905f5254166040519015158152f35b346103cb5760203660031901126103cb576004356001600160401b0381116103cb57611f976126d66020923690600401613397565b614184565b346103cb575f3660031901126103cb575f546040516001600160a01b039091168152602090f35b346103cb575f3660031901126103cb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036127595760206040515f516020614c505f395f51905f528152f35b63703e46dd60e11b5f5260045ffd5b60403660031901126103cb5761277c6130f9565b6024356001600160401b0381116103cb5761279b90369060040161329b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115612918575b50612759576127dd613865565b6001600160a01b03821691821561099f576040516352d1902d60e01b8152602081600481875afa5f91816128e4575b506128245783634c9c8ce360e01b5f5260045260245ffd5b805f516020614c505f395f51905f528592036128d25750813b156128c0575f516020614c505f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156128a8575f8083602061002195519101845af46128a26134f6565b91614a82565b5050346128b157005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011612910575b8161290060209383613229565b810103126103cb5751908561280c565b3d91506128f3565b5f516020614c505f395f51905f52546001600160a01b031614159050836127d0565b346103cb5760203660031901126103cb576100216129566130f9565b61295e613865565b613c65565b346103cb576101003660031901126103cb5761297d6130cd565b6064356001600160401b0381116103cb5761299c90369060040161329b565b6129a46130e3565b9060e4359060028210156103cb57602093611f979360c4359260a43592604435906004356136c8565b346103cb5760203660031901126103cb576001600160a01b036129ee6130f9565b165f52600b602052602060405f2054604051908152f35b346103cb5760203660031901126103cb57600435612a22816134b9565b50600101546001600160a01b031633141580612ba4575b612b9557612a4561382d565b600254811015611e9357805f52600c60205260ff60405f205416611e6857805f52600d60205260ff60405f205416611e5957805f52600760205260405f20544210612b8657805f52600d60205260405f20600160ff198254161790557f2098a796054c29fb8d38c92790a9c3b03dba43191b368bfb66b6437197eef4e66020612b13612ad3611915856134b9565b60a0810151612ae4816005546134e9565b600555858483015f8080808660018060a01b038651165af1612b046134f6565b5015612b2d575b505050614184565b604051908152a260015f516020614cf05f395f51905f5255005b60407f2fe4261deda7f4dbb7162c3156cc66fd51f70c8cf8875d0bfd70e388f23a8dc491612b5d8560045461369d565b600455516001600160a01b031693612b7486614184565b825191825288820152a3858581612b0b565b635b4ffa6560e01b5f5260045ffd5b63b8036d5560e01b5f5260045ffd5b50612bae816134b9565b50600201546001600160a01b0316331415612a39565b346103cb575f3660031901126103cb57612bdc613865565b5f516020614cb05f395f51905f525460ff811615612c335760ff19165f516020614cb05f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b346103cb5760403660031901126103cb57612c5b6130cd565b336001600160a01b03821603612c7757610021906004356140fb565b63334bd91960e11b5f5260045ffd5b346103cb575f3660031901126103cb576020600454604051908152f35b346103cb5760403660031901126103cb57610021600435612cc26130cd565b90612ce8611239825f525f516020614c705f395f51905f52602052600160405f20015490565b613e6e565b346103cb575f3660031901126103cb576020601154604051908152f35b6132b9565b346103cb5760203660031901126103cb57600435612d2b613865565b600e548110610c675760407f64cc8b0bc5d539e03bf1ff414d078447028c16f47fc95ef5b7612a6a0b72360791600f549080600f5582519182526020820152a1005b346103cb5760203660031901126103cb576020611f976004355f525f516020614c705f395f51905f52602052600160405f20015490565b346103cb575f3660031901126103cb576001546040516001600160a01b039091168152602090f35b346103cb576100216115bd6115c5612de66115a636613180565b91613a5f565b346103cb575f3660031901126103cb576020604051610e108152f35b346103cb575f3660031901126103cb576020601254604051908152f35b346103cb575f3660031901126103cb57602060405160058152f35b346103cb5760203660031901126103cb57610021612e5c6130f9565b612e646138a1565b613979565b346103cb5760203660031901126103cb57600435612e8561382d565b612e8d613865565b6004548082116111e55781612ea1916134e9565b6004555f8080808460018060a01b03600154165af1612ebe6134f6565b5015612f0b57600154604080519283526001600160a01b03909116602083015233917f15596072c803eddeee7aae343e846f411bf951c23ef910e91eff4cc1a84110a791819081016111c0565b6327fcd9d160e01b5f5260045ffd5b346103cb575f3660031901126103cb5760206040517f65aa5eac1b32fde55d4db583460221274367300ae805596cf543907b5d458c008152f35b346103cb575f3660031901126103cb57602060405160018152f35b346103cb5760203660031901126103cb576004355f52600c602052602060ff60405f2054166040519015158152f35b346103cb5760203660031901126103cb576004355f526007602052602060405f2054604051908152f35b346103cb5760203660031901126103cb5760043563ffffffff60e01b81168091036103cb57602090637965db0b60e01b811490811561300d575b506040519015158152f35b6301ffc9a760e01b14905082613002565b6101403660031901126103cb576130336130cd565b6044356001600160401b0381116103cb57613052903690600401613123565b61305d9291926130e3565b9260e4356001600160401b0381116103cb5761307d903690600401613123565b94610104356001600160401b0381116103cb5761309e903690600401613123565b95909460026101243510156103cb576130b5613806565b6004355f52600360205260405f205497611887613806565b602435906001600160a01b03821682036103cb57565b608435906001600160a01b03821682036103cb57565b600435906001600160a01b03821682036103cb57565b35906001600160a01b03821682036103cb57565b9181601f840112156103cb578235916001600160401b0383116103cb57602083818601950101116103cb57565b9181601f840112156103cb578235916001600160401b0383116103cb576020808501948460051b0101116103cb57565b60606003198201126103cb576004356001600160401b0381116103cb57816131aa91600401613150565b929092916024356001600160401b0381116103cb57816131cc91600401613150565b92909291604435906001600160401b0382116103cb576131ee91600401613150565b9091565b61010081019081106001600160401b0382111761088857604052565b606081019081106001600160401b0382111761088857604052565b90601f801991011681019081106001600160401b0382111761088857604052565b6001600160401b03811161088857601f01601f191660200190565b9291926132718261324a565b9161327f6040519384613229565b8294818452818301116103cb578281602093845f960137010152565b9080601f830112156103cb578160206132b693359101613265565b90565b346103cb5760403660031901126103cb576024356004356001600160401b0382116103cb57610c9c61266191611a0a602094369060040161329b565b6001600160401b0381116108885760051b60200190565b81601f820112156103cb57803590613323826132f5565b926133316040519485613229565b828452602060608186019402830101918183116103cb57602001925b82841061335b575050505090565b6060848303126103cb5760206060916040516133768161320e565b8635815282870135838201526040870135604082015281520193019261334d565b919091610100818403126103cb57604051906133b2826131f2565b8193813583526133c46020830161310f565b60208401526133d56040830161310f565b6040840152606082013560608401526080820135608084015260a082013560a084015260c0820135916001600160401b0383116103cb5761341c60e093928493830161330c565b60c08501520135910152565b60609060031901126103cb576004356001600160a01b03811681036103cb57906024356001600160a01b03811681036103cb579060443590565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602080835192838152019201905f5b8181106134a35750505090565b8251845260209384019390920191600101613496565b6002548110156134d55760025f5260205f209060031b01905f90565b634e487b7160e01b5f52603260045260245ffd5b91908203918211610c5357565b3d15613520573d906135078261324a565b916135156040519384613229565b82523d5f602084013e565b606090565b929190613531816132f5565b9361353f6040519586613229565b602085838152019160051b81019283116103cb57905b82821061356157505050565b6020809161356e8461310f565b815201910190613555565b929190613585816132f5565b936135936040519586613229565b602085838152019160051b81019283116103cb57905b8282106135b557505050565b81358152602091820191016135a9565b906040516135d2816131f2565b8254815260018301546001600160a01b03908116602083015260028401541660408201526003830154606082015260048301546080820152600583015460a08201526006830180549193849290919061362a816132f5565b916136386040519384613229565b81835260208301905f5260205f205f915b838310613666575050505060e09160079160c08501520154910152565b600360206001926040516136798161320e565b85548152848601548382015260028601546040820152815201920192019190613649565b91908201809211610c5357565b600211156136b457565b634e487b7160e01b5f52602160045260245ffd5b9691959093929461370861373f96604051988997602089019b8c5260018060a01b0316604089015260608801526101006080880152610120870190613462565b6001600160a01b0390941660a086015260c085015260e084015261372b816136aa565b61010083015203601f198101835282613229565b51902090565b8051156134d55760200190565b80518210156134d55760209160051b010190565b90602080835192838152019201905f5b8181106137835750505090565b9091926020606060019260408751805183528481015185840152015160408201520194019101919091613776565b919061373f906137e560405193849260208401966137ce816136aa565b875260408401526060808401526080830190613766565b03601f198101835282613229565b81810292918115918404141715610c5357565b60ff5f516020614cb05f395f51905f52541661381e57565b63d93c066560e01b5f5260045ffd5b60025f516020614cf05f395f51905f5254146138565760025f516020614cf05f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b335f9081525f516020614c305f395f51905f52602052604090205460ff161561388a57565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081525f516020614d105f395f51905f52602052604090205460ff16156138c657565b63e2517d3f60e01b5f52336004525f516020614bb05f395f51905f5260245260445ffd5b335f9081525f516020614cd05f395f51905f52602052604090205460ff161561390f57565b63e2517d3f60e01b5f52336004525f516020614d505f395f51905f5260245260445ffd5b5f8181525f516020614c705f395f51905f526020908152604080832033845290915290205460ff16156139635750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b03168015610f12575f8181525f516020614d105f395f51905f52602052604090205460ff1661100e57600180546001600160a01b0319811683179091556001600160a01b03167f8e72b2cf2be54e3a933095b67f13c3927802840d4808120dc36219da676d79175f80a3565b90602080835192838152019201905f5b818110613a095750505090565b82516001600160a01b03168452602093840193909201916001016139fc565b91613a5190613a436132b695936060865260608601906139ec565b9084820360208601526139ec565b916040818403910152613486565b9091815115610f215781518351811490811591613c59575b50613c4a575f5b8251811015613c11576001600160a01b03613a998285613752565b511615610f12576001600160a01b03613ab28286613752565b511615610f1257613ac38183613752565b5115610f2157602460206001600160a01b03613adf8487613752565b5116604051928380926370a0823160e01b82523060048301525afa908115611e4e575f91613be0575b50613b138284613752565b51116111e557613b8660206001600160a01b03613b308487613752565b51166001600160a01b03613b448589613752565b511690613b518587613752565b5160405163a9059cbb60e01b81526001600160a01b0390931660048401526024830152909283919082905f9082906044820190565b03925af1908115611e4e575f91613ba6575b50156111d657600101613a7e565b90506020813d8211613bd8575b81613bc060209383613229565b810103126103cb575180151581036103cb575f613b98565b3d9150613bb3565b90506020813d8211613c09575b81613bfa60209383613229565b810103126103cb57515f613b08565b3d9150613bed565b5090613c457fda7ef1de52bffe1a49c51eaed4b15496c10b01f18b30ac2c65249fd7b4f9fe84939260405193849384613a28565b0390a1565b63512509d360e11b5f5260045ffd5b9050815114155f613a77565b6001600160a01b0381165f9081525f516020614cd05f395f51905f52602052604090205460ff16613ce5576001600160a01b03165f8181525f516020614cd05f395f51905f5260205260408120805460ff191660011790553391905f516020614d505f395f51905f52905f516020614b905f395f51905f529080a4600190565b505f90565b6001600160a01b0381165f9081525f516020614c305f395f51905f52602052604090205460ff16613ce5576001600160a01b03165f8181525f516020614c305f395f51905f5260205260408120805460ff191660011790553391905f516020614b905f395f51905f528180a4600190565b6001600160a01b0381165f9081525f516020614bf05f395f51905f52602052604090205460ff16613ce5576001600160a01b03165f8181525f516020614bf05f395f51905f5260205260408120805460ff191660011790553391907f65aa5eac1b32fde55d4db583460221274367300ae805596cf543907b5d458c00905f516020614b905f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020614d105f395f51905f52602052604090205460ff16613ce5576001600160a01b03165f8181525f516020614d105f395f51905f5260205260408120805460ff191660011790553391905f516020614bb05f395f51905f52905f516020614b905f395f51905f529080a4600190565b5f8181525f516020614c705f395f51905f52602090815260408083206001600160a01b038616845290915290205460ff16613ef9575f8181525f516020614c705f395f51905f52602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291905f516020614b905f395f51905f529080a4600190565b50505f90565b6001600160a01b0381165f9081525f516020614c305f395f51905f52602052604090205460ff1615613ce5576001600160a01b03165f8181525f516020614c305f395f51905f5260205260408120805460ff191690553391905f516020614c905f395f51905f528180a4600190565b6001600160a01b0381165f9081525f516020614bf05f395f51905f52602052604090205460ff1615613ce5576001600160a01b03165f8181525f516020614bf05f395f51905f5260205260408120805460ff191690553391907f65aa5eac1b32fde55d4db583460221274367300ae805596cf543907b5d458c00905f516020614c905f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020614d105f395f51905f52602052604090205460ff1615613ce5576001600160a01b03165f8181525f516020614d105f395f51905f5260205260408120805460ff191690553391905f516020614bb05f395f51905f52905f516020614c905f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020614cd05f395f51905f52602052604090205460ff1615613ce5576001600160a01b03165f8181525f516020614cd05f395f51905f5260205260408120805460ff191690553391905f516020614d505f395f51905f52905f516020614c905f395f51905f529080a4600190565b5f8181525f516020614c705f395f51905f52602090815260408083206001600160a01b038616845290915290205460ff1615613ef9575f8181525f516020614c705f395f51905f52602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291905f516020614c905f395f51905f529080a4600190565b60429080519061423c60018060a01b0360208301511660018060a01b0360408401511692614227606082015191608081015160a08201519060e060c084015193015194604051988997602089019b7fe5de7d62401712d7e4d89bb245a67effccc12acfbb86de1e24564e2e1f9dd0788d5260408a01526060890152608088015260a087015260c086015260e0850152610120610100850152610140840190613766565b9061012083015203601f198101835282613229565b519020614247614ae0565b61424f614b4a565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526142a060c082613229565b519020906040519161190160f01b8352600283015260228201522090565b92939091835115610f215783518351811490811591614570575b8115614564575b50613c4a5760409491936020925f5b82518110156144f3576001600160a01b036143098285613752565b511615610f12576001600160a01b036143228288613752565b511615610f12576143338183613752565b5115610f215761438560206001600160a01b036143508487613752565b511661435c8488613752565b518b51627eeac760e11b8152306004820152602481019190915292839190829081906044820190565b03915afa9081156144b8575f916144c2575b506143a28284613752565b51116111e5578751906143b58983613229565b600182528536602084013788516143cc8a82613229565b60018152863660208301376143e18287613752565b516143eb84613745565b526143f68285613752565b5161440082613745565b526001600160a01b036144138387613752565b5116926001600160a01b03614428848b613752565b511693803b156103cb5761446c945f602061447e8f96839751998a978896631759616b60e11b8852306004890152602488015260a0604488015260a4870190613486565b85810360031901606487015290613486565b8284820391600319830160848701525201925af19182156144b8576001926144a8575b50016142ee565b5f6144b291613229565b5f6144a1565b89513d5f823e3d90fd5b90506020813d82116144eb575b816144dc60209383613229565b810103126103cb57515f614397565b3d91506144cf565b509092506145567f6eb41c7cf392c11c85d5ce898f2565141e8120cff8a13a0bf8e4a9c3b6df52b29596613c459361454961453b97835198899860808a5260808a01906139ec565b9088820360208a01526139ec565b9186830390870152613486565b908382036060850152613486565b9050855114155f6142df565b825181141591506142d8565b92919092805115610f215780518451811490811591614696575b50613c4a575f5b8151811015614662576001600160a01b036145b88284613752565b511615610f12576001600160a01b036145d18287613752565b511615610f12576001600160a01b036145ea8284613752565b5116906001600160a01b036145ff8288613752565b511661460b8286613752565b51833b156103cb5760645f92836040519687948593632142170760e11b8552306004860152602485015260448401525af1918215611e4e57600192614652575b500161459d565b5f61465c91613229565b5f61464b565b50613c457f0c1a5e4c986b93e894a5c3eeedeee9d54f3433ff530d2ca7631bc00271bde56793949260405193849384613a28565b9050825114155f614596565b90600182811c921680156146d0575b60208310146146bc57565b634e487b7160e01b5f52602260045260245ffd5b91607f16916146b1565b604051905f825f516020614bd05f395f51905f5254916146f9836146a2565b808352926001811690811561478a575060011461471f575b61471d92500383613229565b565b505f516020614bd05f395f51905f525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b81831061476e57505090602061471d92820101614711565b6020919350806001915483858901015201910190918492614756565b6020925061471d94915060ff191682840152151560051b820101614711565b604051905f825f516020614c105f395f51905f5254916147c8836146a2565b808352926001811690811561478a57506001146147eb5761471d92500383613229565b505f516020614c105f395f51905f525f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b81831061483a57505090602061471d92820101614711565b6020919350806001915483858901015201910190918492614822565b949192610140969399989794919961016087019a87526020870152604086015260608501525f60808501525f60a08501525f60c085015260018060a01b031660e08401526148a3816136aa565b6101008301526148b2816136aa565b6101208201520152565b6148c88160045461369d565b6004556040519081527fe3407208b14fa025330ca187030f118a1c0cdb604aba93ba45c862e6095aee2760203392a2565b5f91825b815184101561492c5761491490610c038584613752565b9283831061492557600101926148fd565b9250505090565b6303fb883760e51b5f5260045ffd5b60ff5f516020614d305f395f51905f525460401c161561495757565b631afcd79f60e31b5f5260045ffd5b81519190604183036149965761498f9250602082015190606060408401519301515f1a90614a00565b9192909190565b50505f9160029190565b60048110156136b457806149b2575050565b600181036149c95763f645eedf60e01b5f5260045ffd5b600281036149e4575063fce698f760e01b5f5260045260245ffd5b6003146149ee5750565b6335e2f38360e21b5f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411614a77579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15611e4e575f516001600160a01b03811615614a6d57905f905f90565b505f906001905f90565b5050505f9160039190565b90614aa65750805115614a9757805190602001fd5b63d6bda27560e01b5f5260045ffd5b81511580614ad7575b614ab7575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15614aaf565b614ae86146da565b8051908115614af8576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100548015614b255790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b614b526147a9565b8051908115614b62576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015614b25579056fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9b0ee324ca44438714d8c36348cae5ef5f61255bb6eb57c650755cacd7a2c29ba16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102f9232fdb47376373f124299514419be5e88f294fb4878ffd53802c02c557618fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103b7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171bcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300d5eca2275ae5468fc6328d5f7139b0650ff887f5f59eaa13cdf410f2b835045e9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00eb60d83878932ca9f4ef6c58d9b49b043f87557ed40301271762dace2b0af9c6f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00c4c453d647953c0fd35db5a34ee76e60fb4abc3a8fb891a25936b70b38f29253a2646970667358221220c2dca16bc5d7d8c4e656136c543a4c2053779cadeb8601028c66c9f218b19bae64736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8b461116231dd656b0a07055616a840d9f932861cf503978a820e592e19d2e82a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102f9232fdb47376373f124299514419be5e88f294fb4878ffd53802c02c557618fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103b7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97dd5eca2275ae5468fc6328d5f7139b0650ff887f5f59eaa13cdf410f2b835045eeb60d83878932ca9f4ef6c58d9b49b043f87557ed40301271762dace2b0af9c6f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00