0 txs
2k calls
constructor
No constructor.
functions
brevisProof
viewfunction brevisProof() view returns (address)
config
viewfunction config() view returns (address creator, uint64 startTime, uint32 duration)
currEpoch
viewfunction currEpoch() view returns (uint64)
dataChainId
viewfunction dataChainId() view returns (uint64)
getMerkleProof
viewfunction getMerkleProof(uint64 epoch, address user) view returns (uint256[] rewardAmounts, bytes32[] proof)
getRewardAmount
viewfunction getRewardAmount(address user, address token) view returns (uint256)
getRewardsLength
viewfunction getRewardsLength() view returns (uint64)
getRoleAccounts
viewfunction getRoleAccounts(bytes32 role) view returns (address[] accounts)
getTokens
viewfunction getTokens() view returns (address[])
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
messageBus
viewfunction messageBus() view returns (address)
numRoleAccounts
viewfunction numRoleAccounts(bytes32 role) view returns (uint256)
owner
viewfunction owner() view returns (address)
REWARD_UPDATER_ROLE
viewfunction REWARD_UPDATER_ROLE() view returns (bytes32)
roleAccounts
viewfunction roleAccounts(bytes32 role, uint256) view returns (address accounts)
roles
viewfunction roles(bytes32 role, address account) view returns (bool)
state
viewfunction state() view returns (uint8)
tokenCumulativeRewards
viewfunction tokenCumulativeRewards(address) view returns (uint256)
tokens
viewfunction tokens(uint256) view returns (address)
topRoot
viewfunction topRoot() view returns (bytes32)
viewTotalRewards
viewfunction viewTotalRewards(address user) view returns (tuple[])
vkMap
viewfunction vkMap(uint8) view returns (bytes32)
genAndSendTopRoot
payablefunction genAndSendTopRoot(address _receiver, uint64 _dstChainId) payable
genSubRoot
nonpayablefunction genSubRoot(uint64 epoch, uint256 nLeaves)
genTopRoot
nonpayablefunction genTopRoot(uint64 epoch)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
grantRoles
nonpayablefunction grantRoles(bytes32 role, address[] accounts)
init
nonpayablefunction init(tuple cfg, address brv, address owner, bytes32[] vks, uint64 dataChainId, address rewardUpdater)
renounceRole
nonpayablefunction renounceRole(bytes32 role)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
revokeRoles
nonpayablefunction revokeRoles(bytes32 role, address[] accounts)
sendTopRoot
payablefunction sendTopRoot(address _receiver, uint64 _dstChainId) payable
setMessageBus
nonpayablefunction setMessageBus(address _messageBus)
setVk
nonpayablefunction setVk(uint8 appId, bytes32 _vk)
startEpoch
nonpayablefunction startEpoch(uint64 epoch)
startSubRootGen
nonpayablefunction startSubRootGen(uint64 epoch)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updateRewards
nonpayablefunction updateRewards(bytes proof, bytes appOutput, uint32 batchIndex, uint256 maxNumToProcess)
events
AllSubRootsGenerated
event AllSubRootsGenerated(uint64 indexed epoch)
MessageBusUpdated
event MessageBusUpdated(address messageBus)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
ProofProcessed
event ProofProcessed(bytes32 indexed proofId, uint32 indexed epoch, uint32 indexed batchIndex)
ProofSegmentProcessed
event ProofSegmentProcessed(bytes32 indexed proofId, uint32 indexed epoch, uint32 indexed batchIndex, uint256 startEarnerIndex, uint256 endEarnerIndex)
RewardsAdded
event RewardsAdded(uint8 indexed appId, uint32 indexed epoch, address indexed user, uint256[] newRewards)
RoleGranted
event RoleGranted(bytes32 role, address account)
RoleRevoked
event RoleRevoked(bytes32 role, address account)
SubRootGenerated
event SubRootGenerated(uint64 indexed epoch, uint256 indexed subRootIndex, bytes32 subRoot)
SubRootLeafProcessed
event SubRootLeafProcessed(uint64 indexed epoch, uint256 indexed subRootIndex, uint256 indexed leafIndex, address user, uint256[] cumulativeRewards, bytes32 leafHash)
TopRootGenerated
event TopRootGenerated(uint64 indexed epoch, bytes32 topRoot)
TopRootSent
event TopRootSent(uint64 indexed epoch, bytes32 topRoot, address receiver, uint64 dstChainId)
VkUpdated
event VkUpdated(uint8 appId, bytes32 vk)
errors
StringsInsufficientHexLength
error StringsInsufficientHexLength(uint256 value, uint256 length)
creation bytecode
0x6080806040523460575760018054336001600160a01b0319821681179092556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3613d06908161005c8239f35b5f80fdfe60c06040526004361015610011575f80fd5b5f3560e01c80630a4b081414611ef75780630ec693ea14611eaa5780630f6d1eb414611afd578063196f0f6214611a8e5780631a69d9c814611a545780631b4fc38b14611a375780632f2ff15d146119f0578063373db229146119cf5780633abbf2da1461162d5780633f823bfa146114845780634c6f94e5146114525780634f64b2be14611404578063547cad121461130b5780635d129d191461123d5780636d9dce2914610a0157806379502c55146109b257806379b2d49e1461098d578063803c3c2c146107ee578063856b2726146107b15780638879315d146107875780638bb9c5bf1461076a5780638da5cb5b1461073757806391d14854146101bb578063984ba1db146106b6578063a1a227fa14610683578063a1b5ff0814610659578063a2c95141146105e5578063aa6ca8081461055b578063c19d93fb14610502578063c7f5aaa0146104d0578063d13bc78f146104a9578063d4f3c7cc14610464578063d547741f1461041d578063d7da1dee146103f6578063deb9a3a214610387578063e1ed0a82146102fd578063f2fde38b146102165763f8fc08b9146101bb575f80fd5b34610212576040600319360112610212576101d4612b06565b6004355f52600260205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b5f80fd5b346102125760206003193601126102125761022f612b29565b61025273ffffffffffffffffffffffffffffffffffffffff600154163314612ebe565b73ffffffffffffffffffffffffffffffffffffffff81161561027957610277906139a4565b005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b34610212576020600319360112610212576004355f52600360205260405f206040519081602082549182815201915f5260205f20905f5b81811061035b576103578561034b81870382612acb565b60405191829182612c31565b0390f35b825473ffffffffffffffffffffffffffffffffffffffff16845260209093019260019283019201610334565b346102125761039536612b4c565b6103b873ffffffffffffffffffffffffffffffffffffffff600154163314612ebe565b5f5b815181101561027757806103f073ffffffffffffffffffffffffffffffffffffffff6103e860019486612eaa565b5116856136b2565b016103ba565b34610212575f60031936011261021257602067ffffffffffffffff60075416604051908152f35b3461021257604060031936011261021257610277610439612b06565b61045c73ffffffffffffffffffffffffffffffffffffffff600154163314612ebe565b6004356133cb565b346102125760206003193601126102125773ffffffffffffffffffffffffffffffffffffffff610492612b29565b165f526005602052602060405f2054604051908152f35b34610212575f60031936011261021257602067ffffffffffffffff600e5416604051908152f35b34610212575f60031936011261021257602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b34610212575f6003193601126102125760ff60105460a01c16604051600482101561052e576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b34610212575f6003193601126102125760405180602060045491828152019060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b8181106105b9576103578561034b81870382612acb565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016105a2565b34610212576040600319360112610212576105fe612b29565b73ffffffffffffffffffffffffffffffffffffffff61064361061e612b06565b9273ffffffffffffffffffffffffffffffffffffffff165f52600960205260405f2090565b91165f52602052602060405f2054604051908152f35b34610212576020600319360112610212576004355f526003602052602060405f2054604051908152f35b34610212575f60031936011261021257602073ffffffffffffffffffffffffffffffffffffffff60105416604051908152f35b34610212576040600319360112610212577fe4d02ba66d7a5fdd3d11acbb33a5d51c2bda01ff709ec20c1dd337607dc9eed760406106f2612c21565b60ff6024359161071b73ffffffffffffffffffffffffffffffffffffffff600154163314612ebe565b1690815f52600660205280835f205582519182526020820152a1005b34610212575f60031936011261021257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461021257602060031936011261021257610277336004356133cb565b34610212575f60031936011261021257602067ffffffffffffffff60105460a81c16604051908152f35b6040600319360112610212576102776107c8612b29565b6107d0612a98565b906107e967ffffffffffffffff60105460a81c16612f23565b612fda565b3461021257602060031936011261021257610807612a81565b335f9081527f6e98191722f81699a429bb9aa1a53636666af1e598e3b4f3cab766e184f452fd60205260409020546108419060ff16612c80565b6010549060ff8260a01c16600481101561052e577fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff9161089f7cffffffffffffffff0000000000000000000000000000000000000000009215612d17565b6108c167ffffffffffffffff8560a81c1667ffffffffffffffff831611612d7c565b60a81b16911617601055740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff60105416176010556011545f5b81811061091c575f601155005b601154811015610960577f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c688101545f9081526012602052604081205560010161090f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6040600319360112610212576102776109a4612b29565b6109ac612a98565b90612fda565b34610212575f600319360112610212576060600b546040519073ffffffffffffffffffffffffffffffffffffffff8116825267ffffffffffffffff8160a01c16602083015260e01c6040820152f35b346102125760c06003193601126102125760043567ffffffffffffffff811161021257806004018136039060a0600319830112610212576024359273ffffffffffffffffffffffffffffffffffffffff8416809403610212576044359173ffffffffffffffffffffffffffffffffffffffff831683036102125760643567ffffffffffffffff811161021257366023820112156102125780600401359467ffffffffffffffff8611610212573660248760051b84010111610212576084359067ffffffffffffffff82168092036102125760a4359773ffffffffffffffffffffffffffffffffffffffff891696878a036102125773ffffffffffffffffffffffffffffffffffffffff600154166111df57610b1b906139a4565b7fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f5573ffffffffffffffffffffffffffffffffffffffff610b608561390a565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600b541617600b55602485013567ffffffffffffffff8116810361021257600b54604487013563ffffffff81168103610212577bffffffffffffffff00000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9260e01b169360a01b1691161717600b556064850194610c28868661392b565b90680100000000000000008211610e4457600c5482600c5580831061115a575b50600c5f5260205f205f915b8383106110f857505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60848201359201821215610212570160048101359067ffffffffffffffff8211610212576024018160051b3603811361021257680100000000000000008211610e4457600d5482600d558083106110b4575b50600d5f5260205f205f5b8381106110a05750505050610cf2848461392b565b969050601f19610d1a610d0489612aee565b98610d126040519a8b612acb565b808a52612aee565b013660208901375f5b610d2d868661392b565b9050811015610d8257610d40868661392b565b829192101561096057610d596001928260061b0161390a565b73ffffffffffffffffffffffffffffffffffffffff610d78838c612eaa565b9116905201610d23565b5092509250925f5b8551811015610e715773ffffffffffffffffffffffffffffffffffffffff610db28288612eaa565b51166004549068010000000000000000821015610e4457610dde826001610e0a94016004556004612a6c565b90919073ffffffffffffffffffffffffffffffffffffffff8084549260031b9316831b921b1916179055565b6001810180911115610d8a575b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b50855f5b60ff811684811015610ebd576001019060ff8211610e175760ff8092165f5260066020526024611fe08260051b168801013560405f20551660ff8114610e1757600101610e75565b5050837fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600e541617600e55610f0c73ffffffffffffffffffffffffffffffffffffffff600154163314612ebe565b5f8281527f6e98191722f81699a429bb9aa1a53636666af1e598e3b4f3cab766e184f452fd602052604090205460ff16611042577f82531167a8e1b9df58acc5f105c04f72009b9ff406bf7d722b527a2f45d626ae5f5260036020527f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f391604091610fb7907f2315356c12c7359eb6b832c07282326508cad629b4c0904d8ba501522d5bfccc613688565b7f82531167a8e1b9df58acc5f105c04f72009b9ff406bf7d722b527a2f45d626ae5f526002602052815f20815f52602052815f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790558151907f82531167a8e1b9df58acc5f105c04f72009b9ff406bf7d722b527a2f45d626ae82526020820152a1005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f616c72656164792068617320726f6c65000000000000000000000000000000006044820152fd5b600190602084359401938184015501610cdd565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b8181106110ed5750610cd2565b5f81556001016110e0565b600260408273ffffffffffffffffffffffffffffffffffffffff61111d60019561390a565b167fffffffffffffffffffffffff000000000000000000000000000000000000000086541617855560208101358486015501920192019190610c54565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610e17577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168303610e1757600c5f5260205f209060011b8101908360011b015b8181106111ce5750610c48565b5f80825560018201556002016111c1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6f776e657220616c7265616479207365740000000000000000000000000000006044820152fd5b3461021257602060031936011261021257611256612a81565b335f9081527f6e98191722f81699a429bb9aa1a53636666af1e598e3b4f3cab766e184f452fd60205260409020546112909060ff16612c80565b60105460ff8160a01c1691600483101561052e5767ffffffffffffffff80916112be60016112ca9614612d17565b169160a81c1614612d7c565b601080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055005b346102125760206003193601126102125773ffffffffffffffffffffffffffffffffffffffff611339612b29565b61134882600154163314612ebe565b1680156113a6576020817f3f8223bcd8b3b875473e9f9e14e1ad075451a2b5ffd31591655da9a01516bf5e927fffffffffffffffffffffffff00000000000000000000000000000000000000006010541617601055604051908152a1005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206d65737361676520627573000000000000000000000000006044820152fd5b34610212576020600319360112610212576004356004548110156102125773ffffffffffffffffffffffffffffffffffffffff611442602092612a3c565b90549060031b1c16604051908152f35b346102125760206003193601126102125760ff61146d612c21565b165f526006602052602060405f2054604051908152f35b346102125760206003193601126102125761149d612b29565b6004546114a981612aee565b916114b76040519384612acb565b818352601f196114c683612aee565b015f5b81811061160a5750505f5b82811061154257836040518091602082016020835281518091526020604084019201905f5b818110611507575050500390f35b8251805173ffffffffffffffffffffffffffffffffffffffff16855260209081015181860152869550604090940193909201916001016114f9565b8073ffffffffffffffffffffffffffffffffffffffff611563600193612a3c565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff61158983612a3c565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff6115ce8673ffffffffffffffffffffffffffffffffffffffff165f52600960205260405f2090565b91165f5260205260405f2054604051916115e783612aaf565b825260208201526115f88287612eaa565b526116038186612eaa565b50016114d4565b60209060405161161981612aaf565b5f81525f83820152828288010152016114c9565b3461021257604060031936011261021257611646612a81565b61164e612b06565b906010549060ff8260a01c1691600483101561052e5767ffffffffffffffff809161167c6116889515612d17565b60a81c16911614612d7c565b6040519081826020600454928381520160045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b925f5b8181106119a05750506116d592500383612acb565b6116fd8173ffffffffffffffffffffffffffffffffffffffff165f52600960205260405f2090565b6117078351612de1565b905f5b8451811015611755578073ffffffffffffffffffffffffffffffffffffffff8061173660019489612eaa565b5116165f528260205260405f205461174e8286612eaa565b520161170a565b848373ffffffffffffffffffffffffffffffffffffffff86165f52600860205260405f20545f198101908111610e17575f916011545f19810190811193845b610e175781811080611987575b156117ba57906117b2859392612fcc565b909192611794565b9293919083611966575f925b6007546117d38582612cfd565b91610e17576117e992861061193c575b50612de1565b925f5b845181101561184857806118346118266118118a61180c6001968a612d0a565b61322a565b6040939193519283918d602084019687612e12565b03601f198101835282612acb565b5190206118418288612eaa565b52016117ec565b5061186e6118608561185a8689612cfd565b906137a5565b91611869613a2b565b6137a5565b9061188461187f8251845190612d0a565b612de1565b925f5b82518110156118af578061189d60019285612eaa565b516118a88288612eaa565b5201611887565b50915f5b81518110156118e557806118c960019284612eaa565b516118de6118d8838751612d0a565b88612eaa565b52016118b3565b6118fe8486604051928392604084526040840190612bee565b8281036020840152602080835192838152019201905f5b818110611923575050500390f35b8251845285945060209384019390920191600101611915565b9061195a6119609261194d88612a54565b90549060031b1c90612cfd565b90612cfd565b876117e3565b5f198401848111610e175761197a90612a54565b90549060031b1c926117c6565b5061199181612a54565b90549060031b1c8410156117a1565b845473ffffffffffffffffffffffffffffffffffffffff168352600194850194879450602090930192016116c0565b34610212576020600319360112610212576102776119eb612a81565b612f23565b3461021257604060031936011261021257610277611a0c612b06565b611a2f73ffffffffffffffffffffffffffffffffffffffff600154163314612ebe565b6004356136b2565b34610212575f600319360112610212576020601454604051908152f35b34610212575f6003193601126102125760206040517f82531167a8e1b9df58acc5f105c04f72009b9ff406bf7d722b527a2f45d626ae8152f35b3461021257611a9c36612b4c565b611abf73ffffffffffffffffffffffffffffffffffffffff600154163314612ebe565b5f5b81518110156102775780611af773ffffffffffffffffffffffffffffffffffffffff611aef60019486612eaa565b5116856133cb565b01611ac1565b3461021257604060031936011261021257611b16612a81565b6024356010549160ff8360a01c1690600482101561052e5767ffffffffffffffff8091611b486002611b559514612d17565b169360a81c168314612d7c565b6401000000008111611e4c576011545f9080611e29576013545f60135580611dc9575b505b611b8682600754612cfd565b90818411611dc0575b84611b9985612de1565b60405180602060045491828152019060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b818110611d915750505081611be6910382612acb565b5f5b8487898310611cea57505050506020611c217fa798d21d4735fa640961e41c1c64c71ac1a880bed56cc8f53dd2e4fa0cd51f4d926132c4565b611c2a81613b0a565b50604051908152a38203611c9f575050740300000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff60105416176010557fb95c96f28d7bc16885c1b6299dcc3816b715899206a2e0939cce4c4c9bb2d5675f80a2005b611ca99250612d0a565b60135468010000000000000000811015610e4457611cd0816001611ce69301601355612a54565b81939154905f199060031b92831b921b19161790565b9055005b908394957fa25bb94fe19854415fd2a0f8e4fd236394453509acacc698f2062e624dd15dcf73ffffffffffffffffffffffffffffffffffffffff611d7e86611d3960019961180c83809a612d0a565b8c611d638d604096949651611d58816118268760208301958c87612e12565b519020948592612eaa565b52604051948594168452606060208501526060840190612bee565b9060408301520390a40190879291611be8565b825473ffffffffffffffffffffffffffffffffffffffff1684528b965060209093019260019283019201611bd0565b92508092611b8f565b60135f527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090017f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0905b818110611e1e5750611b78565b5f8155600101611e11565b90505f198101818111610e1757611e3f90612a54565b90549060031b1c90611b7a565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f746f6f206d616e79206c656176657300000000000000000000000000000000006044820152fd5b34610212576040600319360112610212576024356004355f52600360205260405f209081548110156102125761144273ffffffffffffffffffffffffffffffffffffffff91602093612a6c565b346102125760806003193601126102125760043567ffffffffffffffff811161021257611f28903690600401612a0e565b60243567ffffffffffffffff811161021257611f48903690600401612a0e565b60449291923563ffffffff811680910361021257335f9081527f6e98191722f81699a429bb9aa1a53636666af1e598e3b4f3cab766e184f452fd60205260409020546064359390611f9b9060ff16612c80565b821561096057843560f81c9560608267ffffffffffffffff600e5416895f52600660205260405f2054935f606473ffffffffffffffffffffffffffffffffffffffff82541693601f19601f6040519a8b98899788957fe04409530000000000000000000000000000000000000000000000000000000087526004870152604060248701528160448701528686013785858286010152011681010301925af18015612a03575f6080525f925f916129bf575b50036129615761205b83613a0f565b6120686040519182612acb565b8381526020810190368588011161021257848783375f6020868301015251902003612903576080515f52600a60205260405f20549180600511610212577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb90600186013560e01c60a0520192600d547f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610e175761210d9060031b85612cfd565b6121156131ed565b9081156128d65704906121288483612cfd565b8180821091180280821461287857612141911884612d0a565b925f198401938411610e175783905f60405195600d548088528760208101600d5f5260205f20925f5b81811061285f57505061217f92500388612acb565b5f5b8751811015612358576121948189612eaa565b518160051b82810460201483151715610e17576020810190818111610e17578b828c8f958388968660058a01926121ca93612ce5565b6121d391613a73565b14946121de91612eaa565b516121e890613b5f565b92604051958660208101957f696e76616c696420657874726120646174612c2077616e742000000000000000875280516020819201603984015e8101603981015f905203603901601f19810188526122409088612acb565b604051809560208201985180918a5e8101602081017f2c20676f742000000000000000000000000000000000000000000000000000009052036020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6810186526006016122ae9086612acb565b600501926122bb93612ce5565b6122c491613a73565b6122cd90613b5f565b604051938492518091602085015e820160208101915f83528051926020849201905e016020015f815203601f19810183526123089083612acb565b156123165750600101612181565b612354906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260206004840152602483019061397f565b0390fd5b5060045490888b8b61236985612de1565b93825f52600f60205260405f2063ffffffff60a051165f5260205273ffffffffffffffffffffffffffffffffffffffff60405f20541693885b82811115612543575b505050505f52600f60205260405f2063ffffffff60a051165f5260205273ffffffffffffffffffffffffffffffffffffffff60405f2091167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790555f5b8281106124c1575050506124ae575b6001820190818311610e175784916080515f52600a60205260405f205560405190815282602082015260a051907faa2e99aa1426572c50138d9cb252ab086ac0cf2ed651a30b81fdcdd7d91fb33e604060805192a45f198201918211610e17571461248257005b60a0516080517f90130bf22f1bea2132db4202b9b0ae35e2fc55b2439f38d0b50d65dc31bbb8485f80a4005b90505f198201828111610e17579061241b565b6124cb8183612eaa565b5173ffffffffffffffffffffffffffffffffffffffff6124ea83612a3c565b90549060031b1c165f52600560205261250860405f20918254612d0a565b9055600181018091111561240c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61254b6131ed565b9581870296808804831490151715610e1757601487018711610e175761257960148801888560058901612ce5565b90357fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116916014811061282a575b505060601c9081156128155773ffffffffffffffffffffffffffffffffffffffff82911610156127b75780966125dd8a612de1565b905f5b8b8110612637575050906126329291877fa1c1d72e52ad78c09577d70a91c799cef71f83af3699214c4d1f323a611aa8ab604051602081528061262a60a051956020830190612bee565b0390a4612fcc565b6123a2565b601482018211610e17577f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610e175761267a8160041b60148401612d0a565b906010820191828111610e1757600192612698918960058d01612ce5565b90357fffffffffffffffffffffffffffffffff0000000000000000000000000000000081169160108110612782575b505060801c73ffffffffffffffffffffffffffffffffffffffff6126ea83612a3c565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff61272f8873ffffffffffffffffffffffffffffffffffffffff165f52600960205260405f2090565b91165f5260205260405f20612745828254612d0a565b905561275086613ab0565b508c6127708361276a846127648386612eaa565b51612d0a565b92612eaa565b5261277b8286612eaa565b52016125e0565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000009250829060100360031b1b16165f806126c7565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6561726e657220616464726573736573206e6f7420736f7274656400000000006044820152fd5b965050505050509350600193898080806123ab565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009250829060140360031b1b16168f806125a8565b845483526001948501948c94506020909301920161216a565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6e6f206561726e65727320746f2070726f6365737300000000000000000000006044820152fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642063697263756974206f7574707574000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f766b48617368206d69736d6174636800000000000000000000000000000000006044820152fd5b9250506060823d6060116129fb575b816129db60609383612acb565b81010312610212578151916040602082015191015192608052918861204c565b3d91506129ce565b6040513d5f823e3d90fd5b9181601f840112156102125782359167ffffffffffffffff8311610212576020838186019501011161021257565b6004548110156109605760045f5260205f2001905f90565b6013548110156109605760135f5260205f2001905f90565b8054821015610960575f5260205f2001905f90565b6004359067ffffffffffffffff8216820361021257565b6024359067ffffffffffffffff8216820361021257565b6040810190811067ffffffffffffffff821117610e4457604052565b90601f601f19910116810190811067ffffffffffffffff821117610e4457604052565b67ffffffffffffffff8111610e445760051b60200190565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361021257565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361021257565b90604060031983011261021257600435916024359067ffffffffffffffff8211610212578060238301121561021257816004013590612b8a82612aee565b92612b986040519485612acb565b8284526024602085019360051b82010191821161021257602401915b818310612bc15750505090565b823573ffffffffffffffffffffffffffffffffffffffff8116810361021257815260209283019201612bb4565b90602080835192838152019201905f5b818110612c0b5750505090565b8251845260209384019390920191600101612bfe565b6004359060ff8216820361021257565b60206040818301928281528451809452019201905f5b818110612c545750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612c47565b15612c8757565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f756e617574686f72697a656420726f6c650000000000000000000000000000006044820152fd5b90939293848311610212578411610212578101920390565b91908203918211610e1757565b91908201809211610e1757565b15612d1e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964207374617465000000000000000000000000000000000000006044820152fd5b15612d8357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c69642065706f6368000000000000000000000000000000000000006044820152fd5b90612deb82612aee565b612df86040519182612acb565b828152601f19612e088294612aee565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060149260601b1681520160208251919201905f5b818110612e7e5750505060208251919201905f5b818110612e685750505090565b8251845260209384019390920191600101612e5b565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612e47565b80518210156109605760209160051b010190565b15612ec557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6010549060ff8260a01c1691600483101561052e5767ffffffffffffffff809161167c6003612f529614612d17565b612f62612f5d613a2b565b6132c4565b6014557fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6010541660105567ffffffffffffffff60105460a81c167f149bb8e98c16d440ac1f1a03a4d3c2d93d9011a48aba5ab0e47386c72c6cd4f86020601454604051908152a2565b5f198114610e175760010190565b6010549173ffffffffffffffffffffffffffffffffffffffff8316801561318f5760ff8460a01c16600481101561052e576130159015612d17565b60145480156131315767ffffffffffffffff6040519560a81c166020860152604085015260408452613048606085612acb565b803b156102125767ffffffffffffffff5f9173ffffffffffffffffffffffffffffffffffffffff6130c195604051968794859384937f9f3ce55a0000000000000000000000000000000000000000000000000000000085521697886004850152169889602484015260606044840152606483019061397f565b039134905af1908115612a03577f5e75c954485522570d62fa9a8bf6ed6e90b5f600bb37b2467baa36d0661626fb92606092613121575b5067ffffffffffffffff60105460a81c16936014549160405192835260208301526040820152a2565b5f61312b91612acb565b5f6130f8565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f746f7020726f6f74206e6f742067656e657261746564000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d65737361676520627573206e6f7420736574000000000000000000000000006044820152fd5b6004547f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610e175760041b60140180601411610e175790565b61324d73ffffffffffffffffffffffffffffffffffffffff919392936007612a6c565b90549060031b1c1690815f52600960205260405f2061326c8451612de1565b915f5b85518110156132ba578073ffffffffffffffffffffffffffffffffffffffff8061329b6001948a612eaa565b5116165f528360205260405f20546132b38287612eaa565b520161326f565b5092919350509190565b908151156133c6575b815160018111156133b65760018101809111610e17576132ef9060011c612de1565b905f5b83515f198101908111610e1757811015613378576133108185612eaa565b516001820190818311610e175761332a6133319287612eaa565b5190613a8f565b61333e8260011c85612eaa565b5260028101809111156132f2577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b909280515f198101908111610e17578214613396575b5050906132cd565b6133a3826133ae92612eaa565b519160011c83612eaa565b525f8061338e565b5090805115610960576020015190565b5f9150565b90815f52600260205260405f2073ffffffffffffffffffffffffffffffffffffffff82165f5260205260ff60405f2054161561362a57815f52600360205260405f20908154925f198401938411610e17575f5b83548110156135cc5773ffffffffffffffffffffffffffffffffffffffff6134468286612a6c565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8416146134725760010161341e565b8481959293949510613591575b50508254928315613564575f197f155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a529401906134ba8282612a6c565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555805f52600260205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905561355f6040519283928390929173ffffffffffffffffffffffffffffffffffffffff6020916040840195845216910152565b0390a1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b610dde73ffffffffffffffffffffffffffffffffffffffff6135b66135c59488612a6c565b90549060031b1c169186612a6c565b5f8061347f565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f726f6c65206163636f756e74206e6f7420666f756e64000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f742068617320726f6c6500000000000000000000000000000000000000006044820152fd5b9081549168010000000000000000831015610e445782610dde9160016136b095018155612a6c565b565b90815f52600260205260405f2073ffffffffffffffffffffffffffffffffffffffff82165f5260205260ff60405f20541661104257817f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3925f52600360205261371e8260405f20613688565b805f52600260205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905561355f6040519283928390929173ffffffffffffffffffffffffffffffffffffffff6020916040840195845216910152565b91610420604051906137b78183612acb565b6020825250610400366020830137805f935b855160018111156138ff576001161580156138ea575b6138c1575b60011c90855160018101809111610e17576138019060011c612de1565b945f5b87515f198101908111610e1757811015613883576138228189612eaa565b516001820190818311610e175761332a61383c928b612eaa565b6138498260011c89612eaa565b526002810180911115613804577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b909396959194929580515f198101908111610e175782146138ac575b50509491939290926137c9565b6133a3826138b992612eaa565b525f8061389f565b936138e4906138d36001871888612eaa565b516138de8285612eaa565b52612fcc565b936137e4565b5085515f198101908111610e175781106137df565b505090935091909152565b3573ffffffffffffffffffffffffffffffffffffffff811681036102125790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610212570180359067ffffffffffffffff821161021257602001918160061b3603831361021257565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff80600154921691827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b67ffffffffffffffff8111610e4457601f01601f191660200190565b60405190601154808352826020810160115f5260205f20925f5b818110613a5a5750506136b092500383612acb565b8454835260019485019487945060209093019201613a45565b359060208110613a81575090565b5f199060200360031b1b1690565b81811015613aa3575f5260205260405f2090565b905f5260205260405f2090565b805f52600860205260405f2054155f14613b055760075468010000000000000000811015610e4457613aee611cd08260018594016007556007612a6c565b9055600754905f52600860205260405f2055600190565b505f90565b805f52601260205260405f2054155f14613b055760115468010000000000000000811015610e4457613b48611cd08260018594016011556011612a6c565b9055601154905f52601260205260405f2055600190565b60016fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b1760ff83821c119060031c1701818160011b927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168303610e17576002840193848111610e1757613c09613bf386613a0f565b95613c016040519788612acb565b808752613a0f565b601f196020870191013682378551156109605760309053845160011015610960576078602186015360018101809111610e17575b60018111613c7d5750613c4f57505090565b7fe22e27eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b90600f81166010811015610960578551831015610960577f3031323334353637383961626364656600000000000000000000000000000000901a8583016020015360041c908015610e17575f1901613c3d56fea2646970667358221220ea67adebad2c5391efb03ca4c5be17a40eed445819bea148d620ffbbce61207464736f6c634300081d0033