More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,841 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Creator Claim | 18588745 | 406 days ago | IN | 0 ETH | 0.00169851 | ||||
Winner Claim | 18585718 | 406 days ago | IN | 0 ETH | 0.00621355 | ||||
Draw | 18582470 | 407 days ago | IN | 0 ETH | 0.00282664 | ||||
Buy Entry | 18582387 | 407 days ago | IN | 0.006 ETH | 0.00186331 | ||||
Buy Entry | 18582119 | 407 days ago | IN | 0.006 ETH | 0.0023499 | ||||
Buy Entry | 18581579 | 407 days ago | IN | 0.012 ETH | 0.00275918 | ||||
Buy Entry | 18581110 | 407 days ago | IN | 0.039 ETH | 0.00264638 | ||||
Buy Entry | 18575760 | 408 days ago | IN | 0.018 ETH | 0.00255827 | ||||
Buy Entry | 18575224 | 408 days ago | IN | 0.006 ETH | 0.00200487 | ||||
Buy Entry | 18572888 | 408 days ago | IN | 0.012 ETH | 0.00277356 | ||||
Creator Claim | 18561759 | 410 days ago | IN | 0 ETH | 0.00213859 | ||||
Creator Claim | 18561756 | 410 days ago | IN | 0 ETH | 0.00199303 | ||||
Winner Claim | 18558608 | 410 days ago | IN | 0 ETH | 0.00328624 | ||||
Buy Entry | 18553119 | 411 days ago | IN | 0.009 ETH | 0.00197152 | ||||
Creator Claim | 18552687 | 411 days ago | IN | 0 ETH | 0.0015633 | ||||
Buy Entry | 18548804 | 411 days ago | IN | 0.003 ETH | 0.00208361 | ||||
Buy Entry | 18548408 | 412 days ago | IN | 0.003 ETH | 0.00204934 | ||||
Winner Claim | 18547030 | 412 days ago | IN | 0 ETH | 0.00307498 | ||||
Creator Claim | 18546727 | 412 days ago | IN | 0 ETH | 0.00142855 | ||||
Buy Entry | 18546430 | 412 days ago | IN | 0.003 ETH | 0.00184136 | ||||
Draw | 18546308 | 412 days ago | IN | 0 ETH | 0.00324407 | ||||
Buy Entry | 18546272 | 412 days ago | IN | 0.036 ETH | 0.00208055 | ||||
Buy Entry | 18546186 | 412 days ago | IN | 0.018 ETH | 0.00195182 | ||||
Buy Entry | 18545759 | 412 days ago | IN | 0.012 ETH | 0.00215019 | ||||
Buy Entry | 18545734 | 412 days ago | IN | 0.039 ETH | 0.00289941 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18588745 | 406 days ago | 0.18362964 ETH | ||||
18588745 | 406 days ago | 0.01137035 ETH | ||||
18561759 | 410 days ago | 0.24011854 ETH | ||||
18561759 | 410 days ago | 0.00988145 ETH | ||||
18561756 | 410 days ago | 0.66395459 ETH | ||||
18561756 | 410 days ago | 0.0240454 ETH | ||||
18552687 | 411 days ago | 0.5753164 ETH | ||||
18552687 | 411 days ago | 0.02468359 ETH | ||||
18546727 | 412 days ago | 0.26644202 ETH | ||||
18546727 | 412 days ago | 0.01555797 ETH | ||||
18542653 | 412 days ago | 0.06 ETH | ||||
18539693 | 413 days ago | 0.012 ETH | ||||
18539693 | 413 days ago | 0.006 ETH | ||||
18539693 | 413 days ago | 0.006 ETH | ||||
18539124 | 413 days ago | 0.2258094 ETH | ||||
18539124 | 413 days ago | 0.01419059 ETH | ||||
18538731 | 413 days ago | 0.114451 ETH | ||||
18538731 | 413 days ago | 0.01154899 ETH | ||||
18532926 | 414 days ago | 0.33591008 ETH | ||||
18532926 | 414 days ago | 0.01408991 ETH | ||||
18532922 | 414 days ago | 0.31507369 ETH | ||||
18532922 | 414 days ago | 0.0149263 ETH | ||||
18493151 | 419 days ago | 0.57479375 ETH | ||||
18493151 | 419 days ago | 0.02520624 ETH | ||||
18474532 | 422 days ago | 0.50082745 ETH |
Loading...
Loading
Contract Name:
PanzRaffle
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-14 */ // File: @chainlink/contracts/src/v0.8/interfaces/OwnableInterface.sol pragma solidity ^0.8.0; interface OwnableInterface { function owner() external returns (address); function transferOwnership(address recipient) external; function acceptOwnership() external; } // File: @chainlink/contracts/src/v0.8/ConfirmedOwnerWithProposal.sol pragma solidity ^0.8.0; /** * @title The ConfirmedOwner contract * @notice A contract with helpers for basic contract ownership. */ contract ConfirmedOwnerWithProposal is OwnableInterface { address private s_owner; address private s_pendingOwner; event OwnershipTransferRequested(address indexed from, address indexed to); event OwnershipTransferred(address indexed from, address indexed to); constructor(address newOwner, address pendingOwner) { require(newOwner != address(0), "Cannot set owner to zero"); s_owner = newOwner; if (pendingOwner != address(0)) { _transferOwnership(pendingOwner); } } /** * @notice Allows an owner to begin transferring ownership to a new address, * pending. */ function transferOwnership(address to) public override onlyOwner { _transferOwnership(to); } /** * @notice Allows an ownership transfer to be completed by the recipient. */ function acceptOwnership() external override { require(msg.sender == s_pendingOwner, "Must be proposed owner"); address oldOwner = s_owner; s_owner = msg.sender; s_pendingOwner = address(0); emit OwnershipTransferred(oldOwner, msg.sender); } /** * @notice Get the current owner */ function owner() public view override returns (address) { return s_owner; } /** * @notice validate, transfer ownership, and emit relevant events */ function _transferOwnership(address to) private { require(to != msg.sender, "Cannot transfer to self"); s_pendingOwner = to; emit OwnershipTransferRequested(s_owner, to); } /** * @notice validate access */ function _validateOwnership() internal view { require(msg.sender == s_owner, "Only callable by owner"); } /** * @notice Reverts if called by anyone other than the contract owner. */ modifier onlyOwner() { _validateOwnership(); _; } } // File: @chainlink/contracts/src/v0.8/ConfirmedOwner.sol pragma solidity ^0.8.0; /** * @title The ConfirmedOwner contract * @notice A contract with helpers for basic contract ownership. */ contract ConfirmedOwner is ConfirmedOwnerWithProposal { constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {} } // File: @chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _vrfCoordinator; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } } // File: @chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * @param callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * @param numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint64 subId) external; /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint64 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint64 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint64 subId, address to) external; /* * @notice Check to see if there exists a request commitment consumers * for all consumers and keyhashes for a given sub. * @param subId - ID of the subscription * @return true if there exists at least one unfulfilled request for the subscription, false * otherwise. */ function pendingRequestExists(uint64 subId) external view returns (bool); } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/RaffleTypes.sol pragma solidity >=0.8.0 <0.9.0; enum STATUS { NORMAL, CANCELLED, DRAWNIG, DRAWED, CLAIMED } enum CLAIM_TYPE { CREATOR, WINNER } struct RaffleStruct { address nftAddress; uint32 nftId; uint32 expirationTime; uint16 totalSupply; uint16 currentSupply; address creator; uint32 price; // max 100000000(*1e12), max = 100e uint16 randomIndex; bool settled; // Whether creator earnings are settled STATUS status; address holder_1; // Holders of NFT collections, maximum 3 address holder_2; address holder_3; } struct Config { uint64 subId; uint64 raffleIndex; uint32 vrfGasLimit; uint16 vrfConfirms; uint16 maxSupply; uint32 maxDuration; // maximum duration seconds of raffle address platformFeeReceiver; // wallet to receive platform fee uint32 platformFee; // 2%, divide 10000 bytes32 keyHash; // VRF keyhash } struct EntriesBought { address owner; uint16 currentIndex; // Current bought position uint16 entryNum; // number of entries uint32 ticketId; // index of entriesMap } struct ClaimData { uint256 linkFee; uint32 platformFeeOff; bytes signature; } // File: contracts/PanzRaffle.sol pragma solidity >=0.8.0 <0.9.0; contract PanzRaffle is AccessControl, ReentrancyGuard, VRFConsumerBaseV2, ConfirmedOwner { Config public config; VRFCoordinatorV2Interface private coordinator; bytes32 private constant OPERATOR_ROLE = keccak256("OPERATOR"); mapping(uint64 => RaffleStruct) public raffleMap; mapping(uint64 => EntriesBought[]) public entriesMap; mapping(uint256 => uint64) public randomRaffleMap; event RaffleCreate(uint64 indexed _raffleId, address indexed _nftAddress, uint32 indexed _nftId); event RaffleSold(uint64 indexed _raffleId, uint32 indexed _ticketId, address indexed _owner); event RaffleClaim(uint64 indexed _raffleId, address indexed _user, CLAIM_TYPE _type); event RaffleStatus(uint64 indexed _raffleId, STATUS indexed status); event ConfigChanged(uint32 _fee, address _feeReceiver); // GOERLI: // Coordinator: 0x2Ca8E0C643bDe4C2E08ab1fA0da3401AdAD7734D // KeyHash: 0x79d3d8832d904592c0bf9818b621522c988bb8b0c05cdc3b15aea1b6e8db0c15 // MAINNET: // Coordinator: 0x271682DEB8C4E0901D1a1550aD2e64D568E69909 // KeyHash: 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef constructor(uint64 _subId, address _vrfCoordinator, bytes32 _keyHash) VRFConsumerBaseV2(_vrfCoordinator) ConfirmedOwner(msg.sender) { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); config = Config({ subId: _subId, raffleIndex: 0, vrfGasLimit: 200000, vrfConfirms: 5, maxSupply: 10000, maxDuration: 2592000, platformFeeReceiver: msg.sender, platformFee: 200, keyHash: _keyHash }); coordinator = VRFCoordinatorV2Interface(_vrfCoordinator); } // NFT Approve is required before calling function createRaffle(address _nftAddress, uint32 _nftId, uint32 _price, uint32 _expirationTime, uint16 _totalSupply, address[] memory _holderArray) external nonReentrant returns (uint64) { uint32 duration = _expirationTime - uint32(block.timestamp); if (duration < 86400 || duration > config.maxDuration) revert("DurationLimited"); if (_totalSupply < 10 || _totalSupply > config.maxSupply) revert("SupplyLimited"); if (_price < 1000 || _price > 100000000) revert("Price limit 0.001~100e"); // The maximum number of holder conditions can only be set to 3, and cannot be set to empty uint256 holderLenght = _holderArray.length; if (holderLenght > 3) revert("Holder Illegal"); for (uint256 i = 0; i < holderLenght; i++) { if (_holderArray[i] == address(0)) revert("Holder Illegal"); } IERC721 asset = IERC721(_nftAddress); asset.transferFrom(msg.sender, address(this), _nftId); RaffleStruct memory raffle = RaffleStruct({ nftAddress: _nftAddress, nftId: _nftId, expirationTime: _expirationTime, totalSupply: _totalSupply, currentSupply: 0, creator: msg.sender, price: _price, randomIndex: 0, settled: false, status: STATUS.NORMAL, holder_1: holderLenght > 0 ? _holderArray[0] : address(0), holder_2: holderLenght > 1 ? _holderArray[1] : address(0), holder_3: holderLenght > 2 ? _holderArray[2] : address(0) }); raffleMap[++config.raffleIndex] = raffle; emit RaffleCreate(config.raffleIndex, _nftAddress, _nftId); return config.raffleIndex; } function buyEntry(uint64 _raffleId, uint16 _qty) external payable nonReentrant { entry(_raffleId, _qty, msg.sender); } function presentEntry(uint64 _raffleId, uint16 _qty, address _receiptAddress) external payable nonReentrant { entry(_raffleId, _qty, _receiptAddress); } function entry(uint64 _raffleId, uint16 _qty, address _receiptAddress) internal { RaffleStruct memory raffle = raffleMap[_raffleId]; if (raffle.status != STATUS.NORMAL) revert("Wrong status"); if (msg.sender == raffle.creator) revert("Disallow creator"); if (msg.value != uint256(raffle.price) * _qty * 1e12) revert("Incorrect amount"); if (_qty == 0 || _qty > raffle.totalSupply - raffle.currentSupply) revert("Wrong entries"); // check holder only if (checkHolder(raffle.holder_1, msg.sender, true) || checkHolder(raffle.holder_2, msg.sender, false) || checkHolder(raffle.holder_3, msg.sender, false)) { uint32 ticketId = uint32(entriesMap[_raffleId].length); EntriesBought memory entryBought = EntriesBought({ owner: _receiptAddress, currentIndex: raffle.currentSupply + _qty, entryNum: _qty, ticketId: ticketId }); entriesMap[_raffleId].push(entryBought); raffleMap[_raffleId].currentSupply += _qty; emit RaffleSold(_raffleId, ticketId, msg.sender); } else { revert("Not allowed holder"); } } function checkHolder(address _nftAddress, address _userAddress, bool _default) internal view returns (bool) { if (_nftAddress == address(0)) return _default; IERC721 asset = IERC721(_nftAddress); return asset.balanceOf(_userAddress) > 0; } function draw(uint64 _raffleId) external nonReentrant onlyRole(OPERATOR_ROLE) { RaffleStruct memory raffle = raffleMap[_raffleId]; // Unsold entries cannot draw if (raffle.status != STATUS.NORMAL || raffle.currentSupply == 0) revert("Wrong status"); if (raffle.currentSupply == raffle.totalSupply || block.timestamp > uint256(raffle.expirationTime)) { requestRandomNumber(_raffleId); raffleMap[_raffleId].status = STATUS.DRAWNIG; } else { // Not sold out and under the deadline revert("Not sold out & deadline"); } emit RaffleStatus(_raffleId, STATUS.DRAWNIG); } function cancelRaffle(uint64 _raffleId) external nonReentrant { RaffleStruct memory raffle = raffleMap[_raffleId]; if (msg.sender != raffle.creator) revert("Not owned"); if (raffle.currentSupply > 0) revert("Already sold"); IERC721 asset = IERC721(raffle.nftAddress); asset.transferFrom(address(this), msg.sender, raffle.nftId); raffleMap[_raffleId].status = STATUS.CANCELLED; emit RaffleStatus(_raffleId, STATUS.CANCELLED); } function requestRandomNumber(uint64 _raffleId) internal { uint256 requestId = coordinator.requestRandomWords(config.keyHash, config.subId, config.vrfConfirms, config.vrfGasLimit, 3); randomRaffleMap[requestId] = _raffleId; } function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal override { uint64 raffleId = randomRaffleMap[_requestId]; RaffleStruct memory raffle = raffleMap[raffleId]; // random index in [1 - sold numbers] uint256 randomIndex = (_randomWords[0] % raffle.currentSupply) + 1; raffleMap[raffleId].randomIndex = uint16(randomIndex); raffleMap[raffleId].status = STATUS.DRAWED; emit RaffleStatus(raffleId, STATUS.DRAWED); } function winnerClaim(uint64 _raffleId) external nonReentrant { RaffleStruct memory raffle = raffleMap[_raffleId]; if (raffle.status != STATUS.DRAWED || raffle.currentSupply == 0) revert("Wrong status"); address winner = calRandomWinner(_raffleId, raffle.randomIndex); if (winner != msg.sender) revert("Not the winner"); IERC721 asset = IERC721(raffle.nftAddress); asset.transferFrom(address(this), winner, raffle.nftId); raffleMap[_raffleId].status = STATUS.CLAIMED; emit RaffleClaim(_raffleId, msg.sender, CLAIM_TYPE.WINNER); } function creatorClaim(uint64 _raffleId, ClaimData memory _claimData) external nonReentrant { if (_claimData.platformFeeOff > config.platformFee) revert("InvalidParams"); if (!verifySignature(_raffleId, _claimData)) revert("Signature invalid"); RaffleStruct memory raffle = raffleMap[_raffleId]; if (raffle.settled) revert("Creator claimed"); if (raffle.creator != msg.sender) revert("Not the creator"); if (raffle.status != STATUS.DRAWED && raffle.status != STATUS.CLAIMED) revert("Wrong status"); unchecked { uint32 platformFee = config.platformFee - _claimData.platformFeeOff; uint256 amountRaised = uint256(raffle.price) * raffle.currentSupply * 1e12; uint256 amountForPlatform = amountRaised * platformFee / 10000 + _claimData.linkFee; if (amountRaised > amountForPlatform) { (bool sent, ) = config.platformFeeReceiver.call{value: amountForPlatform}(""); if (!sent) revert("Failed to pay platform"); uint256 amountForCreator = amountRaised - amountForPlatform; (bool sentS, ) = raffle.creator.call{value: amountForCreator}(""); if (!sentS) revert("Failed to pay creator"); } else { // sales can not cover the platform fee & chainlink fee (bool sent, ) = config.platformFeeReceiver.call{value: amountRaised}(""); if (!sent) revert("Failed to pay platform"); } } raffleMap[_raffleId].settled = true; emit RaffleClaim(_raffleId, msg.sender, CLAIM_TYPE.CREATOR); } function calRandomWinner(uint64 _raffleId, uint256 _randomIndex) public view returns (address) { uint256 position = findUpperBound(entriesMap[_raffleId], _randomIndex); return entriesMap[_raffleId][position].owner; } /// https://docs.openzeppelin.com/contracts/3.x/api/utils#Arrays-findUpperBound-uint256---uint256- function findUpperBound(EntriesBought[] memory array, uint256 randomIndex) internal pure returns (uint256) { if (array.length == 0) return 0; uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); if (array[mid].currentIndex > randomIndex) { high = mid; } else { low = mid + 1; } } if (low > 0 && array[low - 1].currentIndex == randomIndex) { return low - 1; } else { return low; } } // Verifying the signer role function verifySignature(uint64 _raffleId, ClaimData memory _claimData) internal view returns (bool) { bytes32 messagehash = keccak256(abi.encodePacked(_raffleId, _claimData.platformFeeOff, _claimData.linkFee, address(this), getChainID())); address signer = ECDSA.recover(ECDSA.toEthSignedMessageHash(messagehash), _claimData.signature); return hasRole(OPERATOR_ROLE, signer); } function setPlatformFee(uint32 _fee, address payable _feeReceiver) external onlyRole(DEFAULT_ADMIN_ROLE) { config.platformFee = _fee; config.platformFeeReceiver = _feeReceiver; emit ConfigChanged(_fee, _feeReceiver); } function setMaximum(uint32 _maxDuration, uint16 _maxSupply) external onlyRole(DEFAULT_ADMIN_ROLE) { config.maxDuration = _maxDuration; config.maxSupply = _maxSupply; } function setChainlink(uint64 _subId, bytes32 _keyHash, uint32 _vrfGasLimit, uint16 _vrfConfirms) external onlyRole(DEFAULT_ADMIN_ROLE) { config.subId = _subId; config.keyHash = _keyHash; config.vrfGasLimit = _vrfGasLimit; config.vrfConfirms = _vrfConfirms; } function getEntriesBought(uint64 _raffleId) external view returns (EntriesBought[] memory) { return entriesMap[_raffleId]; } function getChainID() private view returns (uint256 id) { assembly { id := chainid() } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint64","name":"_subId","type":"uint64"},{"internalType":"address","name":"_vrfCoordinator","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"_fee","type":"uint32"},{"indexed":false,"internalType":"address","name":"_feeReceiver","type":"address"}],"name":"ConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"_raffleId","type":"uint64"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"enum CLAIM_TYPE","name":"_type","type":"uint8"}],"name":"RaffleClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"_raffleId","type":"uint64"},{"indexed":true,"internalType":"address","name":"_nftAddress","type":"address"},{"indexed":true,"internalType":"uint32","name":"_nftId","type":"uint32"}],"name":"RaffleCreate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"_raffleId","type":"uint64"},{"indexed":true,"internalType":"uint32","name":"_ticketId","type":"uint32"},{"indexed":true,"internalType":"address","name":"_owner","type":"address"}],"name":"RaffleSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"_raffleId","type":"uint64"},{"indexed":true,"internalType":"enum STATUS","name":"status","type":"uint8"}],"name":"RaffleStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"},{"internalType":"uint16","name":"_qty","type":"uint16"}],"name":"buyEntry","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"},{"internalType":"uint256","name":"_randomIndex","type":"uint256"}],"name":"calRandomWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"}],"name":"cancelRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint64","name":"subId","type":"uint64"},{"internalType":"uint64","name":"raffleIndex","type":"uint64"},{"internalType":"uint32","name":"vrfGasLimit","type":"uint32"},{"internalType":"uint16","name":"vrfConfirms","type":"uint16"},{"internalType":"uint16","name":"maxSupply","type":"uint16"},{"internalType":"uint32","name":"maxDuration","type":"uint32"},{"internalType":"address","name":"platformFeeReceiver","type":"address"},{"internalType":"uint32","name":"platformFee","type":"uint32"},{"internalType":"bytes32","name":"keyHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint32","name":"_nftId","type":"uint32"},{"internalType":"uint32","name":"_price","type":"uint32"},{"internalType":"uint32","name":"_expirationTime","type":"uint32"},{"internalType":"uint16","name":"_totalSupply","type":"uint16"},{"internalType":"address[]","name":"_holderArray","type":"address[]"}],"name":"createRaffle","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"},{"components":[{"internalType":"uint256","name":"linkFee","type":"uint256"},{"internalType":"uint32","name":"platformFeeOff","type":"uint32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct ClaimData","name":"_claimData","type":"tuple"}],"name":"creatorClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"}],"name":"draw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entriesMap","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint16","name":"currentIndex","type":"uint16"},{"internalType":"uint16","name":"entryNum","type":"uint16"},{"internalType":"uint32","name":"ticketId","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"}],"name":"getEntriesBought","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint16","name":"currentIndex","type":"uint16"},{"internalType":"uint16","name":"entryNum","type":"uint16"},{"internalType":"uint32","name":"ticketId","type":"uint32"}],"internalType":"struct EntriesBought[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"},{"internalType":"uint16","name":"_qty","type":"uint16"},{"internalType":"address","name":"_receiptAddress","type":"address"}],"name":"presentEntry","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"raffleMap","outputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint32","name":"nftId","type":"uint32"},{"internalType":"uint32","name":"expirationTime","type":"uint32"},{"internalType":"uint16","name":"totalSupply","type":"uint16"},{"internalType":"uint16","name":"currentSupply","type":"uint16"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint32","name":"price","type":"uint32"},{"internalType":"uint16","name":"randomIndex","type":"uint16"},{"internalType":"bool","name":"settled","type":"bool"},{"internalType":"enum STATUS","name":"status","type":"uint8"},{"internalType":"address","name":"holder_1","type":"address"},{"internalType":"address","name":"holder_2","type":"address"},{"internalType":"address","name":"holder_3","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"randomRaffleMap","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_subId","type":"uint64"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"uint32","name":"_vrfGasLimit","type":"uint32"},{"internalType":"uint16","name":"_vrfConfirms","type":"uint16"}],"name":"setChainlink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxDuration","type":"uint32"},{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaximum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_fee","type":"uint32"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"setPlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_raffleId","type":"uint64"}],"name":"winnerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162003d4738038062003d47833981016040819052620000349162000314565b600180556001600160a01b03821660805233806000816200009c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0384811691909117909155811615620000cf57620000cf81620001b8565b50620000e19150600090503362000264565b60408051610120810182526001600160401b03949094168085526000602086015262030d4091850191909152600560608501819052612710608086015262278d0060a08601523360c0860181905260c860e0870152610100909501839052600480546001600160a01b0319908116909317610c3560861b17600160a01b600160e01b03191666278d002710000560a01b17905580546001600160c01b03191663ffffffff60a01b1990951694909417601960a31b17909355600655600780549092166001600160a01b039190911617905562000372565b336001600160a01b03821603620002125760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000093565b600380546001600160a01b0319166001600160a01b03838116918217909255600254604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b62000270828262000274565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000270576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002d03390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000806000606084860312156200032a57600080fd5b83516001600160401b03811681146200034257600080fd5b60208501519093506001600160a01b03811681146200036057600080fd5b80925050604084015190509250925092565b6080516139b26200039560003960008181610f430152610f8501526139b26000f3fe60806040526004361061019c5760003560e01c806375804e31116100ec578063a7b025791161008a578063d547741f11610064578063d547741f14610685578063f2fde38b146106a5578063fa98b00a146106c5578063fb1c8bf3146106e557600080fd5b8063a7b0257914610625578063b12acb7714610645578063c0b4b5341461066557600080fd5b80637adc7689116100c65780637adc7689146105845780638da5cb5b146105d257806391d14854146105f0578063a217fddf1461061057600080fd5b806375804e311461046e57806379502c551461048e57806379ba50971461056f57600080fd5b80632e038d061161015957806336568abe1161013357806336568abe1461032e5780633a4ad6af1461034e5780634ac09d1f146103865780636dffa28b1461044e57600080fd5b80632e038d06146102a35780632f2ff15d146102fb57806333cec5b51461031b57600080fd5b806301ffc9a7146101a15780631315b62d146101d6578063175c11b6146101f85780631fe543e314610218578063248a9ca3146102385780632ba627db14610276575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004613034565b6106f8565b60405190151581526020015b60405180910390f35b3480156101e257600080fd5b506101f66101f136600461307a565b61072f565b005b34801561020457600080fd5b506101f6610213366004613117565b6109be565b34801561022457600080fd5b506101f6610233366004613228565b610f38565b34801561024457600080fd5b506102686102533660046132c9565b60009081526020819052604090206001015490565b6040519081526020016101cd565b34801561028257600080fd5b5061029661029136600461307a565b610fbc565b6040516101cd91906132e2565b3480156102af57600080fd5b506102c36102be36600461335c565b61106c565b604080516001600160a01b0395909516855261ffff9384166020860152919092169083015263ffffffff1660608201526080016101cd565b34801561030757600080fd5b506101f661031636600461339b565b6110c8565b6101f66103293660046133dd565b6110f2565b34801561033a57600080fd5b506101f661034936600461339b565b61110e565b34801561035a57600080fd5b5061036e61036936600461335c565b611188565b6040516001600160a01b0390911681526020016101cd565b34801561039257600080fd5b506104356103a136600461307a565b600860205260009081526040902080546001820154600283015460038401546004909401546001600160a01b038085169563ffffffff600160a01b808804821697600160c01b80820484169861ffff600160e01b8404811699600160f01b9094048116988289169895830490961696928204169460ff600160d01b8304811695600160d81b9093041693821692821691168d565b6040516101cd9d9c9b9a9998979695949392919061344e565b34801561045a57600080fd5b506101f6610469366004613503565b611284565b34801561047a57600080fd5b506101f6610489366004613536565b6112d3565b34801561049a57600080fd5b50600454600554600654610508926001600160401b0380821693600160401b83049091169263ffffffff600160801b840481169361ffff600160a01b808304821695600160b01b840490921694600160c01b9093048416936001600160a01b03831693919092049091169089565b604080516001600160401b039a8b1681529990981660208a015263ffffffff9687169789019790975261ffff9485166060890152939092166080870152831660a08601526001600160a01b031660c08501521660e0830152610100820152610120016101cd565b34801561057b57600080fd5b506101f661133f565b34801561059057600080fd5b506105ba61059f3660046132c9565b600a602052600090815260409020546001600160401b031681565b6040516001600160401b0390911681526020016101cd565b3480156105de57600080fd5b506002546001600160a01b031661036e565b3480156105fc57600080fd5b506101c161060b36600461339b565b6113ed565b34801561061c57600080fd5b50610268600081565b34801561063157600080fd5b506101f661064036600461307a565b611416565b34801561065157600080fd5b506101f6610660366004613583565b6116b9565b34801561067157600080fd5b506101f661068036600461307a565b61173e565b34801561069157600080fd5b506101f66106a036600461339b565b61197e565b3480156106b157600080fd5b506101f66106c03660046135af565b6119a3565b3480156106d157600080fd5b506105ba6106e03660046135cc565b6119b4565b6101f66106f33660046136bb565b611f77565b60006001600160e01b03198216637965db0b60e01b148061072957506301ffc9a760e01b6001600160e01b03198316145b92915050565b610737611f93565b7f523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0c61076181611fec565b6001600160401b038216600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b900416600481111561083457610834613424565b600481111561084557610845613424565b815260028201546001600160a01b03908116602083015260038301548116604083015260049092015490911660609091015290506000816101200151600481111561089257610892613424565b1415806108a55750608081015161ffff16155b156108cb5760405162461bcd60e51b81526004016108c2906136d7565b60405180910390fd5b806060015161ffff16816080015161ffff1614806108f25750806040015163ffffffff1642115b156109315761090083611ff6565b6001600160401b0383166000908152600860205260409020600101805460ff60d81b1916600160d91b179055610979565b60405162461bcd60e51b815260206004820152601760248201527f4e6f7420736f6c64206f7574202620646561646c696e6500000000000000000060448201526064016108c2565b60025b6040516001600160401b038516907f9961e08d55a14c7af332ec57532cf095bc07cdafc04a8ec47efd096d074e759a90600090a350506109bb60018055565b50565b6109c6611f93565b600554602082015163ffffffff600160a01b909204821691161115610a1d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964506172616d7360981b60448201526064016108c2565b610a2782826120d7565b610a675760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c99481a5b9d985b1a59607a1b60448201526064016108c2565b6001600160401b038216600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b9004166004811115610b3a57610b3a613424565b6004811115610b4b57610b4b613424565b815260028201546001600160a01b03908116602083015260038301548116604083015260049092015490911660609091015261010081015190915015610bc55760405162461bcd60e51b815260206004820152600f60248201526e10dc99585d1bdc8818db185a5b5959608a1b60448201526064016108c2565b60a08101516001600160a01b03163314610c135760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a34329031b932b0ba37b960891b60448201526064016108c2565b60038161012001516004811115610c2c57610c2c613424565b14158015610c51575060048161012001516004811115610c4e57610c4e613424565b14155b15610c6e5760405162461bcd60e51b81526004016108c2906136d7565b60008260200151600460010160149054906101000a900463ffffffff160390506000826080015161ffff168360c0015163ffffffff160264e8d4a51000029050600084600001516127108463ffffffff16840281610cce57610cce6136fd565b0401905080821115610e24576005546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610d27576040519150601f19603f3d011682016040523d82523d6000602084013e610d2c565b606091505b5050905080610d765760405162461bcd60e51b81526020600482015260166024820152754661696c656420746f2070617920706c6174666f726d60501b60448201526064016108c2565b6000828403905060008660a001516001600160a01b03168260405160006040518083038185875af1925050503d8060008114610dce576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b606091505b5050905080610e1c5760405162461bcd60e51b81526020600482015260156024820152742330b4b632b2103a37903830bc9031b932b0ba37b960591b60448201526064016108c2565b505050610ec2565b6005546040516000916001600160a01b03169084908381818185875af1925050503d8060008114610e71576040519150601f19603f3d011682016040523d82523d6000602084013e610e76565b606091505b5050905080610ec05760405162461bcd60e51b81526020600482015260166024820152754661696c656420746f2070617920706c6174666f726d60501b60448201526064016108c2565b505b5050506001600160401b038316600081815260086020526040808220600101805460ff60d01b1916600160d01b179055513392917f5d8af3ccdeb11d4d112fa982c36a01913f261328f025a9705729d0fe9cae392591610f229190613713565b60405180910390a350610f3460018055565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fb25760405163073e64fd60e21b81523360048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044016108c2565b610f3482826121f4565b6001600160401b0381166000908152600960209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561106157600084815260209081902060408051608081018252918501546001600160a01b038116835261ffff600160a01b8204811684860152600160b01b8204169183019190915263ffffffff600160c01b909104166060820152825260019092019101610ff4565b505050509050919050565b6009602052816000526040600020818154811061108857600080fd5b6000918252602090912001546001600160a01b038116925061ffff600160a01b820481169250600160b01b8204169063ffffffff600160c01b9091041684565b6000828152602081905260409020600101546110e381611fec565b6110ed83836123cd565b505050565b6110fa611f93565b611105838383612451565b6110ed60018055565b6001600160a01b038116331461117e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108c2565b610f3482826128d7565b6001600160401b03821660009081526009602090815260408083208054825181850281018501909352808352849361123993929190859084015b8282101561122f57600084815260209081902060408051608081018252918501546001600160a01b038116835261ffff600160a01b8204811684860152600160b01b8204169183019190915263ffffffff600160c01b9091041660608201528252600190920191016111c2565b505050508461293c565b6001600160401b0385166000908152600960205260409020805491925090829081106112675761126761372d565b6000918252602090912001546001600160a01b0316949350505050565b600061128f81611fec565b506004805461ffff909216600160b01b0261ffff60b01b1963ffffffff909416600160c01b029390931665ffffffffffff60b01b1990921691909117919091179055565b60006112de81611fec565b506004805460069490945561ffff909116600160a01b0261ffff60a01b1963ffffffff909316600160801b0273ffffffff0000000000000000ffffffffffffffff199094166001600160401b03909516949094179290921716919091179055565b6003546001600160a01b031633146113925760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b60448201526064016108c2565b600280546001600160a01b0319808216339081179093556003805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b61141e611f93565b6001600160401b038116600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b90041660048111156114f1576114f1613424565b600481111561150257611502613424565b815260028201546001600160a01b0390811660208301526003808401548216604084015260049093015416606090910152909150816101200151600481111561154d5761154d613424565b1415806115605750608081015161ffff16155b1561157d5760405162461bcd60e51b81526004016108c2906136d7565b6000611591838360e0015161ffff16611188565b90506001600160a01b03811633146115dc5760405162461bcd60e51b815260206004820152600e60248201526d2737ba103a3432903bb4b73732b960911b60448201526064016108c2565b815160208301516040516323b872dd60e01b81526001600160a01b038316916323b872dd91611612913091879190600401613743565b600060405180830381600087803b15801561162c57600080fd5b505af1158015611640573d6000803e3d6000fd5b505050506001600160401b038416600081815260086020526040908190206001908101805460ff60d81b1916600160da1b17905590513392917f5d8af3ccdeb11d4d112fa982c36a01913f261328f025a9705729d0fe9cae3925916116a59190613713565b60405180910390a35050506109bb60018055565b60006116c481611fec565b600580546001600160c01b031916600160a01b63ffffffff86169081026001600160a01b031916919091176001600160a01b0385169081179092556040805191825260208201929092527fd26c36178fcc56644529f63f9e7ffc45181502a192a85854eeea040e50501d16910160405180910390a1505050565b611746611f93565b6001600160401b038116600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b900416600481111561181957611819613424565b600481111561182a5761182a613424565b815260028201546001600160a01b039081166020830152600383015481166040830152600490920154821660609091015260a082015191925016331461189e5760405162461bcd60e51b8152602060048201526009602482015268139bdd081bdddb995960ba1b60448201526064016108c2565b608081015161ffff16156118e35760405162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481cdbdb1960a21b60448201526064016108c2565b805160208201516040516323b872dd60e01b81526001600160a01b038316916323b872dd91611919913091339190600401613743565b600060405180830381600087803b15801561193357600080fd5b505af1158015611947573d6000803e3d6000fd5b505050506001600160401b03831660009081526008602052604090206001908101805460ff60d81b1916600160d81b17905561097c565b60008281526020819052604090206001015461199981611fec565b6110ed83836128d7565b6119ab612a0b565b6109bb81612a60565b60006119be611f93565b60006119ca4286613782565b9050620151808163ffffffff1610806119f5575060045463ffffffff600160c01b9091048116908216115b15611a345760405162461bcd60e51b815260206004820152600f60248201526e111d5c985d1a5bdb931a5b5a5d1959608a1b60448201526064016108c2565b600a8461ffff161080611a57575060045461ffff600160b01b9091048116908516115b15611a945760405162461bcd60e51b815260206004820152600d60248201526c14dd5c1c1b1e531a5b5a5d1959609a1b60448201526064016108c2565b6103e88663ffffffff161080611ab357506305f5e1008663ffffffff16115b15611af95760405162461bcd60e51b81526020600482015260166024820152755072696365206c696d697420302e3030317e3130306560501b60448201526064016108c2565b82516003811115611b3d5760405162461bcd60e51b815260206004820152600e60248201526d121bdb19195c88125b1b1959d85b60921b60448201526064016108c2565b60005b81811015611bc65760006001600160a01b0316858281518110611b6557611b6561372d565b60200260200101516001600160a01b031603611bb45760405162461bcd60e51b815260206004820152600e60248201526d121bdb19195c88125b1b1959d85b60921b60448201526064016108c2565b80611bbe816137a6565b915050611b40565b506040516323b872dd60e01b815289906001600160a01b038216906323b872dd90611bf990339030908e90600401613743565b600060405180830381600087803b158015611c1357600080fd5b505af1158015611c27573d6000803e3d6000fd5b5050604080516101a0810182526001600160a01b038e16815263ffffffff808e1660208301528b81169282019290925261ffff8a1660608201526000608082018190523360a0830152918c1660c082015260e0810182905261010081018290529092509050610120810182815260200160008511611ca6576000611cc2565b87600081518110611cb957611cb961372d565b60200260200101515b6001600160a01b0316815260200160018511611cdf576000611cfb565b87600181518110611cf257611cf261372d565b60200260200101515b6001600160a01b0316815260200160028511611d18576000611d34565b87600281518110611d2b57611d2b61372d565b60200260200101515b6001600160a01b031690526004805491925082916008916000918390611d6990600160401b90046001600160401b03166137bf565b825461010092830a6001600160401b038181021990921692909116908102919091179092559082526020808301939093526040918201600020845181549486015193860151606087015160808801516001600160a01b039384166001600160c01b031998891617600160a01b63ffffffff98891681029190911765ffffffffffff60c01b1916600160c01b948916850261ffff60e01b191617600160e01b61ffff94851602176001600160f01b0316600160f01b9284169290920291909117855560a089015160018601805460c08c015160e08d0151998d0151939097169a169990991794909716029290921762ffffff60c01b1916939091160260ff60d01b191691909117600160d01b921515929092029190911780835561012084015191929060ff60d81b1916600160d81b836004811115611ea957611ea9613424565b02179055506101408201516002820180546001600160a01b03199081166001600160a01b039384161790915561016084015160038401805483169184169190911790556101809093015160049283018054909416908216179092555460405163ffffffff8d16928e1691600160401b90046001600160401b0316907f3a7ed29b2f27f1b097f980ffa24bb7288212a7ab6d8989d8bf23dd61cd5dee7190600090a450506004546001600160401b03600160401b9091041692505050611f6d60018055565b9695505050505050565b611f7f611f93565b611f8a828233612451565b610f3460018055565b600260015403611fe55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c2565b6002600155565b6109bb8133612b0a565b600754600654600480546040516305d3b1d360e41b8152918201929092526001600160401b0382166024820152600160a01b820461ffff166044820152600160801b90910463ffffffff166064820152600360848201526000916001600160a01b031690635d3b1d309060a4016020604051808303816000875af1158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a691906137e5565b6000908152600a60205260409020805467ffffffffffffffff19166001600160401b03939093169290921790915550565b6000808383602001518460000151306120ed4690565b60405160c09590951b6001600160c01b031916602086015260e09390931b6001600160e01b0319166028850152602c840191909152606090811b6bffffffffffffffffffffffff1916604c84015282015260800160405160208183030381529060405280519060200120905060006121bf6121b5836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8560400151612b63565b90506121eb7f523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0c826113ed565b95945050505050565b6000828152600a60209081526040808320546001600160401b03168084526008835281842082516101a08101845281546001600160a01b03808216835263ffffffff600160a01b808404821698850198909852600160c01b80840482169785019790975261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015296810490961660c083015293850490931660e084015260ff600160d01b8504811615156101008501529194939091610120840191600160d81b90041660048111156122d2576122d2613424565b60048111156122e3576122e3613424565b815260028201546001600160a01b0390811660208301526003830154811660408301526004909201549091166060909101526080810151845191925060009161ffff90911690859083906123395761233961372d565b602002602001015161234b91906137fe565b612356906001613812565b6001600160401b0384166000818152600860205260408082206001018054600360d81b63ff00ffff60c01b1990911660ff60d81b19600160c01b61ffff8916021617179055519293506003927f9961e08d55a14c7af332ec57532cf095bc07cdafc04a8ec47efd096d074e759a9190a35050505050565b6123d782826113ed565b610f34576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561240d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160401b038316600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b900416600481111561252457612524613424565b600481111561253557612535613424565b815260028201546001600160a01b03908116602083015260038301548116604083015260049092015490911660609091015290506000816101200151600481111561258257612582613424565b1461259f5760405162461bcd60e51b81526004016108c2906136d7565b60a08101516001600160a01b031633036125ee5760405162461bcd60e51b815260206004820152601060248201526f2234b9b0b63637bb9031b932b0ba37b960811b60448201526064016108c2565b8261ffff168160c0015163ffffffff166126089190613825565b6126179064e8d4a51000613825565b34146126585760405162461bcd60e51b815260206004820152601060248201526f125b98dbdc9c9958dd08185b5bdd5b9d60821b60448201526064016108c2565b61ffff83161580612683575080608001518160600151612678919061383c565b61ffff168361ffff16115b156126c05760405162461bcd60e51b815260206004820152600d60248201526c57726f6e6720656e747269657360981b60448201526064016108c2565b6126d1816101400151336001612b87565b806126e857506126e8816101600151336000612b87565b806126ff57506126ff816101800151336000612b87565b15612894576001600160401b038416600090815260096020908152604080832054815160808082019093526001600160a01b03871681529185015190939282019061274b908890613857565b61ffff908116825287811660208084019190915263ffffffff8087166040948501526001600160401b038b166000818152600984528581208054600181018255908252848220885191018054898701518a8a015160608c0151909716600160c01b0263ffffffff60c01b19978a16600160b01b029790971665ffffffffffff60b01b19918a16600160a01b026001600160b01b03199093166001600160a01b0390951694909417919091171691909117939093179092558152600890915291909120805492935087929091601e9161282c918591600160f01b900416613857565b92506101000a81548161ffff021916908361ffff160217905550336001600160a01b03168263ffffffff16876001600160401b03167f9ebfe69cdd334615d0fb4a42c45a276cdd1871739ddfe76fe28e287fc9757eb160405160405180910390a450506128d1565b60405162461bcd60e51b81526020600482015260126024820152712737ba1030b63637bbb2b2103437b63232b960711b60448201526064016108c2565b50505050565b6128e182826113ed565b15610f34576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000825160000361294f57506000610729565b82516000905b808210156129b05760006129698383612c19565b90508486828151811061297e5761297e61372d565b60200260200101516020015161ffff16111561299c578091506129aa565b6129a7816001613812565b92505b50612955565b6000821180156129ea575083856129c8600185613872565b815181106129d8576129d861372d565b60200260200101516020015161ffff16145b15612a03576129fa600183613872565b92505050610729565b509050610729565b6002546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b60448201526064016108c2565b565b336001600160a01b03821603612ab85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108c2565b600380546001600160a01b0319166001600160a01b03838116918217909255600254604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b612b1482826113ed565b610f3457612b2181612c34565b612b2c836020612c46565b604051602001612b3d9291906138a9565b60408051601f198184030181529082905262461bcd60e51b82526108c29160040161391e565b6000806000612b728585612de1565b91509150612b7f81612e26565b509392505050565b60006001600160a01b038416612b9e575080612c12565b6040516370a0823160e01b81526001600160a01b03848116600483015285916000918316906370a0823190602401602060405180830381865afa158015612be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0d91906137e5565b119150505b9392505050565b6000612c286002848418613951565b612c1290848416613812565b60606107296001600160a01b03831660145b60606000612c55836002613825565b612c60906002613812565b6001600160401b03811115612c7757612c77613095565b6040519080825280601f01601f191660200182016040528015612ca1576020820181803683370190505b509050600360fc1b81600081518110612cbc57612cbc61372d565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612ceb57612ceb61372d565b60200101906001600160f81b031916908160001a9053506000612d0f846002613825565b612d1a906001613812565b90505b6001811115612d92576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d4e57612d4e61372d565b1a60f81b828281518110612d6457612d6461372d565b60200101906001600160f81b031916908160001a90535060049490941c93612d8b81613965565b9050612d1d565b508315612c125760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c2565b6000808251604103612e175760208301516040840151606085015160001a612e0b87828585612f70565b94509450505050612e1f565b506000905060025b9250929050565b6000816004811115612e3a57612e3a613424565b03612e425750565b6001816004811115612e5657612e56613424565b03612ea35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108c2565b6002816004811115612eb757612eb7613424565b03612f045760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108c2565b6003816004811115612f1857612f18613424565b036109bb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108c2565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612fa7575060009050600361302b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612ffb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130245760006001925092505061302b565b9150600090505b94509492505050565b60006020828403121561304657600080fd5b81356001600160e01b031981168114612c1257600080fd5b80356001600160401b038116811461307557600080fd5b919050565b60006020828403121561308c57600080fd5b612c128261305e565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156130cd576130cd613095565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130fb576130fb613095565b604052919050565b803563ffffffff8116811461307557600080fd5b6000806040838503121561312a57600080fd5b6131338361305e565b91506020808401356001600160401b038082111561315057600080fd5b908501906060828803121561316457600080fd5b61316c6130ab565b8235815261317b848401613103565b8482015260408301358281111561319157600080fd5b80840193505087601f8401126131a657600080fd5b8235828111156131b8576131b8613095565b6131ca601f8201601f191686016130d3565b925080835288858286010111156131e057600080fd5b8085850186850137600085828501015250816040820152809450505050509250929050565b60006001600160401b0382111561321e5761321e613095565b5060051b60200190565b6000806040838503121561323b57600080fd5b823591506020808401356001600160401b0381111561325957600080fd5b8401601f8101861361326a57600080fd5b803561327d61327882613205565b6130d3565b81815260059190911b8201830190838101908883111561329c57600080fd5b928401925b828410156132ba578335825292840192908401906132a1565b80955050505050509250929050565b6000602082840312156132db57600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561334f57815180516001600160a01b031685528681015161ffff9081168887015286820151168686015260609081015163ffffffff1690850152608090930192908501906001016132ff565b5091979650505050505050565b6000806040838503121561336f57600080fd5b6133788361305e565b946020939093013593505050565b6001600160a01b03811681146109bb57600080fd5b600080604083850312156133ae57600080fd5b8235915060208301356133c081613386565b809150509250929050565b803561ffff8116811461307557600080fd5b6000806000606084860312156133f257600080fd5b6133fb8461305e565b9250613409602085016133cb565b9150604084013561341981613386565b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b6005811061344a5761344a613424565b9052565b6001600160a01b038e16815263ffffffff8d811660208301528c16604082015261ffff8b811660608301528a1660808201526101a081016001600160a01b038a1660a083015263ffffffff891660c083015261ffff881660e08301528615156101008301526134c161012083018761343a565b6001600160a01b0385166101408301526001600160a01b0384166101608301526001600160a01b0383166101808301529e9d5050505050505050505050505050565b6000806040838503121561351657600080fd5b61351f83613103565b915061352d602084016133cb565b90509250929050565b6000806000806080858703121561354c57600080fd5b6135558561305e565b93506020850135925061356a60408601613103565b9150613578606086016133cb565b905092959194509250565b6000806040838503121561359657600080fd5b61359f83613103565b915060208301356133c081613386565b6000602082840312156135c157600080fd5b8135612c1281613386565b60008060008060008060c087890312156135e557600080fd5b86356135f081613386565b955060206135ff888201613103565b955061360d60408901613103565b945061361b60608901613103565b9350613629608089016133cb565b925060a08801356001600160401b0381111561364457600080fd5b8801601f81018a1361365557600080fd5b803561366361327882613205565b81815260059190911b8201830190838101908c83111561368257600080fd5b928401925b828410156136a957833561369a81613386565b82529284019290840190613687565b80955050505050509295509295509295565b600080604083850312156136ce57600080fd5b61351f8361305e565b6020808252600c908201526b57726f6e672073746174757360a01b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b602081016002831061372757613727613424565b91905290565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b634e487b7160e01b600052601160045260246000fd5b63ffffffff82811682821603908082111561379f5761379f61376c565b5092915050565b6000600182016137b8576137b861376c565b5060010190565b60006001600160401b038083168181036137db576137db61376c565b6001019392505050565b6000602082840312156137f757600080fd5b5051919050565b60008261380d5761380d6136fd565b500690565b808201808211156107295761072961376c565b80820281158282048414176107295761072961376c565b61ffff82811682821603908082111561379f5761379f61376c565b61ffff81811683821601908082111561379f5761379f61376c565b818103818111156107295761072961376c565b60005b838110156138a0578181015183820152602001613888565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516138e1816017850160208801613885565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613912816028840160208801613885565b01602801949350505050565b602081526000825180602084015261393d816040850160208701613885565b601f01601f19169190910160400192915050565b600082613960576139606136fd565b500490565b6000816139745761397461376c565b50600019019056fea264697066735822122007be3c84c0f0f736a14959501e524a126b3b3976be0107111a425a4089ccc2f364736f6c6343000811003300000000000000000000000000000000000000000000000000000000000002a5000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Deployed Bytecode
0x60806040526004361061019c5760003560e01c806375804e31116100ec578063a7b025791161008a578063d547741f11610064578063d547741f14610685578063f2fde38b146106a5578063fa98b00a146106c5578063fb1c8bf3146106e557600080fd5b8063a7b0257914610625578063b12acb7714610645578063c0b4b5341461066557600080fd5b80637adc7689116100c65780637adc7689146105845780638da5cb5b146105d257806391d14854146105f0578063a217fddf1461061057600080fd5b806375804e311461046e57806379502c551461048e57806379ba50971461056f57600080fd5b80632e038d061161015957806336568abe1161013357806336568abe1461032e5780633a4ad6af1461034e5780634ac09d1f146103865780636dffa28b1461044e57600080fd5b80632e038d06146102a35780632f2ff15d146102fb57806333cec5b51461031b57600080fd5b806301ffc9a7146101a15780631315b62d146101d6578063175c11b6146101f85780631fe543e314610218578063248a9ca3146102385780632ba627db14610276575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004613034565b6106f8565b60405190151581526020015b60405180910390f35b3480156101e257600080fd5b506101f66101f136600461307a565b61072f565b005b34801561020457600080fd5b506101f6610213366004613117565b6109be565b34801561022457600080fd5b506101f6610233366004613228565b610f38565b34801561024457600080fd5b506102686102533660046132c9565b60009081526020819052604090206001015490565b6040519081526020016101cd565b34801561028257600080fd5b5061029661029136600461307a565b610fbc565b6040516101cd91906132e2565b3480156102af57600080fd5b506102c36102be36600461335c565b61106c565b604080516001600160a01b0395909516855261ffff9384166020860152919092169083015263ffffffff1660608201526080016101cd565b34801561030757600080fd5b506101f661031636600461339b565b6110c8565b6101f66103293660046133dd565b6110f2565b34801561033a57600080fd5b506101f661034936600461339b565b61110e565b34801561035a57600080fd5b5061036e61036936600461335c565b611188565b6040516001600160a01b0390911681526020016101cd565b34801561039257600080fd5b506104356103a136600461307a565b600860205260009081526040902080546001820154600283015460038401546004909401546001600160a01b038085169563ffffffff600160a01b808804821697600160c01b80820484169861ffff600160e01b8404811699600160f01b9094048116988289169895830490961696928204169460ff600160d01b8304811695600160d81b9093041693821692821691168d565b6040516101cd9d9c9b9a9998979695949392919061344e565b34801561045a57600080fd5b506101f6610469366004613503565b611284565b34801561047a57600080fd5b506101f6610489366004613536565b6112d3565b34801561049a57600080fd5b50600454600554600654610508926001600160401b0380821693600160401b83049091169263ffffffff600160801b840481169361ffff600160a01b808304821695600160b01b840490921694600160c01b9093048416936001600160a01b03831693919092049091169089565b604080516001600160401b039a8b1681529990981660208a015263ffffffff9687169789019790975261ffff9485166060890152939092166080870152831660a08601526001600160a01b031660c08501521660e0830152610100820152610120016101cd565b34801561057b57600080fd5b506101f661133f565b34801561059057600080fd5b506105ba61059f3660046132c9565b600a602052600090815260409020546001600160401b031681565b6040516001600160401b0390911681526020016101cd565b3480156105de57600080fd5b506002546001600160a01b031661036e565b3480156105fc57600080fd5b506101c161060b36600461339b565b6113ed565b34801561061c57600080fd5b50610268600081565b34801561063157600080fd5b506101f661064036600461307a565b611416565b34801561065157600080fd5b506101f6610660366004613583565b6116b9565b34801561067157600080fd5b506101f661068036600461307a565b61173e565b34801561069157600080fd5b506101f66106a036600461339b565b61197e565b3480156106b157600080fd5b506101f66106c03660046135af565b6119a3565b3480156106d157600080fd5b506105ba6106e03660046135cc565b6119b4565b6101f66106f33660046136bb565b611f77565b60006001600160e01b03198216637965db0b60e01b148061072957506301ffc9a760e01b6001600160e01b03198316145b92915050565b610737611f93565b7f523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0c61076181611fec565b6001600160401b038216600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b900416600481111561083457610834613424565b600481111561084557610845613424565b815260028201546001600160a01b03908116602083015260038301548116604083015260049092015490911660609091015290506000816101200151600481111561089257610892613424565b1415806108a55750608081015161ffff16155b156108cb5760405162461bcd60e51b81526004016108c2906136d7565b60405180910390fd5b806060015161ffff16816080015161ffff1614806108f25750806040015163ffffffff1642115b156109315761090083611ff6565b6001600160401b0383166000908152600860205260409020600101805460ff60d81b1916600160d91b179055610979565b60405162461bcd60e51b815260206004820152601760248201527f4e6f7420736f6c64206f7574202620646561646c696e6500000000000000000060448201526064016108c2565b60025b6040516001600160401b038516907f9961e08d55a14c7af332ec57532cf095bc07cdafc04a8ec47efd096d074e759a90600090a350506109bb60018055565b50565b6109c6611f93565b600554602082015163ffffffff600160a01b909204821691161115610a1d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964506172616d7360981b60448201526064016108c2565b610a2782826120d7565b610a675760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c99481a5b9d985b1a59607a1b60448201526064016108c2565b6001600160401b038216600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b9004166004811115610b3a57610b3a613424565b6004811115610b4b57610b4b613424565b815260028201546001600160a01b03908116602083015260038301548116604083015260049092015490911660609091015261010081015190915015610bc55760405162461bcd60e51b815260206004820152600f60248201526e10dc99585d1bdc8818db185a5b5959608a1b60448201526064016108c2565b60a08101516001600160a01b03163314610c135760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a34329031b932b0ba37b960891b60448201526064016108c2565b60038161012001516004811115610c2c57610c2c613424565b14158015610c51575060048161012001516004811115610c4e57610c4e613424565b14155b15610c6e5760405162461bcd60e51b81526004016108c2906136d7565b60008260200151600460010160149054906101000a900463ffffffff160390506000826080015161ffff168360c0015163ffffffff160264e8d4a51000029050600084600001516127108463ffffffff16840281610cce57610cce6136fd565b0401905080821115610e24576005546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610d27576040519150601f19603f3d011682016040523d82523d6000602084013e610d2c565b606091505b5050905080610d765760405162461bcd60e51b81526020600482015260166024820152754661696c656420746f2070617920706c6174666f726d60501b60448201526064016108c2565b6000828403905060008660a001516001600160a01b03168260405160006040518083038185875af1925050503d8060008114610dce576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b606091505b5050905080610e1c5760405162461bcd60e51b81526020600482015260156024820152742330b4b632b2103a37903830bc9031b932b0ba37b960591b60448201526064016108c2565b505050610ec2565b6005546040516000916001600160a01b03169084908381818185875af1925050503d8060008114610e71576040519150601f19603f3d011682016040523d82523d6000602084013e610e76565b606091505b5050905080610ec05760405162461bcd60e51b81526020600482015260166024820152754661696c656420746f2070617920706c6174666f726d60501b60448201526064016108c2565b505b5050506001600160401b038316600081815260086020526040808220600101805460ff60d01b1916600160d01b179055513392917f5d8af3ccdeb11d4d112fa982c36a01913f261328f025a9705729d0fe9cae392591610f229190613713565b60405180910390a350610f3460018055565b5050565b336001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091614610fb25760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091660248201526044016108c2565b610f3482826121f4565b6001600160401b0381166000908152600960209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561106157600084815260209081902060408051608081018252918501546001600160a01b038116835261ffff600160a01b8204811684860152600160b01b8204169183019190915263ffffffff600160c01b909104166060820152825260019092019101610ff4565b505050509050919050565b6009602052816000526040600020818154811061108857600080fd5b6000918252602090912001546001600160a01b038116925061ffff600160a01b820481169250600160b01b8204169063ffffffff600160c01b9091041684565b6000828152602081905260409020600101546110e381611fec565b6110ed83836123cd565b505050565b6110fa611f93565b611105838383612451565b6110ed60018055565b6001600160a01b038116331461117e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108c2565b610f3482826128d7565b6001600160401b03821660009081526009602090815260408083208054825181850281018501909352808352849361123993929190859084015b8282101561122f57600084815260209081902060408051608081018252918501546001600160a01b038116835261ffff600160a01b8204811684860152600160b01b8204169183019190915263ffffffff600160c01b9091041660608201528252600190920191016111c2565b505050508461293c565b6001600160401b0385166000908152600960205260409020805491925090829081106112675761126761372d565b6000918252602090912001546001600160a01b0316949350505050565b600061128f81611fec565b506004805461ffff909216600160b01b0261ffff60b01b1963ffffffff909416600160c01b029390931665ffffffffffff60b01b1990921691909117919091179055565b60006112de81611fec565b506004805460069490945561ffff909116600160a01b0261ffff60a01b1963ffffffff909316600160801b0273ffffffff0000000000000000ffffffffffffffff199094166001600160401b03909516949094179290921716919091179055565b6003546001600160a01b031633146113925760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b60448201526064016108c2565b600280546001600160a01b0319808216339081179093556003805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b61141e611f93565b6001600160401b038116600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b90041660048111156114f1576114f1613424565b600481111561150257611502613424565b815260028201546001600160a01b0390811660208301526003808401548216604084015260049093015416606090910152909150816101200151600481111561154d5761154d613424565b1415806115605750608081015161ffff16155b1561157d5760405162461bcd60e51b81526004016108c2906136d7565b6000611591838360e0015161ffff16611188565b90506001600160a01b03811633146115dc5760405162461bcd60e51b815260206004820152600e60248201526d2737ba103a3432903bb4b73732b960911b60448201526064016108c2565b815160208301516040516323b872dd60e01b81526001600160a01b038316916323b872dd91611612913091879190600401613743565b600060405180830381600087803b15801561162c57600080fd5b505af1158015611640573d6000803e3d6000fd5b505050506001600160401b038416600081815260086020526040908190206001908101805460ff60d81b1916600160da1b17905590513392917f5d8af3ccdeb11d4d112fa982c36a01913f261328f025a9705729d0fe9cae3925916116a59190613713565b60405180910390a35050506109bb60018055565b60006116c481611fec565b600580546001600160c01b031916600160a01b63ffffffff86169081026001600160a01b031916919091176001600160a01b0385169081179092556040805191825260208201929092527fd26c36178fcc56644529f63f9e7ffc45181502a192a85854eeea040e50501d16910160405180910390a1505050565b611746611f93565b6001600160401b038116600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b900416600481111561181957611819613424565b600481111561182a5761182a613424565b815260028201546001600160a01b039081166020830152600383015481166040830152600490920154821660609091015260a082015191925016331461189e5760405162461bcd60e51b8152602060048201526009602482015268139bdd081bdddb995960ba1b60448201526064016108c2565b608081015161ffff16156118e35760405162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481cdbdb1960a21b60448201526064016108c2565b805160208201516040516323b872dd60e01b81526001600160a01b038316916323b872dd91611919913091339190600401613743565b600060405180830381600087803b15801561193357600080fd5b505af1158015611947573d6000803e3d6000fd5b505050506001600160401b03831660009081526008602052604090206001908101805460ff60d81b1916600160d81b17905561097c565b60008281526020819052604090206001015461199981611fec565b6110ed83836128d7565b6119ab612a0b565b6109bb81612a60565b60006119be611f93565b60006119ca4286613782565b9050620151808163ffffffff1610806119f5575060045463ffffffff600160c01b9091048116908216115b15611a345760405162461bcd60e51b815260206004820152600f60248201526e111d5c985d1a5bdb931a5b5a5d1959608a1b60448201526064016108c2565b600a8461ffff161080611a57575060045461ffff600160b01b9091048116908516115b15611a945760405162461bcd60e51b815260206004820152600d60248201526c14dd5c1c1b1e531a5b5a5d1959609a1b60448201526064016108c2565b6103e88663ffffffff161080611ab357506305f5e1008663ffffffff16115b15611af95760405162461bcd60e51b81526020600482015260166024820152755072696365206c696d697420302e3030317e3130306560501b60448201526064016108c2565b82516003811115611b3d5760405162461bcd60e51b815260206004820152600e60248201526d121bdb19195c88125b1b1959d85b60921b60448201526064016108c2565b60005b81811015611bc65760006001600160a01b0316858281518110611b6557611b6561372d565b60200260200101516001600160a01b031603611bb45760405162461bcd60e51b815260206004820152600e60248201526d121bdb19195c88125b1b1959d85b60921b60448201526064016108c2565b80611bbe816137a6565b915050611b40565b506040516323b872dd60e01b815289906001600160a01b038216906323b872dd90611bf990339030908e90600401613743565b600060405180830381600087803b158015611c1357600080fd5b505af1158015611c27573d6000803e3d6000fd5b5050604080516101a0810182526001600160a01b038e16815263ffffffff808e1660208301528b81169282019290925261ffff8a1660608201526000608082018190523360a0830152918c1660c082015260e0810182905261010081018290529092509050610120810182815260200160008511611ca6576000611cc2565b87600081518110611cb957611cb961372d565b60200260200101515b6001600160a01b0316815260200160018511611cdf576000611cfb565b87600181518110611cf257611cf261372d565b60200260200101515b6001600160a01b0316815260200160028511611d18576000611d34565b87600281518110611d2b57611d2b61372d565b60200260200101515b6001600160a01b031690526004805491925082916008916000918390611d6990600160401b90046001600160401b03166137bf565b825461010092830a6001600160401b038181021990921692909116908102919091179092559082526020808301939093526040918201600020845181549486015193860151606087015160808801516001600160a01b039384166001600160c01b031998891617600160a01b63ffffffff98891681029190911765ffffffffffff60c01b1916600160c01b948916850261ffff60e01b191617600160e01b61ffff94851602176001600160f01b0316600160f01b9284169290920291909117855560a089015160018601805460c08c015160e08d0151998d0151939097169a169990991794909716029290921762ffffff60c01b1916939091160260ff60d01b191691909117600160d01b921515929092029190911780835561012084015191929060ff60d81b1916600160d81b836004811115611ea957611ea9613424565b02179055506101408201516002820180546001600160a01b03199081166001600160a01b039384161790915561016084015160038401805483169184169190911790556101809093015160049283018054909416908216179092555460405163ffffffff8d16928e1691600160401b90046001600160401b0316907f3a7ed29b2f27f1b097f980ffa24bb7288212a7ab6d8989d8bf23dd61cd5dee7190600090a450506004546001600160401b03600160401b9091041692505050611f6d60018055565b9695505050505050565b611f7f611f93565b611f8a828233612451565b610f3460018055565b600260015403611fe55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c2565b6002600155565b6109bb8133612b0a565b600754600654600480546040516305d3b1d360e41b8152918201929092526001600160401b0382166024820152600160a01b820461ffff166044820152600160801b90910463ffffffff166064820152600360848201526000916001600160a01b031690635d3b1d309060a4016020604051808303816000875af1158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a691906137e5565b6000908152600a60205260409020805467ffffffffffffffff19166001600160401b03939093169290921790915550565b6000808383602001518460000151306120ed4690565b60405160c09590951b6001600160c01b031916602086015260e09390931b6001600160e01b0319166028850152602c840191909152606090811b6bffffffffffffffffffffffff1916604c84015282015260800160405160208183030381529060405280519060200120905060006121bf6121b5836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8560400151612b63565b90506121eb7f523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0c826113ed565b95945050505050565b6000828152600a60209081526040808320546001600160401b03168084526008835281842082516101a08101845281546001600160a01b03808216835263ffffffff600160a01b808404821698850198909852600160c01b80840482169785019790975261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015296810490961660c083015293850490931660e084015260ff600160d01b8504811615156101008501529194939091610120840191600160d81b90041660048111156122d2576122d2613424565b60048111156122e3576122e3613424565b815260028201546001600160a01b0390811660208301526003830154811660408301526004909201549091166060909101526080810151845191925060009161ffff90911690859083906123395761233961372d565b602002602001015161234b91906137fe565b612356906001613812565b6001600160401b0384166000818152600860205260408082206001018054600360d81b63ff00ffff60c01b1990911660ff60d81b19600160c01b61ffff8916021617179055519293506003927f9961e08d55a14c7af332ec57532cf095bc07cdafc04a8ec47efd096d074e759a9190a35050505050565b6123d782826113ed565b610f34576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561240d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160401b038316600090815260086020908152604080832081516101a08101835281546001600160a01b03808216835263ffffffff600160a01b808404821697850197909752600160c01b80840482169685019690965261ffff600160e01b840481166060860152600160f01b90930483166080850152600185015491821660a085015295810490951660c083015292840490921660e083015260ff600160d01b84048116151561010084015291929091610120840191600160d81b900416600481111561252457612524613424565b600481111561253557612535613424565b815260028201546001600160a01b03908116602083015260038301548116604083015260049092015490911660609091015290506000816101200151600481111561258257612582613424565b1461259f5760405162461bcd60e51b81526004016108c2906136d7565b60a08101516001600160a01b031633036125ee5760405162461bcd60e51b815260206004820152601060248201526f2234b9b0b63637bb9031b932b0ba37b960811b60448201526064016108c2565b8261ffff168160c0015163ffffffff166126089190613825565b6126179064e8d4a51000613825565b34146126585760405162461bcd60e51b815260206004820152601060248201526f125b98dbdc9c9958dd08185b5bdd5b9d60821b60448201526064016108c2565b61ffff83161580612683575080608001518160600151612678919061383c565b61ffff168361ffff16115b156126c05760405162461bcd60e51b815260206004820152600d60248201526c57726f6e6720656e747269657360981b60448201526064016108c2565b6126d1816101400151336001612b87565b806126e857506126e8816101600151336000612b87565b806126ff57506126ff816101800151336000612b87565b15612894576001600160401b038416600090815260096020908152604080832054815160808082019093526001600160a01b03871681529185015190939282019061274b908890613857565b61ffff908116825287811660208084019190915263ffffffff8087166040948501526001600160401b038b166000818152600984528581208054600181018255908252848220885191018054898701518a8a015160608c0151909716600160c01b0263ffffffff60c01b19978a16600160b01b029790971665ffffffffffff60b01b19918a16600160a01b026001600160b01b03199093166001600160a01b0390951694909417919091171691909117939093179092558152600890915291909120805492935087929091601e9161282c918591600160f01b900416613857565b92506101000a81548161ffff021916908361ffff160217905550336001600160a01b03168263ffffffff16876001600160401b03167f9ebfe69cdd334615d0fb4a42c45a276cdd1871739ddfe76fe28e287fc9757eb160405160405180910390a450506128d1565b60405162461bcd60e51b81526020600482015260126024820152712737ba1030b63637bbb2b2103437b63232b960711b60448201526064016108c2565b50505050565b6128e182826113ed565b15610f34576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000825160000361294f57506000610729565b82516000905b808210156129b05760006129698383612c19565b90508486828151811061297e5761297e61372d565b60200260200101516020015161ffff16111561299c578091506129aa565b6129a7816001613812565b92505b50612955565b6000821180156129ea575083856129c8600185613872565b815181106129d8576129d861372d565b60200260200101516020015161ffff16145b15612a03576129fa600183613872565b92505050610729565b509050610729565b6002546001600160a01b03163314612a5e5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b60448201526064016108c2565b565b336001600160a01b03821603612ab85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108c2565b600380546001600160a01b0319166001600160a01b03838116918217909255600254604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b612b1482826113ed565b610f3457612b2181612c34565b612b2c836020612c46565b604051602001612b3d9291906138a9565b60408051601f198184030181529082905262461bcd60e51b82526108c29160040161391e565b6000806000612b728585612de1565b91509150612b7f81612e26565b509392505050565b60006001600160a01b038416612b9e575080612c12565b6040516370a0823160e01b81526001600160a01b03848116600483015285916000918316906370a0823190602401602060405180830381865afa158015612be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0d91906137e5565b119150505b9392505050565b6000612c286002848418613951565b612c1290848416613812565b60606107296001600160a01b03831660145b60606000612c55836002613825565b612c60906002613812565b6001600160401b03811115612c7757612c77613095565b6040519080825280601f01601f191660200182016040528015612ca1576020820181803683370190505b509050600360fc1b81600081518110612cbc57612cbc61372d565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612ceb57612ceb61372d565b60200101906001600160f81b031916908160001a9053506000612d0f846002613825565b612d1a906001613812565b90505b6001811115612d92576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d4e57612d4e61372d565b1a60f81b828281518110612d6457612d6461372d565b60200101906001600160f81b031916908160001a90535060049490941c93612d8b81613965565b9050612d1d565b508315612c125760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c2565b6000808251604103612e175760208301516040840151606085015160001a612e0b87828585612f70565b94509450505050612e1f565b506000905060025b9250929050565b6000816004811115612e3a57612e3a613424565b03612e425750565b6001816004811115612e5657612e56613424565b03612ea35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108c2565b6002816004811115612eb757612eb7613424565b03612f045760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108c2565b6003816004811115612f1857612f18613424565b036109bb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108c2565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612fa7575060009050600361302b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612ffb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130245760006001925092505061302b565b9150600090505b94509492505050565b60006020828403121561304657600080fd5b81356001600160e01b031981168114612c1257600080fd5b80356001600160401b038116811461307557600080fd5b919050565b60006020828403121561308c57600080fd5b612c128261305e565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156130cd576130cd613095565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130fb576130fb613095565b604052919050565b803563ffffffff8116811461307557600080fd5b6000806040838503121561312a57600080fd5b6131338361305e565b91506020808401356001600160401b038082111561315057600080fd5b908501906060828803121561316457600080fd5b61316c6130ab565b8235815261317b848401613103565b8482015260408301358281111561319157600080fd5b80840193505087601f8401126131a657600080fd5b8235828111156131b8576131b8613095565b6131ca601f8201601f191686016130d3565b925080835288858286010111156131e057600080fd5b8085850186850137600085828501015250816040820152809450505050509250929050565b60006001600160401b0382111561321e5761321e613095565b5060051b60200190565b6000806040838503121561323b57600080fd5b823591506020808401356001600160401b0381111561325957600080fd5b8401601f8101861361326a57600080fd5b803561327d61327882613205565b6130d3565b81815260059190911b8201830190838101908883111561329c57600080fd5b928401925b828410156132ba578335825292840192908401906132a1565b80955050505050509250929050565b6000602082840312156132db57600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561334f57815180516001600160a01b031685528681015161ffff9081168887015286820151168686015260609081015163ffffffff1690850152608090930192908501906001016132ff565b5091979650505050505050565b6000806040838503121561336f57600080fd5b6133788361305e565b946020939093013593505050565b6001600160a01b03811681146109bb57600080fd5b600080604083850312156133ae57600080fd5b8235915060208301356133c081613386565b809150509250929050565b803561ffff8116811461307557600080fd5b6000806000606084860312156133f257600080fd5b6133fb8461305e565b9250613409602085016133cb565b9150604084013561341981613386565b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b6005811061344a5761344a613424565b9052565b6001600160a01b038e16815263ffffffff8d811660208301528c16604082015261ffff8b811660608301528a1660808201526101a081016001600160a01b038a1660a083015263ffffffff891660c083015261ffff881660e08301528615156101008301526134c161012083018761343a565b6001600160a01b0385166101408301526001600160a01b0384166101608301526001600160a01b0383166101808301529e9d5050505050505050505050505050565b6000806040838503121561351657600080fd5b61351f83613103565b915061352d602084016133cb565b90509250929050565b6000806000806080858703121561354c57600080fd5b6135558561305e565b93506020850135925061356a60408601613103565b9150613578606086016133cb565b905092959194509250565b6000806040838503121561359657600080fd5b61359f83613103565b915060208301356133c081613386565b6000602082840312156135c157600080fd5b8135612c1281613386565b60008060008060008060c087890312156135e557600080fd5b86356135f081613386565b955060206135ff888201613103565b955061360d60408901613103565b945061361b60608901613103565b9350613629608089016133cb565b925060a08801356001600160401b0381111561364457600080fd5b8801601f81018a1361365557600080fd5b803561366361327882613205565b81815260059190911b8201830190838101908c83111561368257600080fd5b928401925b828410156136a957833561369a81613386565b82529284019290840190613687565b80955050505050509295509295509295565b600080604083850312156136ce57600080fd5b61351f8361305e565b6020808252600c908201526b57726f6e672073746174757360a01b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b602081016002831061372757613727613424565b91905290565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b634e487b7160e01b600052601160045260246000fd5b63ffffffff82811682821603908082111561379f5761379f61376c565b5092915050565b6000600182016137b8576137b861376c565b5060010190565b60006001600160401b038083168181036137db576137db61376c565b6001019392505050565b6000602082840312156137f757600080fd5b5051919050565b60008261380d5761380d6136fd565b500690565b808201808211156107295761072961376c565b80820281158282048414176107295761072961376c565b61ffff82811682821603908082111561379f5761379f61376c565b61ffff81811683821601908082111561379f5761379f61376c565b818103818111156107295761072961376c565b60005b838110156138a0578181015183820152602001613888565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516138e1816017850160208801613885565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613912816028840160208801613885565b01602801949350505050565b602081526000825180602084015261393d816040850160208701613885565b601f01601f19169190910160400192915050565b600082613960576139606136fd565b500490565b6000816139745761397461376c565b50600019019056fea264697066735822122007be3c84c0f0f736a14959501e524a126b3b3976be0107111a425a4089ccc2f364736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000002a5000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
-----Decoded View---------------
Arg [0] : _subId (uint64): 677
Arg [1] : _vrfCoordinator (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [2] : _keyHash (bytes32): 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000002a5
Arg [1] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [2] : 8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Deployed Bytecode Sourcemap
62285:12276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55230:204;;;;;;;;;;-1:-1:-1;55230:204:0;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;55230:204:0;;;;;;;;67777:701;;;;;;;;;;-1:-1:-1;67777:701:0;;;;;:::i;:::-;;:::i;:::-;;70394:1683;;;;;;;;;;-1:-1:-1;70394:1683:0;;;;;:::i;:::-;;:::i;9489:261::-;;;;;;;;;;-1:-1:-1;9489:261:0;;;;;:::i;:::-;;:::i;57053:131::-;;;;;;;;;;-1:-1:-1;57053:131:0;;;;;:::i;:::-;57127:7;57154:12;;;;;;;;;;:22;;;;57053:131;;;;4509:25:1;;;4497:2;4482:18;57053:131:0;4363:177:1;74288:138:0;;;;;;;;;;-1:-1:-1;74288:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62588:52::-;;;;;;;;;;-1:-1:-1;62588:52:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6423:32:1;;;;6405:51;;6475:6;6517:15;;;6512:2;6497:18;;6490:43;6569:15;;;;6549:18;;;6542:43;6633:10;6621:23;6616:2;6601:18;;6594:51;6392:3;6377:19;62588:52:0;6180:471:1;57494:147:0;;;;;;;;;;-1:-1:-1;57494:147:0;;;;;:::i;:::-;;:::i;66043:166::-;;;;;;:::i;:::-;;:::i;58638:218::-;;;;;;;;;;-1:-1:-1;58638:218:0;;;;;:::i;:::-;;:::i;72085:239::-;;;;;;;;;;-1:-1:-1;72085:239:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7836:32:1;;;7818:51;;7806:2;7791:18;72085:239:0;7672:203:1;62533:48:0;;;;;;;;;;-1:-1:-1;62533:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62533:48:0;;;;;-1:-1:-1;;;62533:48:0;;;;;;-1:-1:-1;;;62533:48:0;;;;;;;-1:-1:-1;;;62533:48:0;;;;;-1:-1:-1;;;62533:48:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62533:48:0;;;;;-1:-1:-1;;;62533:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;73783:190::-;;;;;;;;;;-1:-1:-1;73783:190:0;;;;;:::i;:::-;;:::i;73981:299::-;;;;;;;;;;-1:-1:-1;73981:299:0;;;;;:::i;:::-;;:::i;62381:20::-;;;;;;;;;;-1:-1:-1;62381:20:0;;;;;;;;-1:-1:-1;;;;;62381:20:0;;;;-1:-1:-1;;;62381:20:0;;;;;;;-1:-1:-1;;;62381:20:0;;;;;;-1:-1:-1;;;62381:20:0;;;;;;-1:-1:-1;;;62381:20:0;;;;;;-1:-1:-1;;;62381:20:0;;;;;;-1:-1:-1;;;;;62381:20:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10462:15:1;;;10444:34;;10514:15;;;;10509:2;10494:18;;10487:43;10549:10;10595:15;;;10575:18;;;10568:43;;;;10630:6;10672:15;;;10667:2;10652:18;;10645:43;10725:15;;;;10719:3;10704:19;;10697:44;10778:15;;10772:3;10757:19;;10750:44;-1:-1:-1;;;;;10831:32:1;10825:3;10810:19;;10803:61;10901:15;10895:3;10880:19;;10873:44;10948:3;10933:19;;10926:35;10394:3;10379:19;62381:20:0;10050:917:1;1338:273:0;;;;;;;;;;;;;:::i;62647:49::-;;;;;;;;;;-1:-1:-1;62647:49:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;62647:49:0;;;;;;-1:-1:-1;;;;;11319:31:1;;;11301:50;;11289:2;11274:18;62647:49:0;11157:200:1;1667:83:0;;;;;;;;;;-1:-1:-1;1737:7:0;;-1:-1:-1;;;;;1737:7:0;1667:83;;55526:147;;;;;;;;;;-1:-1:-1;55526:147:0;;;;;:::i;:::-;;:::i;54631:49::-;;;;;;;;;;-1:-1:-1;54631:49:0;54676:4;54631:49;;69775:611;;;;;;;;;;-1:-1:-1;69775:611:0;;;;;:::i;:::-;;:::i;73525:250::-;;;;;;;;;;-1:-1:-1;73525:250:0;;;;;:::i;:::-;;:::i;68486:500::-;;;;;;;;;;-1:-1:-1;68486:500:0;;;;;:::i;:::-;;:::i;57934:149::-;;;;;;;;;;-1:-1:-1;57934:149:0;;;;;:::i;:::-;;:::i;1141:100::-;;;;;;;;;;-1:-1:-1;1141:100:0;;;;;:::i;:::-;;:::i;64115:1780::-;;;;;;;;;;-1:-1:-1;64115:1780:0;;;;;:::i;:::-;;:::i;65903:132::-;;;;;;:::i;:::-;;:::i;55230:204::-;55315:4;-1:-1:-1;;;;;;55339:47:0;;-1:-1:-1;;;55339:47:0;;:87;;-1:-1:-1;;;;;;;;;;24704:40:0;;;55390:36;55332:94;55230:204;-1:-1:-1;;55230:204:0:o;67777:701::-;17108:21;:19;:21::i;:::-;62503::::1;55122:16;55133:4;55122:10;:16::i;:::-;-1:-1:-1::0;;;;;67895:20:0;::::2;67866:26;67895:20:::0;;;:9:::2;:20;::::0;;;;;;;67866:49;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;67866:49:0;;::::2;::::0;;::::2;-1:-1:-1::0;;;67866:49:0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;67866:49:0;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;;67866:49:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;67866:49:0;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;;::::2;::::0;;;;::::2;-1:-1:-1::0;;;67866:49:0;::::2;::::0;::::2;;;;::::0;;;;;67895:20;;67866:49;;;;-1:-1:-1;;;67866:49:0;::::2;;;::::0;::::2;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;67866:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;67866:49:0::2;67971:6;:13;;;:30;;;;;;;;:::i;:::-;;;:59;;;-1:-1:-1::0;68005:20:0::2;::::0;::::2;::::0;:25:::2;;::::0;67971:59:::2;67967:87;;;68032:22;;-1:-1:-1::0;;;68032:22:0::2;;;;;;;:::i;:::-;;;;;;;;67967:87;68095:6;:18;;;68071:42;;:6;:20;;;:42;;;:107;;;;68156:6;:21;;;68148:30;;68130:15;:48;68071:107;68067:347;;;68195:30;68215:9;68195:19;:30::i;:::-;-1:-1:-1::0;;;;;68240:20:0;::::2;;::::0;;;:9:::2;:20;::::0;;;;:27:::2;;:44:::0;;-1:-1:-1;;;;68240:44:0::2;-1:-1:-1::0;;;68240:44:0::2;::::0;;68067:347:::2;;;68369:33;::::0;-1:-1:-1;;;68369:33:0;;14153:2:1;68369:33:0::2;::::0;::::2;14135:21:1::0;14192:2;14172:18;;;14165:30;14231:25;14211:18;;;14204:53;14274:18;;68369:33:0::2;13951:347:1::0;68067::0::2;68455:14;68431:39;;::::0;-1:-1:-1;;;;;68431:39:0;::::2;::::0;::::2;::::0;;;::::2;67855:623;17140:1:::1;17152:20:::0;16546:1;17672:22;;17489:213;17152:20;67777:701;:::o;70394:1683::-;17108:21;:19;:21::i;:::-;70528:18;;70500:25:::1;::::0;::::1;::::0;70528:18:::1;-1:-1:-1::0;;;70528:18:0;;::::1;::::0;::::1;70500:46:::0;::::1;;70496:75;;;70548:23;::::0;-1:-1:-1;;;70548:23:0;;14505:2:1;70548:23:0::1;::::0;::::1;14487:21:1::0;14544:2;14524:18;;;14517:30;-1:-1:-1;;;14563:18:1;;;14556:43;14616:18;;70548:23:0::1;14303:337:1::0;70496:75:0::1;70587:38;70603:9;70614:10;70587:15;:38::i;:::-;70582:72;;70627:27;::::0;-1:-1:-1;;;70627:27:0;;14847:2:1;70627:27:0::1;::::0;::::1;14829:21:1::0;14886:2;14866:18;;;14859:30;-1:-1:-1;;;14905:18:1;;;14898:47;14962:18;;70627:27:0::1;14645:341:1::0;70582:72:0::1;-1:-1:-1::0;;;;;70696:20:0;::::1;70667:26;70696:20:::0;;;:9:::1;:20;::::0;;;;;;;70667:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;70667:49:0;;::::1;::::0;;::::1;-1:-1:-1::0;;;70667:49:0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;70667:49:0;;::::1;::::0;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;70667:49:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;70667:49:0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;70667:49:0;::::1;::::0;::::1;;;;::::0;;;;;70696:20;;70667:49;;;;-1:-1:-1;;;70667:49:0;::::1;;;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;70667:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;::::1;70731:14:::0;::::1;::::0;70667:49;;-1:-1:-1;70727:45:0::1;;;70747:25;::::0;-1:-1:-1;;;70747:25:0;;15193:2:1;70747:25:0::1;::::0;::::1;15175:21:1::0;15232:2;15212:18;;;15205:30;-1:-1:-1;;;15251:18:1;;;15244:45;15306:18;;70747:25:0::1;14991:339:1::0;70727:45:0::1;70787:14;::::0;::::1;::::0;-1:-1:-1;;;;;70787:28:0::1;70805:10;70787:28;70783:59;;70817:25;::::0;-1:-1:-1;;;70817:25:0;;15537:2:1;70817:25:0::1;::::0;::::1;15519:21:1::0;15576:2;15556:18;;;15549:30;-1:-1:-1;;;15595:18:1;;;15588:45;15650:18;;70817:25:0::1;15335:339:1::0;70783:59:0::1;70874:13;70857:6;:13;;;:30;;;;;;;;:::i;:::-;;;:65;;;;-1:-1:-1::0;70908:14:0::1;70891:6;:13;;;:31;;;;;;;;:::i;:::-;;;70857:65;70853:93;;;70924:22;;-1:-1:-1::0;;;70924:22:0::1;;;;;;;:::i;70853:93::-;70984:18;71026:10;:25;;;71005:6;:18;;;;;;;;;;;;:46;70984:67;;71066:20;71113:6;:20;;;71089:44;;71097:6;:12;;;71089:21;;:44;71136:4;71089:51;71066:74;;71155:25;71220:10;:18;;;71212:5;71198:11;71183:26;;:12;:26;:34;;;;;:::i;:::-;;:55;71155:83;;71274:17;71259:12;:32;71255:686;;;71328:26:::0;;:61:::1;::::0;71313:9:::1;::::0;-1:-1:-1;;;;;71328:26:0::1;::::0;71367:17;;71313:9;71328:61;71313:9;71328:61;71367:17;71328:26;:61:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71312:77;;;71413:4;71408:43;;71419:32;::::0;-1:-1:-1;;;71419:32:0;;16223:2:1;71419:32:0::1;::::0;::::1;16205:21:1::0;16262:2;16242:18;;;16235:30;-1:-1:-1;;;16281:18:1;;;16274:52;16343:18;;71419:32:0::1;16021:346:1::0;71408:43:0::1;71472:24;71514:17;71499:12;:32;71472:59;;71551:10;71567:6;:14;;;-1:-1:-1::0;;;;;71567:19:0::1;71594:16;71567:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71550:65;;;71639:5;71634:43;;71646:31;::::0;-1:-1:-1;;;71646:31:0;;16574:2:1;71646:31:0::1;::::0;::::1;16556:21:1::0;16613:2;16593:18;;;16586:30;-1:-1:-1;;;16632:18:1;;;16625:51;16693:18;;71646:31:0::1;16372:345:1::0;71634:43:0::1;71293:400;;;71255:686;;;71807:26:::0;;:56:::1;::::0;71792:9:::1;::::0;-1:-1:-1;;;;;71807:26:0::1;::::0;71846:12;;71792:9;71807:56;71792:9;71807:56;71846:12;71807:26;:56:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71791:72;;;71887:4;71882:43;;71893:32;::::0;-1:-1:-1;;;71893:32:0;;16223:2:1;71893:32:0::1;::::0;::::1;16205:21:1::0;16262:2;16242:18;;;16235:30;-1:-1:-1;;;16281:18:1;;;16274:52;16343:18;;71893:32:0::1;16021:346:1::0;71882:43:0::1;71699:242;71255:686;-1:-1:-1::0;;;;;;;;71964:20:0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;71995:4:::1;71964:28;:35:::0;;-1:-1:-1;;;;71964:35:0::1;-1:-1:-1::0;;;71964:35:0::1;::::0;;72015:54;72038:10:::1;::::0;71964:20;72015:54:::1;::::0;::::1;::::0;71964:20;72015:54:::1;:::i;:::-;;;;;;;;70485:1592;17152:20:::0;16546:1;17672:22;;17489:213;17152:20;70394:1683;;:::o;9489:261::-;9589:10;-1:-1:-1;;;;;9603:14:0;9589:28;;9585:111;;9635:53;;-1:-1:-1;;;9635:53:0;;9661:10;9635:53;;;17185:34:1;-1:-1:-1;;;;;9673:14:0;17255:15:1;17235:18;;;17228:43;17120:18;;9635:53:0;16973:304:1;9585:111:0;9702:42;9721:9;9732:11;9702:18;:42::i;74288:138::-;-1:-1:-1;;;;;74397:21:0;;;;;;:10;:21;;;;;;;;74390:28;;;;;;;;;;;;;;;;;74355:22;;74390:28;;74397:21;;74390:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74390:28:0;;;;;-1:-1:-1;;;74390:28:0;;;;;;;;-1:-1:-1;;;74390:28:0;;;;;;;;;;;-1:-1:-1;;;74390:28:0;;;;;;;;;;;;;;;;;;;;;;;;;74288:138;;;:::o;62588:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62588:52:0;;;-1:-1:-1;62588:52:0;-1:-1:-1;;;62588:52:0;;;;;-1:-1:-1;;;;62588:52:0;;;;;-1:-1:-1;;;62588:52:0;;;;;:::o;57494:147::-;57127:7;57154:12;;;;;;;;;;:22;;;55122:16;55133:4;55122:10;:16::i;:::-;57608:25:::1;57619:4;57625:7;57608:10;:25::i;:::-;57494:147:::0;;;:::o;66043:166::-;17108:21;:19;:21::i;:::-;66162:39:::1;66168:9;66179:4;66185:15;66162:5;:39::i;:::-;17152:20:::0;16546:1;17672:22;;17489:213;58638:218;-1:-1:-1;;;;;58734:23:0;;49478:10;58734:23;58726:83;;;;-1:-1:-1;;;58726:83:0;;17484:2:1;58726:83:0;;;17466:21:1;17523:2;17503:18;;;17496:30;17562:34;17542:18;;;17535:62;-1:-1:-1;;;17613:18:1;;;17606:45;17668:19;;58726:83:0;17282:411:1;58726:83:0;58822:26;58834:4;58840:7;58822:11;:26::i;72085:239::-;-1:-1:-1;;;;;72225:21:0;;72171:7;72225:21;;;:10;:21;;;;;;;;72210:51;;;;;;;;;;;;;;;;;72171:7;;72210:51;;;72225:21;72210:51;72171:7;;72210:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72210:51:0;;;;;-1:-1:-1;;;72210:51:0;;;;;;;;-1:-1:-1;;;72210:51:0;;;;;;;;;;;-1:-1:-1;;;72210:51:0;;;;;;;;;;;;;;;;;;;;;;;72248:12;72210:14;:51::i;:::-;-1:-1:-1;;;;;72279:21:0;;;;;;:10;:21;;;;;:31;;72191:70;;-1:-1:-1;72279:21:0;72191:70;;72279:31;;;;;;:::i;:::-;;;;;;;;;;:37;-1:-1:-1;;;;;72279:37:0;;72085:239;-1:-1:-1;;;;72085:239:0:o;73783:190::-;54676:4;55122:16;54676:4;55122:10;:16::i;:::-;-1:-1:-1;73892:6:0::1;:33:::0;;73936:29:::1;::::0;;::::1;-1:-1:-1::0;;;73936:29:0::1;-1:-1:-1::0;;;;73892:33:0::1;::::0;;::::1;-1:-1:-1::0;;;73892:33:0::1;73936:29:::0;;;;-1:-1:-1;;;;73936:29:0;;;;;;;;;;::::1;::::0;;73783:190::o;73981:299::-;54676:4;55122:16;54676:4;55122:10;:16::i;:::-;-1:-1:-1;74127:6:0::1;:21:::0;;74159:14;:25;;;;74239:33:::1;::::0;;::::1;-1:-1:-1::0;;;74239:33:0::1;-1:-1:-1::0;;;;74195:33:0::1;::::0;;::::1;-1:-1:-1::0;;;74195:33:0::1;-1:-1:-1::0;;74195:33:0;;;-1:-1:-1;;;;;74127:21:0;;::::1;74195:33:::0;;;;;;;::::1;74239;::::0;;;::::1;::::0;;73981:299::o;1338:273::-;1412:14;;-1:-1:-1;;;;;1412:14:0;1398:10;:28;1390:63;;;;-1:-1:-1;;;1390:63:0;;18032:2:1;1390:63:0;;;18014:21:1;18071:2;18051:18;;;18044:30;-1:-1:-1;;;18090:18:1;;;18083:52;18152:18;;1390:63:0;17830:346:1;1390:63:0;1481:7;;;-1:-1:-1;;;;;;1495:20:0;;;1505:10;1495:20;;;;;;1522:14;:27;;;;;;;1563:42;;-1:-1:-1;;;;;1481:7:0;;;;1505:10;1481:7;;1563:42;;1462:16;;1563:42;1383:228;1338:273::o;55526:147::-;55612:4;55636:12;;;;;;;;;;;-1:-1:-1;;;;;55636:29:0;;;;;;;;;;;;;;;55526:147::o;69775:611::-;17108:21;:19;:21::i;:::-;-1:-1:-1;;;;;69876:20:0;::::1;69847:26;69876:20:::0;;;:9:::1;:20;::::0;;;;;;;69847:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;69847:49:0;;::::1;::::0;;::::1;-1:-1:-1::0;;;69847:49:0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;69847:49:0;;::::1;::::0;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;69847:49:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;69847:49:0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;69847:49:0;::::1;::::0;::::1;;;;::::0;;;;;69876:20;;69847:49;;;;-1:-1:-1;;;69847:49:0;::::1;;;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;69847:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;69911:6:0::1;:13;;;:30;;;;;;;;:::i;:::-;;;:59;;;-1:-1:-1::0;69945:20:0::1;::::0;::::1;::::0;:25:::1;;::::0;69911:59:::1;69907:87;;;69972:22;;-1:-1:-1::0;;;69972:22:0::1;;;;;;;:::i;69907:87::-;70007:14;70024:46;70040:9;70051:6;:18;;;70024:46;;:15;:46::i;:::-;70007:63:::0;-1:-1:-1;;;;;;70085:20:0;::::1;70095:10;70085:20;70081:50;;70107:24;::::0;-1:-1:-1;;;70107:24:0;;18383:2:1;70107:24:0::1;::::0;::::1;18365:21:1::0;18422:2;18402:18;;;18395:30;-1:-1:-1;;;18441:18:1;;;18434:44;18495:18;;70107:24:0::1;18181:338:1::0;70081:50:0::1;70168:17:::0;;70239:12:::1;::::0;::::1;::::0;70197:55:::1;::::0;-1:-1:-1;;;70197:55:0;;-1:-1:-1;;;;;70197:18:0;::::1;::::0;::::1;::::0;:55:::1;::::0;70224:4:::1;::::0;70231:6;;70239:12;70197:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;70265:20:0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;;:27:::1;::::0;;::::1;:44:::0;;-1:-1:-1;;;;70265:44:0::1;-1:-1:-1::0;;;70265:44:0::1;::::0;;70325:53;;70348:10:::1;::::0;70265:20;70325:53:::1;::::0;::::1;::::0;70265:27;70325:53:::1;:::i;:::-;;;;;;;;69836:550;;;17152:20:::0;16546:1;17672:22;;17489:213;73525:250;54676:4;55122:16;54676:4;55122:10;:16::i;:::-;73641:18;:25;;-1:-1:-1;;;;;;73677:41:0;-1:-1:-1;;;73641:25:0::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;;;;73677:41:0;;;;;-1:-1:-1;;;;;73677:41:0;::::1;::::0;;::::1;::::0;;;73734:33:::1;::::0;;19100:42:1;;;19173:2;19158:18;;19151:60;;;;73734:33:0::1;::::0;19073:18:1;73734:33:0::1;;;;;;;73525:250:::0;;;:::o;68486:500::-;17108:21;:19;:21::i;:::-;-1:-1:-1;;;;;68588:20:0;::::1;68559:26;68588:20:::0;;;:9:::1;:20;::::0;;;;;;;68559:49;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;68559:49:0;;::::1;::::0;;::::1;-1:-1:-1::0;;;68559:49:0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;68559:49:0;;::::1;::::0;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;68559:49:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;68559:49:0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;68559:49:0;::::1;::::0;::::1;;;;::::0;;;;;68588:20;;68559:49;;;;-1:-1:-1;;;68559:49:0;::::1;;;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;68559:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;68639:14:::1;::::0;::::1;::::0;;;-1:-1:-1;68625:28:0::1;:10;:28;68621:53;;68655:19;::::0;-1:-1:-1;;;68655:19:0;;19424:2:1;68655:19:0::1;::::0;::::1;19406:21:1::0;19463:1;19443:18;;;19436:29;-1:-1:-1;;;19481:18:1;;;19474:39;19530:18;;68655:19:0::1;19222:332:1::0;68621:53:0::1;68689:20;::::0;::::1;::::0;:24:::1;;::::0;68685:52:::1;;68715:22;::::0;-1:-1:-1;;;68715:22:0;;19761:2:1;68715:22:0::1;::::0;::::1;19743:21:1::0;19800:2;19780:18;;;19773:30;-1:-1:-1;;;19819:18:1;;;19812:42;19871:18;;68715:22:0::1;19559:336:1::0;68685:52:0::1;68774:17:::0;;68849:12:::1;::::0;::::1;::::0;68803:59:::1;::::0;-1:-1:-1;;;68803:59:0;;-1:-1:-1;;;;;68803:18:0;::::1;::::0;::::1;::::0;:59:::1;::::0;68830:4:::1;::::0;68837:10:::1;::::0;68849:12;68803:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;68875:20:0;::::1;;::::0;;;:9:::1;:20;::::0;;;;68905:16:::1;68875:27:::0;;::::1;:46:::0;;-1:-1:-1;;;;68875:46:0::1;-1:-1:-1::0;;;68875:46:0::1;::::0;;68937:41:::1;::::0;57934:149;57127:7;57154:12;;;;;;;;;;:22;;;55122:16;55133:4;55122:10;:16::i;:::-;58049:26:::1;58061:4;58067:7;58049:11;:26::i;1141:100::-:0;2317:20;:18;:20::i;:::-;1213:22:::1;1232:2;1213:18;:22::i;64115:1780::-:0;64295:6;17108:21;:19;:21::i;:::-;64314:15:::1;64332:41;64357:15;64332::::0;:41:::1;:::i;:::-;64314:59;;64399:5;64388:8;:16;;;:49;;;-1:-1:-1::0;64419:6:0::1;:18:::0;::::1;-1:-1:-1::0;;;64419:18:0;;::::1;::::0;::::1;64408:29:::0;;::::1;;64388:49;64384:80;;;64439:25;::::0;-1:-1:-1;;;64439:25:0;;20414:2:1;64439:25:0::1;::::0;::::1;20396:21:1::0;20453:2;20433:18;;;20426:30;-1:-1:-1;;;20472:18:1;;;20465:45;20527:18;;64439:25:0::1;20212:339:1::0;64384:80:0::1;64494:2;64479:12;:17;;;:52;;;-1:-1:-1::0;64515:6:0::1;:16:::0;::::1;-1:-1:-1::0;;;64515:16:0;;::::1;::::0;::::1;64500:31:::0;;::::1;;64479:52;64475:81;;;64533:23;::::0;-1:-1:-1;;;64533:23:0;;20758:2:1;64533:23:0::1;::::0;::::1;20740:21:1::0;20797:2;20777:18;;;20770:30;-1:-1:-1;;;20816:18:1;;;20809:43;20869:18;;64533:23:0::1;20556:337:1::0;64475:81:0::1;64580:4;64571:6;:13;;;:35;;;;64597:9;64588:6;:18;;;64571:35;64567:73;;;64608:32;::::0;-1:-1:-1;;;64608:32:0;;21100:2:1;64608:32:0::1;::::0;::::1;21082:21:1::0;21139:2;21119:18;;;21112:30;-1:-1:-1;;;21158:18:1;;;21151:52;21220:18;;64608:32:0::1;20898:346:1::0;64567:73:0::1;64777:19:::0;;64826:1:::1;64811:16:::0;::::1;64807:46;;;64829:24;::::0;-1:-1:-1;;;64829:24:0;;21451:2:1;64829:24:0::1;::::0;::::1;21433:21:1::0;21490:2;21470:18;;;21463:30;-1:-1:-1;;;21509:18:1;;;21502:44;21563:18;;64829:24:0::1;21249:338:1::0;64807:46:0::1;64871:9;64866:129;64890:12;64886:1;:16;64866:129;;;64955:1;-1:-1:-1::0;;;;;64928:29:0::1;:12;64941:1;64928:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;64928:29:0::1;::::0;64924:59:::1;;64959:24;::::0;-1:-1:-1;;;64959:24:0;;21451:2:1;64959:24:0::1;::::0;::::1;21433:21:1::0;21490:2;21470:18;;;21463:30;-1:-1:-1;;;21509:18:1;;;21502:44;21563:18;;64959:24:0::1;21249:338:1::0;64924:59:0::1;64904:3:::0;::::1;::::0;::::1;:::i;:::-;;;;64866:129;;;-1:-1:-1::0;65054:53:0::1;::::0;-1:-1:-1;;;65054:53:0;;65031:11;;-1:-1:-1;;;;;65054:18:0;::::1;::::0;::::1;::::0;:53:::1;::::0;65073:10:::1;::::0;65093:4:::1;::::0;65100:6;;65054:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;65149:580:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;65149:580:0;::::1;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;65120:26:::1;65149:580:::0;;;;;;65369:10:::1;65149:580:::0;;;;;;::::1;::::0;;;;;;;;;;;;;;;;65120:26;;-1:-1:-1;65149:580:0;-1:-1:-1;65149:580:0;;;65120:26;65149:580:::1;;;;65541:1;65526:12;:16;:47;;65571:1;65526:47;;;65545:12;65558:1;65545:15;;;;;;;;:::i;:::-;;;;;;;65526:47;-1:-1:-1::0;;;;;65149:580:0::1;;;;;65613:1;65598:12;:16;:47;;65643:1;65598:47;;;65617:12;65630:1;65617:15;;;;;;;;:::i;:::-;;;;;;;65598:47;-1:-1:-1::0;;;;;65149:580:0::1;;;;;65685:1;65670:12;:16;:47;;65715:1;65670:47;;;65689:12;65702:1;65689:15;;;;;;;;:::i;:::-;;;;;;;65670:47;-1:-1:-1::0;;;;;65149:580:0::1;::::0;;65752:6:::1;65750:20:::0;;65120:609;;-1:-1:-1;65120:609:0;;65740:9:::1;::::0;:31:::1;::::0;:9;;65750:20:::1;::::0;-1:-1:-1;;;65750:20:0;::::1;-1:-1:-1::0;;;;;65750:20:0::1;;:::i;:::-;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;;65750:20:0;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;65740:31;;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;65740:31:0;:40;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;65740:40:0;;::::1;-1:-1:-1::0;;;;;;65740:40:0;;;;-1:-1:-1;;;65740:40:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;;;;65740:40:0;-1:-1:-1;;;65740:40:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;65740:40:0;;-1:-1:-1;;;65740:40:0::1;::::0;;::::1;;;-1:-1:-1::0;;;;;65740:40:0::1;-1:-1:-1::0;;;65740:40:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;65740:40:0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;;;;;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;;;65740:40:0;;;;::::1;;-1:-1:-1::0;;;;65740:40:0;;;;;-1:-1:-1;;;65740:40:0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;:31;;:40;-1:-1:-1;;;;65740:40:0::1;-1:-1:-1::0;;;65740:40:0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;65740:40:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;65740:40:0;;::::1;-1:-1:-1::0;;;;;65740:40:0;;::::1;;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;;::::0;;;65811:18;65798:53:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;65811:18:0;::::1;-1:-1:-1::0;;;;;65811:18:0::1;::::0;65798:53:::1;::::0;-1:-1:-1;;65798:53:0::1;-1:-1:-1::0;;65869:6:0::1;:18:::0;-1:-1:-1;;;;;;;;65869:18:0;;::::1;;::::0;-1:-1:-1;;;17152:20:0;16546:1;17672:22;;17489:213;17152:20;64115:1780;;;;;;;;:::o;65903:132::-;17108:21;:19;:21::i;:::-;65993:34:::1;65999:9;66010:4;66016:10;65993:5;:34::i;:::-;17152:20:::0;16546:1;17672:22;;17489:213;17188:293;16590:1;17322:7;;:19;17314:63;;;;-1:-1:-1;;;17314:63:0;;22148:2:1;17314:63:0;;;22130:21:1;22187:2;22167:18;;;22160:30;22226:33;22206:18;;;22199:61;22277:18;;17314:63:0;21946:355:1;17314:63:0;16590:1;17455:7;:18;17188:293::o;55977:105::-;56044:30;56055:4;49478:10;56044;:30::i;68994:247::-;69081:11;;69112:14;;:6;69128:12;;69081:103;;-1:-1:-1;;;69081:103:0;;;;;22566:25:1;;;;-1:-1:-1;;;;;69128:12:0;;22607:18:1;;;22600:59;-1:-1:-1;;;69142:18:0;;;;22675::1;;;22668:47;-1:-1:-1;;;69162:18:0;;;;;22760::1;;;22753:43;69182:1:0;22812:19:1;;;22805:44;69061:17:0;;-1:-1:-1;;;;;69081:11:0;;:30;;22538:19:1;;69081:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69195:26;;;;:15;:26;;;;;:38;;-1:-1:-1;;69195:38:0;-1:-1:-1;;;;;69195:38:0;;;;;;;;;;;-1:-1:-1;68994:247:0:o;73107:410::-;73202:4;73219:19;73268:9;73279:10;:25;;;73306:10;:18;;;73334:4;73341:12;74531:9;;74434:124;73341:12;73251:103;;23324:3:1;23302:16;;;;-1:-1:-1;;;;;;23298:51:1;73251:103:0;;;23286:64:1;23405:3;23383:16;;;;-1:-1:-1;;;;;;23379:43:1;23366:11;;;23359:64;23439:12;;;23432:28;;;;23498:2;23494:15;;;-1:-1:-1;;23490:53:1;23476:12;;;23469:75;23560:12;;23553:28;23597:12;;73251:103:0;;;;;;;;;;;;73241:114;;;;;;73219:136;;73366:14;73383:78;73397:41;73426:11;47606:58;;28319:66:1;47606:58:0;;;28307:79:1;28402:12;;;28395:28;;;47473:7:0;;28439:12:1;;47606:58:0;;;;;;;;;;;;47596:69;;;;;;47589:76;;47404:269;;;;73397:41;73440:10;:20;;;73383:13;:78::i;:::-;73366:95;;73479:30;62503:21;73502:6;73479:7;:30::i;:::-;73472:37;73107:410;-1:-1:-1;;;;;73107:410:0:o;69249:518::-;69357:15;69375:27;;;:15;:27;;;;;;;;;-1:-1:-1;;;;;69375:27:0;69442:19;;;:9;:19;;;;;69413:48;;;;;;;;;-1:-1:-1;;;;;69413:48:0;;;;;;-1:-1:-1;;;69413:48:0;;;;;;;;;;;;-1:-1:-1;;;69413:48:0;;;;;;;;;;;;;-1:-1:-1;;;69413:48:0;;;;;;;;-1:-1:-1;;;69413:48:0;;;;;;;;;69375:27;69413:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69413:48:0;;;;;;69375:27;69413:48;;;69375:27;;69357:15;69442:19;;69413:48;;;;-1:-1:-1;;;69413:48:0;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;69413:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69562:20;;;;69544:15;;69413:48;;-1:-1:-1;69413:48:0;;69544:38;;;;;:12;;69413:48;;69544:15;;;;:::i;:::-;;;;;;;:38;;;;:::i;:::-;69543:44;;69586:1;69543:44;:::i;:::-;-1:-1:-1;;;;;69598:19:0;;;;;;:9;:19;;;;;;:31;;:53;;-1:-1:-1;;;;;;;69662:42:0;;;-1:-1:-1;;;;;;;69598:53:0;;;;69662:42;;;;;69722:37;69598:53;;-1:-1:-1;69691:13:0;;69722:37;;69598:19;69722:37;69346:421;;;69249:518;;:::o;60235:238::-;60319:22;60327:4;60333:7;60319;:22::i;:::-;60314:152;;60358:6;:12;;;;;;;;;;;-1:-1:-1;;;;;60358:29:0;;;;;;;;;:36;;-1:-1:-1;;60358:36:0;60390:4;60358:36;;;60441:12;49478:10;;49398:98;60441:12;-1:-1:-1;;;;;60414:40:0;60432:7;-1:-1:-1;;;;;60414:40:0;60426:4;60414:40;;;;;;;;;;60235:238;;:::o;66217:1271::-;-1:-1:-1;;;;;66337:20:0;;66308:26;66337:20;;;:9;:20;;;;;;;;66308:49;;;;;;;;;-1:-1:-1;;;;;66308:49:0;;;;;;-1:-1:-1;;;66308:49:0;;;;;;;;;;;;-1:-1:-1;;;66308:49:0;;;;;;;;;;;;;-1:-1:-1;;;66308:49:0;;;;;;;;-1:-1:-1;;;66308:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66308:49:0;;;;;;;;;;;;66337:20;;66308:49;;;;-1:-1:-1;;;66308:49:0;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;66308:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66308:49:0;66372:6;:13;;;:30;;;;;;;;:::i;:::-;;66368:58;;66404:22;;-1:-1:-1;;;66404:22:0;;;;;;;:::i;66368:58::-;66455:14;;;;-1:-1:-1;;;;;66441:28:0;:10;:28;66437:60;;66471:26;;-1:-1:-1;;;66471:26:0;;24069:2:1;66471:26:0;;;24051:21:1;24108:2;24088:18;;;24081:30;-1:-1:-1;;;24127:18:1;;;24120:46;24183:18;;66471:26:0;23867:340:1;66437:60:0;66549:4;66525:28;;66533:6;:12;;;66525:21;;:28;;;;:::i;:::-;:35;;66556:4;66525:35;:::i;:::-;66512:9;:48;66508:80;;66562:26;;-1:-1:-1;;;66562:26:0;;24587:2:1;66562:26:0;;;24569:21:1;24626:2;24606:18;;;24599:30;-1:-1:-1;;;24645:18:1;;;24638:46;24701:18;;66562:26:0;24385:340:1;66508:80:0;66603:9;;;;;:61;;;66644:6;:20;;;66623:6;:18;;;:41;;;;:::i;:::-;66616:48;;:4;:48;;;66603:61;66599:90;;;66666:23;;-1:-1:-1;;;66666:23:0;;25108:2:1;66666:23:0;;;25090:21:1;25147:2;25127:18;;;25120:30;-1:-1:-1;;;25166:18:1;;;25159:43;25219:18;;66666:23:0;24906:337:1;66599:90:0;66736:46;66748:6;:15;;;66765:10;66777:4;66736:11;:46::i;:::-;:110;;;;66799:47;66811:6;:15;;;66828:10;66840:5;66799:11;:47::i;:::-;66736:174;;;;66863:47;66875:6;:15;;;66892:10;66904:5;66863:11;:47::i;:::-;66732:749;;;-1:-1:-1;;;;;66952:21:0;;66927:15;66952:21;;;:10;:21;;;;;;;;:28;67031:201;;;;;;;;;-1:-1:-1;;;;;67031:201:0;;;;67119:20;;;;66952:28;;66927:15;67031:201;;;67119:27;;67142:4;;67119:27;:::i;:::-;67031:201;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67247:21:0;;-1:-1:-1;67247:21:0;;;:10;:21;;;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67247:39:0;-1:-1:-1;;;;67247:39:0;;;-1:-1:-1;;;67247:39:0;;;;;-1:-1:-1;;;;67247:39:0;;;-1:-1:-1;;;67247:39:0;-1:-1:-1;;;;;;67247:39:0;;;-1:-1:-1;;;;;67247:39:0;;;;;;;;;;;;;;;;;;;;;;;67301:20;;:9;:20;;;;;;;:42;;66996:236;;-1:-1:-1;67175:4:0;;67301:20;;:34;;:42;;67175:4;;-1:-1:-1;;;67301:42:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;67397:10;-1:-1:-1;;;;;67365:43:0;67387:8;67365:43;;67376:9;-1:-1:-1;;;;;67365:43:0;;;;;;;;;;;66912:508;;66732:749;;;67441:28;;-1:-1:-1;;;67441:28:0;;25623:2:1;67441:28:0;;;25605:21:1;25662:2;25642:18;;;25635:30;-1:-1:-1;;;25681:18:1;;;25674:48;25739:18;;67441:28:0;25421:342:1;66732:749:0;66297:1191;66217:1271;;;:::o;60653:239::-;60737:22;60745:4;60751:7;60737;:22::i;:::-;60733:152;;;60808:5;60776:12;;;;;;;;;;;-1:-1:-1;;;;;60776:29:0;;;;;;;;;;:37;;-1:-1:-1;;60776:37:0;;;60833:40;49478:10;;60776:12;;60833:40;;60808:5;60833:40;60653:239;;:::o;72436:629::-;72534:7;72558:5;:12;72574:1;72558:17;72554:31;;-1:-1:-1;72584:1:0;72577:8;;72554:31;72639:12;;72598:11;;72664:239;72677:4;72671:3;:10;72664:239;;;72698:11;72712:23;72725:3;72730:4;72712:12;:23::i;:::-;72698:37;;72780:11;72754:5;72760:3;72754:10;;;;;;;;:::i;:::-;;;;;;;:23;;;:37;;;72750:142;;;72819:3;72812:10;;72750:142;;;72869:7;:3;72875:1;72869:7;:::i;:::-;72863:13;;72750:142;72683:220;72664:239;;;72925:1;72919:3;:7;:53;;;;-1:-1:-1;72961:11:0;72930:5;72936:7;72942:1;72936:3;:7;:::i;:::-;72930:14;;;;;;;;:::i;:::-;;;;;;;:27;;;:42;;;72919:53;72915:143;;;72996:7;73002:1;72996:3;:7;:::i;:::-;72989:14;;;;;;72915:143;-1:-1:-1;73043:3:0;-1:-1:-1;73036:10:0;;2083:113;2156:7;;-1:-1:-1;;;;;2156:7:0;2142:10;:21;2134:56;;;;-1:-1:-1;;;2134:56:0;;26103:2:1;2134:56:0;;;26085:21:1;26142:2;26122:18;;;26115:30;-1:-1:-1;;;26161:18:1;;;26154:52;26223:18;;2134:56:0;25901:346:1;2134:56:0;2083:113::o;1839:194::-;1908:10;-1:-1:-1;;;;;1902:16:0;;;1894:52;;;;-1:-1:-1;;;1894:52:0;;26454:2:1;1894:52:0;;;26436:21:1;26493:2;26473:18;;;26466:30;26532:25;26512:18;;;26505:53;26575:18;;1894:52:0;26252:347:1;1894:52:0;1955:14;:19;;-1:-1:-1;;;;;;1955:19:0;-1:-1:-1;;;;;1955:19:0;;;;;;;;;2015:7;;1988:39;;1955:19;;2015:7;;1988:39;;-1:-1:-1;;1988:39:0;1839:194;:::o;56372:492::-;56461:22;56469:4;56475:7;56461;:22::i;:::-;56456:401;;56649:28;56669:7;56649:19;:28::i;:::-;56750:38;56778:4;56785:2;56750:19;:38::i;:::-;56554:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;56554:257:0;;;;;;;;;;-1:-1:-1;;;56500:345:0;;;;;;;:::i;43714:231::-;43792:7;43813:17;43832:18;43854:27;43865:4;43871:9;43854:10;:27::i;:::-;43812:69;;;;43892:18;43904:5;43892:11;:18::i;:::-;-1:-1:-1;43928:9:0;43714:231;-1:-1:-1;;;43714:231:0:o;67496:273::-;67598:4;-1:-1:-1;;;;;67619:25:0;;67615:46;;-1:-1:-1;67653:8:0;67646:15;;67615:46;67728:29;;-1:-1:-1;;;67728:29:0;;-1:-1:-1;;;;;7836:32:1;;;67728:29:0;;;7818:51:1;67698:11:0;;67674:13;;67728:15;;;;;7791:18:1;;67728:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;67721:40;;;67496:273;;;;;;:::o;25622:156::-;25684:7;25759:11;25769:1;25760:5;;;25759:11;:::i;:::-;25749:21;;25750:5;;;25749:21;:::i;39800:151::-;39858:13;39891:52;-1:-1:-1;;;;;39903:22:0;;37955:2;39196:447;39271:13;39297:19;39329:10;39333:6;39329:1;:10;:::i;:::-;:14;;39342:1;39329:14;:::i;:::-;-1:-1:-1;;;;;39319:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39319:25:0;;39297:47;;-1:-1:-1;;;39355:6:0;39362:1;39355:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;39355:15:0;;;;;;;;;-1:-1:-1;;;39381:6:0;39388:1;39381:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;39381:15:0;;;;;;;;-1:-1:-1;39412:9:0;39424:10;39428:6;39424:1;:10;:::i;:::-;:14;;39437:1;39424:14;:::i;:::-;39412:26;;39407:131;39444:1;39440;:5;39407:131;;;-1:-1:-1;;;39488:5:0;39496:3;39488:11;39479:21;;;;;;;:::i;:::-;;;;39467:6;39474:1;39467:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;39467:33:0;;;;;;;;-1:-1:-1;39525:1:0;39515:11;;;;;39447:3;;;:::i;:::-;;;39407:131;;;-1:-1:-1;39556:10:0;;39548:55;;;;-1:-1:-1;;;39548:55:0;;28930:2:1;39548:55:0;;;28912:21:1;;;28949:18;;;28942:30;29008:34;28988:18;;;28981:62;29060:18;;39548:55:0;28728:356:1;42165:747:0;42246:7;42255:12;42284:9;:16;42304:2;42284:22;42280:625;;42628:4;42613:20;;42607:27;42678:4;42663:20;;42657:27;42736:4;42721:20;;42715:27;42323:9;42707:36;42779:25;42790:4;42707:36;42607:27;42657;42779:10;:25::i;:::-;42772:32;;;;;;;;;42280:625;-1:-1:-1;42853:1:0;;-1:-1:-1;42857:35:0;42280:625;42165:747;;;;;:::o;40558:521::-;40636:20;40627:5;:29;;;;;;;;:::i;:::-;;40623:449;;40558:521;:::o;40623:449::-;40734:29;40725:5;:38;;;;;;;;:::i;:::-;;40721:351;;40780:34;;-1:-1:-1;;;40780:34:0;;29291:2:1;40780:34:0;;;29273:21:1;29330:2;29310:18;;;29303:30;29369:26;29349:18;;;29342:54;29413:18;;40780:34:0;29089:348:1;40721:351:0;40845:35;40836:5;:44;;;;;;;;:::i;:::-;;40832:240;;40897:41;;-1:-1:-1;;;40897:41:0;;29644:2:1;40897:41:0;;;29626:21:1;29683:2;29663:18;;;29656:30;29722:33;29702:18;;;29695:61;29773:18;;40897:41:0;29442:355:1;40832:240:0;40969:30;40960:5;:39;;;;;;;;:::i;:::-;;40956:116;;41016:44;;-1:-1:-1;;;41016:44:0;;30004:2:1;41016:44:0;;;29986:21:1;30043:2;30023:18;;;30016:30;30082:34;30062:18;;;30055:62;-1:-1:-1;;;30133:18:1;;;30126:32;30175:19;;41016:44:0;29802:398:1;45166:1520:0;45297:7;;46231:66;46218:79;;46214:163;;;-1:-1:-1;46330:1:0;;-1:-1:-1;46334:30:0;46314:51;;46214:163;46491:24;;;46474:14;46491:24;;;;;;;;;30432:25:1;;;30505:4;30493:17;;30473:18;;;30466:45;;;;30527:18;;;30520:34;;;30570:18;;;30563:34;;;46491:24:0;;30404:19:1;;46491:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46491:24:0;;-1:-1:-1;;46491:24:0;;;-1:-1:-1;;;;;;;46530:20:0;;46526:103;;46583:1;46587:29;46567:50;;;;;;;46526:103;46649:6;-1:-1:-1;46657:20:0;;-1:-1:-1;45166:1520:0;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;593:171;660:20;;-1:-1:-1;;;;;709:30:1;;699:41;;689:69;;754:1;751;744:12;689:69;593:171;;;:::o;769:184::-;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:28;937:9;919:28;:::i;958:127::-;1019:10;1014:3;1010:20;1007:1;1000:31;1050:4;1047:1;1040:15;1074:4;1071:1;1064:15;1090:253;1162:2;1156:9;1204:4;1192:17;;-1:-1:-1;;;;;1224:34:1;;1260:22;;;1221:62;1218:88;;;1286:18;;:::i;:::-;1322:2;1315:22;1090:253;:::o;1348:275::-;1419:2;1413:9;1484:2;1465:13;;-1:-1:-1;;1461:27:1;1449:40;;-1:-1:-1;;;;;1504:34:1;;1540:22;;;1501:62;1498:88;;;1566:18;;:::i;:::-;1602:2;1595:22;1348:275;;-1:-1:-1;1348:275:1:o;1628:163::-;1695:20;;1755:10;1744:22;;1734:33;;1724:61;;1781:1;1778;1771:12;1796:1225;1890:6;1898;1951:2;1939:9;1930:7;1926:23;1922:32;1919:52;;;1967:1;1964;1957:12;1919:52;1990:28;2008:9;1990:28;:::i;:::-;1980:38;;2037:2;2090;2079:9;2075:18;2062:32;-1:-1:-1;;;;;2154:2:1;2146:6;2143:14;2140:34;;;2170:1;2167;2160:12;2140:34;2193:22;;;;2249:4;2231:16;;;2227:27;2224:47;;;2267:1;2264;2257:12;2224:47;2293:22;;:::i;:::-;2351:2;2338:16;2331:5;2324:31;2387:30;2413:2;2409;2405:11;2387:30;:::i;:::-;2382:2;2375:5;2371:14;2364:54;2464:2;2460;2456:11;2443:25;2493:2;2483:8;2480:16;2477:36;;;2509:1;2506;2499:12;2477:36;2540:8;2536:2;2532:17;2522:27;;;2587:7;2580:4;2576:2;2572:13;2568:27;2558:55;;2609:1;2606;2599:12;2558:55;2645:2;2632:16;2667:2;2663;2660:10;2657:36;;;2673:18;;:::i;:::-;2715:53;2758:2;2739:13;;-1:-1:-1;;2735:27:1;2731:36;;2715:53;:::i;:::-;2702:66;;2791:2;2784:5;2777:17;2831:7;2826:2;2821;2817;2813:11;2809:20;2806:33;2803:53;;;2852:1;2849;2842:12;2803:53;2907:2;2902;2898;2894:11;2889:2;2882:5;2878:14;2865:45;2951:1;2946:2;2941;2934:5;2930:14;2926:23;2919:34;;2985:5;2980:2;2973:5;2969:14;2962:29;3010:5;3000:15;;;;;;1796:1225;;;;;:::o;3026:183::-;3086:4;-1:-1:-1;;;;;3111:6:1;3108:30;3105:56;;;3141:18;;:::i;:::-;-1:-1:-1;3186:1:1;3182:14;3198:4;3178:25;;3026:183::o;3214:959::-;3307:6;3315;3368:2;3356:9;3347:7;3343:23;3339:32;3336:52;;;3384:1;3381;3374:12;3336:52;3420:9;3407:23;3397:33;;3449:2;3502;3491:9;3487:18;3474:32;-1:-1:-1;;;;;3521:6:1;3518:30;3515:50;;;3561:1;3558;3551:12;3515:50;3584:22;;3637:4;3629:13;;3625:27;-1:-1:-1;3615:55:1;;3666:1;3663;3656:12;3615:55;3702:2;3689:16;3725:60;3741:43;3781:2;3741:43;:::i;:::-;3725:60;:::i;:::-;3819:15;;;3901:1;3897:10;;;;3889:19;;3885:28;;;3850:12;;;;3925:19;;;3922:39;;;3957:1;3954;3947:12;3922:39;3981:11;;;;4001:142;4017:6;4012:3;4009:15;4001:142;;;4083:17;;4071:30;;4034:12;;;;4121;;;;4001:142;;;4162:5;4152:15;;;;;;;3214:959;;;;;:::o;4178:180::-;4237:6;4290:2;4278:9;4269:7;4265:23;4261:32;4258:52;;;4306:1;4303;4296:12;4258:52;-1:-1:-1;4329:23:1;;4178:180;-1:-1:-1;4178:180:1:o;4848:1070::-;5081:2;5133:21;;;5203:13;;5106:18;;;5225:22;;;5052:4;;5081:2;5266;;5284:18;;;;5325:15;;;5052:4;5368:524;5382:6;5379:1;5376:13;5368:524;;;5441:13;;5483:9;;-1:-1:-1;;;;;5479:35:1;5467:48;;5554:11;;;5548:18;5589:6;5629:21;;;5615:12;;;5608:43;5695:11;;;5689:18;5685:27;5671:12;;;5664:49;5736:4;5784:11;;;5778:18;5798:10;5774:35;5760:12;;;5753:57;5839:4;5830:14;;;;5867:15;;;;5511:1;5397:9;5368:524;;;-1:-1:-1;5909:3:1;;4848:1070;-1:-1:-1;;;;;;;4848:1070:1:o;5923:252::-;5990:6;5998;6051:2;6039:9;6030:7;6026:23;6022:32;6019:52;;;6067:1;6064;6057:12;6019:52;6090:28;6108:9;6090:28;:::i;:::-;6080:38;6165:2;6150:18;;;;6137:32;;-1:-1:-1;;;5923:252:1:o;6656:131::-;-1:-1:-1;;;;;6731:31:1;;6721:42;;6711:70;;6777:1;6774;6767:12;6792:315;6860:6;6868;6921:2;6909:9;6900:7;6896:23;6892:32;6889:52;;;6937:1;6934;6927:12;6889:52;6973:9;6960:23;6950:33;;7033:2;7022:9;7018:18;7005:32;7046:31;7071:5;7046:31;:::i;:::-;7096:5;7086:15;;;6792:315;;;;;:::o;7112:159::-;7179:20;;7239:6;7228:18;;7218:29;;7208:57;;7261:1;7258;7251:12;7276:391;7351:6;7359;7367;7420:2;7408:9;7399:7;7395:23;7391:32;7388:52;;;7436:1;7433;7426:12;7388:52;7459:28;7477:9;7459:28;:::i;:::-;7449:38;;7506:37;7539:2;7528:9;7524:18;7506:37;:::i;:::-;7496:47;;7593:2;7582:9;7578:18;7565:32;7606:31;7631:5;7606:31;:::i;:::-;7656:5;7646:15;;;7276:391;;;;;:::o;7880:127::-;7941:10;7936:3;7932:20;7929:1;7922:31;7972:4;7969:1;7962:15;7996:4;7993:1;7986:15;8012:137;8090:1;8083:5;8080:12;8070:46;;8096:18;;:::i;:::-;8125;;8012:137::o;8154:1228::-;-1:-1:-1;;;;;8649:32:1;;8631:51;;8701:10;8747:15;;;8742:2;8727:18;;8720:43;8799:15;;8794:2;8779:18;;8772:43;8863:6;8851:19;;;8846:2;8831:18;;8824:47;4719:18;;8921:3;8906:19;;4707:31;8618:3;8603:19;;-1:-1:-1;;;;;4611:31:1;;8977:3;8962:19;;4599:44;4825:10;4814:22;;9032:3;9017:19;;4802:35;4730:6;4719:18;;9087:3;9072:19;;4707:31;375:13;;368:21;9140:3;9125:19;;356:34;9154:51;9200:3;9189:9;9185:19;9177:6;9154:51;:::i;:::-;-1:-1:-1;;;;;4611:31:1;;9257:3;9242:19;;4599:44;-1:-1:-1;;;;;4611:31:1;;9314:3;9299:19;;4599:44;-1:-1:-1;;;;;4611:31:1;;9371:3;9356:19;;4599:44;8154:1228;;;;;;;;;;;;;;;;:::o;9387:256::-;9453:6;9461;9514:2;9502:9;9493:7;9489:23;9485:32;9482:52;;;9530:1;9527;9520:12;9482:52;9553:28;9571:9;9553:28;:::i;:::-;9543:38;;9600:37;9633:2;9622:9;9618:18;9600:37;:::i;:::-;9590:47;;9387:256;;;;;:::o;9648:397::-;9731:6;9739;9747;9755;9808:3;9796:9;9787:7;9783:23;9779:33;9776:53;;;9825:1;9822;9815:12;9776:53;9848:28;9866:9;9848:28;:::i;:::-;9838:38;;9923:2;9912:9;9908:18;9895:32;9885:42;;9946:37;9979:2;9968:9;9964:18;9946:37;:::i;:::-;9936:47;;10002:37;10035:2;10024:9;10020:18;10002:37;:::i;:::-;9992:47;;9648:397;;;;;;;:::o;11362:327::-;11437:6;11445;11498:2;11486:9;11477:7;11473:23;11469:32;11466:52;;;11514:1;11511;11504:12;11466:52;11537:28;11555:9;11537:28;:::i;:::-;11527:38;;11615:2;11604:9;11600:18;11587:32;11628:31;11653:5;11628:31;:::i;11694:247::-;11753:6;11806:2;11794:9;11785:7;11781:23;11777:32;11774:52;;;11822:1;11819;11812:12;11774:52;11861:9;11848:23;11880:31;11905:5;11880:31;:::i;11946:1398::-;12071:6;12079;12087;12095;12103;12111;12164:3;12152:9;12143:7;12139:23;12135:33;12132:53;;;12181:1;12178;12171:12;12132:53;12220:9;12207:23;12239:31;12264:5;12239:31;:::i;:::-;12289:5;-1:-1:-1;12313:2:1;12334:37;12352:18;;;12334:37;:::i;:::-;12324:47;;12390:37;12423:2;12412:9;12408:18;12390:37;:::i;:::-;12380:47;;12446:37;12479:2;12468:9;12464:18;12446:37;:::i;:::-;12436:47;;12502:38;12535:3;12524:9;12520:19;12502:38;:::i;:::-;12492:48;;12591:3;12580:9;12576:19;12563:33;-1:-1:-1;;;;;12611:6:1;12608:30;12605:50;;;12651:1;12648;12641:12;12605:50;12674:22;;12727:4;12719:13;;12715:27;-1:-1:-1;12705:55:1;;12756:1;12753;12746:12;12705:55;12792:2;12779:16;12815:60;12831:43;12871:2;12831:43;:::i;12815:60::-;12909:15;;;12991:1;12987:10;;;;12979:19;;12975:28;;;12940:12;;;;13015:19;;;13012:39;;;13047:1;13044;13037:12;13012:39;13071:11;;;;13091:223;13107:6;13102:3;13099:15;13091:223;;;13189:3;13176:17;13206:33;13231:7;13206:33;:::i;:::-;13252:20;;13124:12;;;;13292;;;;13091:223;;;13333:5;13323:15;;;;;;;11946:1398;;;;;;;;:::o;13349:256::-;13415:6;13423;13476:2;13464:9;13455:7;13451:23;13447:32;13444:52;;;13492:1;13489;13482:12;13444:52;13515:28;13533:9;13515:28;:::i;13610:336::-;13812:2;13794:21;;;13851:2;13831:18;;;13824:30;-1:-1:-1;;;13885:2:1;13870:18;;13863:42;13937:2;13922:18;;13610:336::o;15679:127::-;15740:10;15735:3;15731:20;15728:1;15721:31;15771:4;15768:1;15761:15;15795:4;15792:1;15785:15;16722:246;16869:2;16854:18;;16902:1;16891:13;;16881:47;;16908:18;;:::i;:::-;16937:25;;;16722:246;:::o;17698:127::-;17759:10;17754:3;17750:20;17747:1;17740:31;17790:4;17787:1;17780:15;17814:4;17811:1;17804:15;18524:391;-1:-1:-1;;;;;18781:15:1;;;18763:34;;18833:15;;;;18828:2;18813:18;;18806:43;18897:10;18885:23;;;18880:2;18865:18;;18858:51;18713:2;18698:18;;18524:391::o;19900:127::-;19961:10;19956:3;19952:20;19949:1;19942:31;19992:4;19989:1;19982:15;20016:4;20013:1;20006:15;20032:175;20100:10;20143;;;20131;;;20127:27;;20166:12;;;20163:38;;;20181:18;;:::i;:::-;20163:38;20032:175;;;;:::o;21592:135::-;21631:3;21652:17;;;21649:43;;21672:18;;:::i;:::-;-1:-1:-1;21719:1:1;21708:13;;21592:135::o;21732:209::-;21770:3;-1:-1:-1;;;;;21851:2:1;21844:5;21840:14;21878:2;21869:7;21866:15;21863:41;;21884:18;;:::i;:::-;21933:1;21920:15;;21732:209;-1:-1:-1;;;21732:209:1:o;22860:184::-;22930:6;22983:2;22971:9;22962:7;22958:23;22954:32;22951:52;;;22999:1;22996;22989:12;22951:52;-1:-1:-1;23022:16:1;;22860:184;-1:-1:-1;22860:184:1:o;23620:112::-;23652:1;23678;23668:35;;23683:18;;:::i;:::-;-1:-1:-1;23717:9:1;;23620:112::o;23737:125::-;23802:9;;;23823:10;;;23820:36;;;23836:18;;:::i;24212:168::-;24285:9;;;24316;;24333:15;;;24327:22;;24313:37;24303:71;;24354:18;;:::i;24730:171::-;24798:6;24837:10;;;24825;;;24821:27;;24860:12;;;24857:38;;;24875:18;;:::i;25248:168::-;25315:6;25341:10;;;25353;;;25337:27;;25376:11;;;25373:37;;;25390:18;;:::i;25768:128::-;25835:9;;;25856:11;;;25853:37;;;25870:18;;:::i;26604:250::-;26689:1;26699:113;26713:6;26710:1;26707:13;26699:113;;;26789:11;;;26783:18;26770:11;;;26763:39;26735:2;26728:10;26699:113;;;-1:-1:-1;;26846:1:1;26828:16;;26821:27;26604:250::o;26859:812::-;27270:25;27265:3;27258:38;27240:3;27325:6;27319:13;27341:75;27409:6;27404:2;27399:3;27395:12;27388:4;27380:6;27376:17;27341:75;:::i;:::-;-1:-1:-1;;;27475:2:1;27435:16;;;27467:11;;;27460:40;27525:13;;27547:76;27525:13;27609:2;27601:11;;27594:4;27582:17;;27547:76;:::i;:::-;27643:17;27662:2;27639:26;;26859:812;-1:-1:-1;;;;26859:812:1:o;27676:396::-;27825:2;27814:9;27807:21;27788:4;27857:6;27851:13;27900:6;27895:2;27884:9;27880:18;27873:34;27916:79;27988:6;27983:2;27972:9;27968:18;27963:2;27955:6;27951:15;27916:79;:::i;:::-;28056:2;28035:15;-1:-1:-1;;28031:29:1;28016:45;;;;28063:2;28012:54;;27676:396;-1:-1:-1;;27676:396:1:o;28462:120::-;28502:1;28528;28518:35;;28533:18;;:::i;:::-;-1:-1:-1;28567:9:1;;28462:120::o;28587:136::-;28626:3;28654:5;28644:39;;28663:18;;:::i;:::-;-1:-1:-1;;;28699:18:1;;28587:136::o
Swarm Source
ipfs://07be3c84c0f0f736a14959501e524a126b3b3976be0107111a425a4089ccc2f3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.