Overview
TokenID
90
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MBMegaOrbs
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-03 */ /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // 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; } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // 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; } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; ////import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.13; ////import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title UpdatableOperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. This contract allows the Owner to update the * OperatorFilterRegistry address via updateOperatorFilterRegistryAddress, including to the zero address, * which will bypass registry checks. * Note that OpenSea will still disable creator fee enforcement if filtered operators begin fulfilling orders * on-chain, eg, if the registry is revoked or bypassed. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract UpdatableOperatorFilterer { error OperatorNotAllowed(address operator); error OnlyOwner(); IOperatorFilterRegistry public operatorFilterRegistry; constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe) { IOperatorFilterRegistry registry = IOperatorFilterRegistry(_registry); operatorFilterRegistry = registry; // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(registry).code.length > 0) { if (subscribe) { registry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { registry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { registry.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @notice Update the address that the contract will make OperatorFilter checks against. When set to the zero * address, checks will be bypassed. OnlyOwner. */ function updateOperatorFilterRegistryAddress(address newRegistry) public virtual { if (msg.sender != owner()) { revert OnlyOwner(); } operatorFilterRegistry = IOperatorFilterRegistry(newRegistry); } /** * @dev assume the contract has an owner, but leave specific Ownable implementation up to inheriting contract */ function owner() public view virtual returns (address); function _checkFilterOperator(address operator) internal view virtual { IOperatorFilterRegistry registry = operatorFilterRegistry; // Check registry code length to facilitate testing in environments without a deployed registry. if (address(registry) != address(0) && address(registry).code.length > 0) { if (!registry.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.13; ////import {UpdatableOperatorFilterer} from "./UpdatableOperatorFilterer.sol"; ////import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title RevokableOperatorFilterer * @notice This contract is meant to allow contracts to permanently skip OperatorFilterRegistry checks if desired. The * Registry itself has an "unregister" function, but if the contract is ownable, the owner can re-register at * any point. As implemented, this abstract contract allows the contract owner to permanently skip the * OperatorFilterRegistry checks by calling revokeOperatorFilterRegistry. Once done, the registry * address cannot be further updated. * Note that OpenSea will still disable creator fee enforcement if filtered operators begin fulfilling orders * on-chain, eg, if the registry is revoked or bypassed. */ abstract contract RevokableOperatorFilterer is UpdatableOperatorFilterer { error RegistryHasBeenRevoked(); error InitialRegistryAddressCannotBeZeroAddress(); bool public isOperatorFilterRegistryRevoked; constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe) UpdatableOperatorFilterer(_registry, subscriptionOrRegistrantToCopy, subscribe) { // don't allow creating a contract with a permanently revoked registry if (_registry == address(0)) { revert InitialRegistryAddressCannotBeZeroAddress(); } } function _checkFilterOperator(address operator) internal view virtual override { if (address(operatorFilterRegistry) != address(0)) { super._checkFilterOperator(operator); } } /** * @notice Update the address that the contract will make OperatorFilter checks against. When set to the zero * address, checks will be permanently bypassed, and the address cannot be updated again. OnlyOwner. */ function updateOperatorFilterRegistryAddress(address newRegistry) public override { if (msg.sender != owner()) { revert OnlyOwner(); } // if registry has been revoked, do not allow further updates if (isOperatorFilterRegistryRevoked) { revert RegistryHasBeenRevoked(); } operatorFilterRegistry = IOperatorFilterRegistry(newRegistry); } /** * @notice Revoke the OperatorFilterRegistry address, permanently bypassing checks. OnlyOwner. */ function revokeOperatorFilterRegistry() public { if (msg.sender != owner()) { revert OnlyOwner(); } // if registry has been revoked, do not allow further updates if (isOperatorFilterRegistryRevoked) { revert RegistryHasBeenRevoked(); } // set to zero address to bypass checks operatorFilterRegistry = IOperatorFilterRegistry(address(0)); isOperatorFilterRegistryRevoked = true; } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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`, * 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 be 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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * 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 payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // 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); } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; ////import "./IERC165.sol"; /** * @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; } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; ////import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // 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); } } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity 0.8.17; ////import "@openzeppelin/contracts/access/Ownable.sol"; ////import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; abstract contract TeamPaidFirst is Ownable, ReentrancyGuard { struct PayeeDetail { address payable payeeAddress; uint256 shares; } address payable public projectAddress; PayeeDetail[] public payeeDetails; uint256 public balanceAfterTeamPayments; uint8 private _shareDenominator; mapping(address => bool) private _payees; event TeamMemberPaid( address payee, uint256 payableBalance, uint256 paymentAmount ); modifier onlyOwnerOrTeamMember() { if (_msgSender() == owner() || _payees[_msgSender()]) { _; } else { revert NotOwnerOrPayee(); } } error ZeroAddress(); error ZeroAmount(); error SharesExceeded(); error InvalidShareDenominator(); error PaymentFailed(); error NotOwnerOrPayee(); error NoPayableBalance(); error ExceedsWithdrawLimit(); constructor(address payable project, uint8 shareDenominator) { if (project == address(0)) { revert ZeroAddress(); } if (shareDenominator == 0) { revert InvalidShareDenominator(); } projectAddress = project; _shareDenominator = shareDenominator; } function _addPayee(address payable payeeAddress, uint256 shares) internal onlyOwner { PayeeDetail memory payeeDetail = PayeeDetail(payeeAddress, shares); _payees[payeeDetail.payeeAddress] = true; payeeDetails.push(payeeDetail); _validateAllocation(); } function _validateAllocation() private view { uint256 totalAllocatedShares; for (uint8 i = 0; i < payeeDetails.length; i++) { PayeeDetail memory payeeDetail = payeeDetails[i]; if (payeeDetail.payeeAddress == address(0)) { revert ZeroAddress(); } totalAllocatedShares = totalAllocatedShares + payeeDetail.shares; if (totalAllocatedShares / _shareDenominator > 100) { revert SharesExceeded(); } } } function payTeam() external onlyOwnerOrTeamMember nonReentrant { if(address(this).balance <= balanceAfterTeamPayments) { revert NoPayableBalance(); } uint256 payableBalance = address(this).balance - balanceAfterTeamPayments; for (uint256 i = 0; i < payeeDetails.length; i++) { PayeeDetail memory payee = payeeDetails[i]; uint256 paymentAmount = (payableBalance * (payee.shares/_shareDenominator)) / 100; // Keep track of the balance after each time the team is paid so we don't pay the team // on amounts they've already been paid from balanceAfterTeamPayments += (payableBalance - paymentAmount); // solhint-disable-next-line multiple-sends if (!payable(payee.payeeAddress).send(paymentAmount)) { revert PaymentFailed(); } emit TeamMemberPaid( payee.payeeAddress, payableBalance, paymentAmount ); } } function withdraw(uint256 amount) external onlyOwner nonReentrant { if(amount == 0) { revert ZeroAmount(); } if(amount > balanceAfterTeamPayments) { revert ExceedsWithdrawLimit(); } balanceAfterTeamPayments -= amount; if (!payable(projectAddress).send(amount)) { revert PaymentFailed(); } } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.13; ////import {RevokableOperatorFilterer} from "./RevokableOperatorFilterer.sol"; /** * @title RevokableDefaultOperatorFilterer * @notice Inherits from RevokableOperatorFilterer and automatically subscribes to the default OpenSea subscription. * Note that OpenSea will disable creator fee enforcement if filtered operators begin fulfilling orders * on-chain, eg, if the registry is revoked or bypassed. */ abstract contract RevokableDefaultOperatorFilterer is RevokableOperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() RevokableOperatorFilterer(0x000000000000AAeB6D7670E522A718067333cd4E, DEFAULT_SUBSCRIPTION, true) {} } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; ////import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; ////import "../../interfaces/IERC2981.sol"; ////import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * ////IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; ////import "./math/Math.sol"; /** * @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); } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } /** * SourceUnit: MBMegaOrbs.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity 0.8.17; ////import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; ////import "@openzeppelin/contracts/utils/Strings.sol"; ////import "@openzeppelin/contracts/token/common/ERC2981.sol"; ////import "erc721a/contracts/ERC721A.sol"; ////import "operator-filter-registry/src/RevokableDefaultOperatorFilterer.sol"; ////import "operator-filter-registry/src/UpdatableOperatorFilterer.sol"; ////import "../../../../Common/Contracts/paper-hand-labs/TeamPaidFirst.sol"; /* ███╗ ███╗███████╗██╗ ██╗ █████╗ ██████╗ ███████╗ █████╗ ███████╗████████╗ ████╗ ████║██╔════╝██║ ██╔╝██╔══██╗ ██╔══██╗██╔════╝██╔══██╗██╔════╝╚══██╔══╝ ██╔████╔██║█████╗ █████╔╝ ███████║ ██████╔╝█████╗ ███████║███████╗ ██║ ██║╚██╔╝██║██╔══╝ ██╔═██╗ ██╔══██║ ██╔══██╗██╔══╝ ██╔══██║╚════██║ ██║ ██║ ╚═╝ ██║███████╗██║ ██╗██║ ██║ ██████╔╝███████╗██║ ██║███████║ ██║ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ███╗ ███╗███████╗ ██████╗ █████╗ ██████╗ ██████╗ ██████╗ ███████╗ ████╗ ████║██╔════╝██╔════╝ ██╔══██╗ ██╔═══██╗██╔══██╗██╔══██╗██╔════╝ ██╔████╔██║█████╗ ██║ ███╗███████║ ██║ ██║██████╔╝██████╔╝███████╗ ██║╚██╔╝██║██╔══╝ ██║ ██║██╔══██║ ██║ ██║██╔══██╗██╔══██╗╚════██║ ██║ ╚═╝ ██║███████╗╚██████╔╝██║ ██║ ╚██████╔╝██║ ██║██████╔╝███████║ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝ */ /** @title Meka Beast Mega Orbs @author Paper Hand Labs <hello[at]paperhandlabs[dot]com> */ contract MBMegaOrbs is ERC721A, RevokableDefaultOperatorFilterer, ERC2981, TeamPaidFirst { using Strings for uint256; uint256 public constant MAX_SUPPLY = 300; uint8 public constant DAILY_ACCRUAL_RATE = 12; uint256 public mintPrice = 0.488 ether; bytes32 public allowListMerkleRoot; bool public mintActive; uint256 public revealedCount; // (minter => number of mints) mapping(address => uint8) public mintCounts; // (tokenId => epoch timestamp since mint or the last transfer) mapping(uint256 => uint256) public tokenAccrualStart; string public baseURI; string public contractURI; address private constant _TREASURY = 0x150A156f1937F6c9EBd9547c13e108d43332CB4a; address private constant _PAPER_HAND_LABS = 0x338E0421b72dA8ADc371f3247255A8c7dc4fa69d; // (tokenId => should override accrual start date reset) mapping(uint256 => bool) private _overrideTokenAccrualReset; event MintStateChanged(bool active); event MintPriceChanged(uint256 newPrice); event BatchRevealed(uint256 batchSize, uint256 totalRevealed); event AccrualReset( uint256 indexed tokenId, uint256 indexed timestamp, address indexed holder ); /** @notice Ensures that the msg.sender is present in the merkle tree by validating the provided proof against the merkle root. */ modifier validProof(bytes32[] calldata merkleProof) { if ( !MerkleProof.verify( merkleProof, allowListMerkleRoot, keccak256(abi.encodePacked(_msgSender())) ) ) { revert InvalidProof(); } _; } error NotOwner(); error QueryForNonexistentToken(); error InvalidProof(); error EmptyString(string source); error MintInactive(); error IncorrectAmount(); error AllowedMintQuantityExceeded(); error InvalidMerkleRoot(); error ExceedsMaxSupply(); error ZeroQuantity(); constructor( string memory name_, string memory symbol_, string memory baseUri_, string memory contractUri_ ) ERC721A(name_, symbol_) TeamPaidFirst(payable(_TREASURY), 1) { if (bytes(name_).length == 0) { revert EmptyString("name_"); } if (bytes(symbol_).length == 0) { revert EmptyString("symbol_"); } if (bytes(baseUri_).length == 0) { revert EmptyString("baseUri_"); } if (bytes(contractUri_).length == 0) { revert EmptyString("contractUri_"); } baseURI = baseUri_; contractURI = contractUri_; // PHL, 9% _addPayee(payable(_PAPER_HAND_LABS), 9); _setDefaultRoyalty(_TREASURY, 750); } /** @notice Allows individuals on the allow list to mint 1 NFT. @param merkleProof the merkle proof used to prove that the msg.sender is, in fact, part of the allow list. */ function mint(bytes32[] calldata merkleProof) external payable nonReentrant validProof(merkleProof) { if (!mintActive) { revert MintInactive(); } if (msg.value != mintPrice) { revert IncorrectAmount(); } if (mintCounts[_msgSender()] != 0) { revert AllowedMintQuantityExceeded(); } mintCounts[_msgSender()] = 1; _internalMint(_msgSender(), 1); } /** @notice Allows the contract owner to mint and transfer NFTs to the the specified address. @param recipient the address that the NFT should be transferred to. @param qty the number of NFTs to mint and transfer to the `recipient`. */ function mintTo(address recipient, uint256 qty) external nonReentrant onlyOwner { _internalMint(recipient, qty); } /** @notice Allows holders - or accounts approved by the owner - to burn the specified NFT. @dev {ERC721A-_burn} validates that the caller is the owner or approved. @param tokenId The id of the NFT/token to burn. */ function burn(uint256 tokenId) external { _burn(tokenId, true); tokenAccrualStart[tokenId] = 0; } /** @notice Allows holders - or accounts approved by the owner - to transfer their NFT without losing their accrued ORB energy. @dev We prevent the token accruals from being reset by overriding the accrual start date reset through `_overrideTokenAccrualReset`, which is checked in `_afterTokenTransfers`. @dev {ERC721A-safeTransferFrom} validates that the caller is the owner or approved. @param tokenId the Id of the NFT/token to transfer. @param recipient The account that the NFT should be transferred to. */ function transferWithAccrual(uint256 tokenId, address recipient) external nonReentrant { _overrideTokenAccrualReset[tokenId] = true; super.safeTransferFrom(_msgSender(), recipient, tokenId); } /** @notice Allows the contract owner to set the baseURI. @param newURI The new baseURI. */ function setBaseURI(string calldata newURI) external onlyOwner { if (bytes(newURI).length == 0) { revert EmptyString("newURI"); } baseURI = newURI; } /** @notice Allows the contract owner to set the contractURI. @param newURI The new contractURI. */ function setContractURI(string calldata newURI) external onlyOwner { if (bytes(newURI).length == 0) { revert EmptyString("newURI"); } contractURI = newURI; } /** @notice Allows the contract owner to activate/deactivate the minting functionality. @param active The boolean value indication whether minting is allowed. */ function setMintState(bool active) external onlyOwner { if (allowListMerkleRoot == bytes32(0)) { revert InvalidMerkleRoot(); } mintActive = active; emit MintStateChanged(active); } /** @notice Allows the contract owner to change the minting price, if the need arises. @param newPrice The new minting price. */ function setMintPrice(uint256 newPrice) external onlyOwner { mintPrice = newPrice; emit MintPriceChanged(newPrice); } /** @notice Allows the contract owner to change the merkle root. This is used when addresses are added to or removed from the allow list. @param merkleRoot The new merkle tree root. */ function setMerkleRoot(bytes32 merkleRoot) external onlyOwner { if (merkleRoot == bytes32(0)) { revert InvalidMerkleRoot(); } allowListMerkleRoot = merkleRoot; } /** @notice Allows the contract owner to change the royalty details. @dev See {ERC2981-_setDefaultRoyalty}. @param receiver The {address} the royalty payments should be sent to. @param feeNumerator The royalty fee basis points. */ function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } /** @notice Allows the contract owner to sequentially reveal NFTs one-by-one, or in arbitrary size batches. @dev If `batchSize` would exceed the number of unrevealed NFTs, we set it to the number of unrevealed. @dev We intentionally allow unminted NFTs to be flagged as revealed so they'll reveal immediately upon minting, if the need arises. @dev The revealed/unreveal metadata is managed off-chain. @param batchSize the number of NFTs to be revealed since the last batch reveal. */ function revealBatch(uint256 batchSize) external onlyOwner { if (revealedCount + batchSize > MAX_SUPPLY) { batchSize = MAX_SUPPLY - revealedCount; } revealedCount += batchSize; emit BatchRevealed(batchSize, revealedCount); } /** @notice Returns the contract owner. @dev {UpdatableOperatorFilterer} does not implement the owner logic so we use {Ownable-owner}. @return The contract owner address */ function owner() public view override(UpdatableOperatorFilterer, Ownable) returns (address) { return Ownable.owner(); } /** @notice Override the default {ERC721A-setApprovalForAll} so we can restict approvals to operators that have not been excluded in the operator-filter-registry. @dev See https://github.com/ProjectOpenSea/operator-filter-registry. */ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } /** @notice Override the default {ERC721A-approve} so we can restict approvals to operators that have not been excluded in the operator-filter-registry. @dev See https://github.com/ProjectOpenSea/operator-filter-registry. */ function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } /** @notice Override the default {ERC721A-transferFrom} so we can restict transfers to operators that have not been excluded in the operator-filter-registry. @dev See https://github.com/ProjectOpenSea/operator-filter-registry. */ function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } /** @notice Override the default {ERC721A-safeTransferFrom} so we can restict transfers to operators that have not been excluded in the operator-filter-registry. @dev See https://github.com/ProjectOpenSea/operator-filter-registry. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } /** @notice Override the default {ERC721A-safeTransferFrom} so we can restict transfers to operators that have not been excluded in the operator-filter-registry. @dev See https://github.com/ProjectOpenSea/operator-filter-registry. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } /** @notice This is from ERC721AQueryable. This function is not internally/externally accessible by contracts inheriting from ERC721AQueryable, so we have to recreate the function here in order to make it public. By recreating this as a public function, we can utilize it for getTokenAccrualsByOwner, and reduce the number of round-trips to the contract. @dev Returns an array of token IDs owned by `owner_`. @dev We renamed owner to owner_ to prevent state variable shadowing This function scans the ownership mapping and is O(`totalSupply`) in complexity. It is meant to be called off-chain. See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into multiple smaller scans if the collection is large enough to cause an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner_) public view returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner_); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for ( uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i ) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner_) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } /** @notice Returns the amount of ORB energy accrued for the specified `tokenId`, based on how long it has been held for. ORB Enery is accrued at 12/day. @param tokenId The Id of the NFT to get the accrued ORB energy for. @return A {uint256} value with the total amount of ORB energy accrued. */ function getTokenAccrual(uint256 tokenId) external view returns (uint256) { if (!_exists(tokenId)) { revert QueryForNonexistentToken(); } // solhint-disable-next-line not-rely-on-time return calculateAccrualAtPointInTime(tokenId, block.timestamp); } /** @notice Returns the token Ids and their respective ORB energey for the specified `owner_`. @param owner_ The address of the holder account to get the accrued ORB energy for. @return tokenIds A {uint256} array of tokenIds held by the `owner_` address. @return accruals A {uint256} array of total accrued ORB enery for the token at the same index in `tokenIds`. */ function getTokenAccrualsByOwner(address owner_) external view returns (uint256[] memory tokenIds, uint256[] memory accruals) { tokenIds = tokensOfOwner(owner_); accruals = new uint256[](tokenIds.length); for (uint256 i = 0; i < tokenIds.length; i++) { // solhint-disable-next-line not-rely-on-time accruals[i] = calculateAccrualAtPointInTime(tokenIds[i], block.timestamp); } } /** @notice Returns the metadata uri for the specified tokenId. @param tokenId The Id of the NFT to get the metadata uri for. @return A string value for the metadata uri for the specified `tokenId`. */ function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) { if (!_exists(tokenId)) { revert QueryForNonexistentToken(); } return string(abi.encodePacked(baseURI, "/", tokenId.toString())); } /** @notice Query if a contract implements an interface. @param interfaceId The interface identifier, as specified in ERC-165. @dev Interface identification is specified in ERC-165. This function uses less than 30,000 gas. @return `true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { // Supports the following `interfaceId`s: // - IERC165: 0x01ffc9a7 // - IERC721: 0x80ac58cd // - IERC721Metadata: 0x5b5e139f // - IERC2981: 0x2a55205a return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } /** @notice Calculates the total amount of ORB energy accrued for the specified `tokenId` since the specified `accruedUntilTimestamp`. @notice ORB enery is accrued at a rate of 12/day. Only full days result in accrual. @dev The number of days held is calculated as the time difference in seconds between the accrual start time and end time (accruedUntilTimestamp). @dev ORB enery is calculated as full days held * 12. @param tokenId The Id of the NFT to calculate the ORB energy accrual for. @param accruedUntilTimestamp The EPOCH timestamp to use as the end date for the accrual calculation. @return A {uint256} value representing the total amount of ORB energy accrued. */ function calculateAccrualAtPointInTime( uint256 tokenId, uint256 accruedUntilTimestamp ) public view returns (uint256) { uint256 daysHeld = (accruedUntilTimestamp - tokenAccrualStart[tokenId]) / 86400; // We only consider full days, so ignore partial day accruals return daysHeld * DAILY_ACCRUAL_RATE; } /** @notice Resets the ORB accrual start time to the current time for the specified tokenIds, unless the reset is overridden through `transferWithAccrual`. This means that any transfers, sales, etc. will lose any accrued ORB energy unless `transferWithAccrual` is used. @dev This hook is called after any standard token transfers (transfer, safeTransfer, burn, mint, etc.). */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal override { super._afterTokenTransfers(from, to, startTokenId, quantity); for (uint256 i = 0; i < quantity; i++) { uint256 currentTokenId = startTokenId + i; if (!_overrideTokenAccrualReset[currentTokenId]) { // solhint-disable-next-line not-rely-on-time uint256 currentTimestamp = block.timestamp; tokenAccrualStart[currentTokenId] = currentTimestamp; emit AccrualReset(currentTokenId, currentTimestamp, to); } // Remove the previous reset override so any future transfers that don't // go through transferWithAccrual will result in the accrual start date // being reset for this token _overrideTokenAccrualReset[currentTokenId] = false; } } /** @notice Overrides the default startTokenId as defined in {ERC721A-startTokenId}. @dev By default, ERC721A starts minting from 0, which is undesirable in our case, so we'll override that to start from 1. @return A {uint256} value to use for the first minted token Id. */ function _startTokenId() internal pure override returns (uint256) { return 1; } /** @notice Convenience minting function shared by `mint` and `mintTo`. */ function _internalMint(address recipient, uint256 qty) private { if (qty == 0) { revert ZeroQuantity(); } if ((_totalMinted() + qty) > MAX_SUPPLY) { revert ExceedsMaxSupply(); } _safeMint(recipient, qty); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseUri_","type":"string"},{"internalType":"string","name":"contractUri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowedMintQuantityExceeded","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"string","name":"source","type":"string"}],"name":"EmptyString","type":"error"},{"inputs":[],"name":"ExceedsMaxSupply","type":"error"},{"inputs":[],"name":"ExceedsWithdrawLimit","type":"error"},{"inputs":[],"name":"IncorrectAmount","type":"error"},{"inputs":[],"name":"InitialRegistryAddressCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"InvalidMerkleRoot","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidShareDenominator","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintInactive","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoPayableBalance","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotOwnerOrPayee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"PaymentFailed","type":"error"},{"inputs":[],"name":"QueryForNonexistentToken","type":"error"},{"inputs":[],"name":"RegistryHasBeenRevoked","type":"error"},{"inputs":[],"name":"SharesExceeded","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroQuantity","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"holder","type":"address"}],"name":"AccrualReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchSize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalRevealed","type":"uint256"}],"name":"BatchRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"MintPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MintStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payee","type":"address"},{"indexed":false,"internalType":"uint256","name":"payableBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"}],"name":"TeamMemberPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DAILY_ACCRUAL_RATE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"balanceAfterTeamPayments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"accruedUntilTimestamp","type":"uint256"}],"name":"calculateAccrualAtPointInTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenAccrual","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"getTokenAccrualsByOwner","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"accruals","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperatorFilterRegistryRevoked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCounts","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payeeDetails","outputs":[{"internalType":"address payable","name":"payeeAddress","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"revealBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setMintState","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenAccrualStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"transferWithAccrual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"updateOperatorFilterRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526706c5b96a1a6400006012553480156200001d57600080fd5b5060405162003c6438038062003c64833981016040819052620000409162000875565b73150a156f1937f6c9ebd9547c13e108d43332cb4a60016daaeb6d7670e522a718067333cd4e733cc6cdda760b79bafa08df41ecfa224f810dceb6828282828b8b60026200008f8382620009bc565b5060036200009e8282620009bc565b5060016000555050600880546001600160a01b0319166001600160a01b03851690811790915583903b15620001df5781156200013e57604051633e9f1edf60e11b81523060048201526001600160a01b038481166024830152821690637d3e3dbe906044015b600060405180830381600087803b1580156200011f57600080fd5b505af115801562000134573d6000803e3d6000fd5b50505050620001df565b6001600160a01b03831615620001835760405163a0af290360e01b81523060048201526001600160a01b03848116602483015282169063a0af29039060440162000104565b604051632210724360e11b81523060048201526001600160a01b03821690634420e48690602401600060405180830381600087803b158015620001c557600080fd5b505af1158015620001da573d6000803e3d6000fd5b505050505b5050506001600160a01b03841690506200020c5760405163c49d17ad60e01b815260040160405180910390fd5b50505062000229620002236200041a60201b60201c565b6200041e565b6001600c556001600160a01b038216620002565760405163d92e233d60e01b815260040160405180910390fd5b8060ff166000036200027b57604051637ea5ed4560e11b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0393909316929092179091556010805460ff191660ff9092169190911790558351600003620002ef576040516318a996bb60e21b81526020600482015260056024820152646e616d655f60d81b60448201526064015b60405180910390fd5b82516000036200032d576040516318a996bb60e21b815260206004820152600760248201526673796d626f6c5f60c81b6044820152606401620002e6565b81516000036200036c576040516318a996bb60e21b8152602060048201526008602482015267626173655572695f60c01b6044820152606401620002e6565b8051600003620003af576040516318a996bb60e21b815260206004820152600c60248201526b636f6e74726163745572695f60a01b6044820152606401620002e6565b6018620003bd8382620009bc565b506019620003cc8282620009bc565b50620003ee73338e0421b72da8adc371f3247255a8c7dc4fa69d600962000470565b6200041073150a156f1937f6c9ebd9547c13e108d43332cb4a6102ee62000539565b5050505062000b15565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200047a6200063a565b6040805180820182526001600160a01b038481168083526020808401868152600092835260119091529381208054600160ff199091168117909155600e8054918201815590915282517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd600290920291820180546001600160a01b031916919093161790915591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90920191909155620005346200069f565b505050565b6127106001600160601b0382161115620005a95760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620002e6565b6001600160a01b038216620006015760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620002e6565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600955565b336200064562000785565b6001600160a01b0316146200069d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620002e6565b565b6000805b600e5460ff8216101562000781576000600e8260ff1681548110620006cc57620006cc62000a88565b60009182526020918290206040805180820190915260029092020180546001600160a01b0316808352600190910154928201929092529150620007225760405163d92e233d60e01b815260040160405180910390fd5b602081015162000733908462000ab4565b6010549093506064906200074b9060ff168562000ad0565b11156200076b5760405163dc6857ab60e01b815260040160405180910390fd5b5080620007788162000af3565b915050620006a3565b5050565b60006200079c620007a160201b620019241760201c565b905090565b600b546001600160a01b031690565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620007d857600080fd5b81516001600160401b0380821115620007f557620007f5620007b0565b604051601f8301601f19908116603f01168101908282118183101715620008205762000820620007b0565b816040528381526020925086838588010111156200083d57600080fd5b600091505b8382101562000861578582018301518183018401529082019062000842565b600093810190920192909252949350505050565b600080600080608085870312156200088c57600080fd5b84516001600160401b0380821115620008a457600080fd5b620008b288838901620007c6565b95506020870151915080821115620008c957600080fd5b620008d788838901620007c6565b94506040870151915080821115620008ee57600080fd5b620008fc88838901620007c6565b935060608701519150808211156200091357600080fd5b506200092287828801620007c6565b91505092959194509250565b600181811c908216806200094357607f821691505b6020821081036200096457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200053457600081815260208120601f850160051c81016020861015620009935750805b601f850160051c820191505b81811015620009b4578281556001016200099f565b505050505050565b81516001600160401b03811115620009d857620009d8620007b0565b620009f081620009e984546200092e565b846200096a565b602080601f83116001811462000a28576000841562000a0f5750858301515b600019600386901b1c1916600185901b178555620009b4565b600085815260208120601f198616915b8281101562000a595788860151825594840194600190910190840162000a38565b508582101562000a785787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000aca5762000aca62000a9e565b92915050565b60008262000aee57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff810362000b0c5762000b0c62000a9e565b60010192915050565b61313f8062000b256000396000f3fe60806040526004361061033f5760003560e01c806378cf124f116101b0578063b8d1e532116100ec578063e8a3d48511610095578063f2fde38b1161006f578063f2fde38b14610948578063f4a0a52814610968578063f64c3f0a14610988578063f77e58ae146109a857600080fd5b8063e8a3d485146108c9578063e985e9c5146108de578063ecba222a1461092757600080fd5b8063c87b56dd116100c6578063c87b56dd14610874578063d6dae0cd14610894578063e2ea8956146108a957600080fd5b8063b8d1e5321461081e578063bbd78e931461083e578063c0341fa61461085457600080fd5b80639bb906e011610159578063b0ccc31e11610133578063b0ccc31e146107ab578063b488311b146107cb578063b77a147b146107f8578063b88d4fde1461080b57600080fd5b80639bb906e014610760578063a22cb46514610776578063ac78dc161461079657600080fd5b80638da5cb5b1161018a5780638da5cb5b14610716578063938e3d7b1461072b57806395d89b411461074b57600080fd5b806378cf124f146106a95780637cb64759146106c95780638462151c146106e957600080fd5b80633cf96af11161027f57806358556c12116102285780636817c76c116102025780636817c76c146106495780636c0360eb1461065f57806370a0823114610674578063715018a61461069457600080fd5b806358556c12146105e65780635ef9432a146106145780636352211e1461062957600080fd5b8063449a52f811610259578063449a52f814610564578063532778791461058457806355f804b3146105c657600080fd5b80633cf96af11461051157806342842e0e1461053157806342966c681461054457600080fd5b806318160ddd116102ec57806326412aca116102c657806326412aca1461049b5780632a55205a146104bb5780632e1a7d4d146104db57806332cb6b0c146104fb57600080fd5b806318160ddd1461044757806323b872dd1461046e57806325fd90f31461048157600080fd5b8063081812fc1161031d578063081812fc146103bd578063095ea7b3146103f55780630c9b7e131461040857600080fd5b806301ffc9a71461034457806304634d8d1461037957806306fdde031461039b575b600080fd5b34801561035057600080fd5b5061036461035f36600461296f565b6109be565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b506103996103943660046129a8565b6109de565b005b3480156103a757600080fd5b506103b06109f4565b6040516103709190612a40565b3480156103c957600080fd5b506103dd6103d8366004612a53565b610a86565b6040516001600160a01b039091168152602001610370565b610399610403366004612a6c565b610ae3565b34801561041457600080fd5b50610428610423366004612a53565b610afc565b604080516001600160a01b039093168352602083019190915201610370565b34801561045357600080fd5b5060015460005403600019015b604051908152602001610370565b61039961047c366004612a96565b610b34565b34801561048d57600080fd5b506014546103649060ff1681565b3480156104a757600080fd5b506103996104b6366004612ae0565b610b5f565b3480156104c757600080fd5b506104286104d6366004612afd565b610bcf565b3480156104e757600080fd5b506103996104f6366004612a53565b610c8a565b34801561050757600080fd5b5061046061012c81565b34801561051d57600080fd5b50600d546103dd906001600160a01b031681565b61039961053f366004612a96565b610d7a565b34801561055057600080fd5b5061039961055f366004612a53565b610d9f565b34801561057057600080fd5b5061039961057f366004612a6c565b610dbb565b34801561059057600080fd5b506105b461059f366004612b1f565b60166020526000908152604090205460ff1681565b60405160ff9091168152602001610370565b3480156105d257600080fd5b506103996105e1366004612b3a565b610ddf565b3480156105f257600080fd5b50610606610601366004612b1f565b610e34565b604051610370929190612be7565b34801561062057600080fd5b50610399610eec565b34801561063557600080fd5b506103dd610644366004612a53565b610f80565b34801561065557600080fd5b5061046060125481565b34801561066b57600080fd5b506103b0610f8b565b34801561068057600080fd5b5061046061068f366004612b1f565b611019565b3480156106a057600080fd5b50610399611081565b3480156106b557600080fd5b506103996106c4366004612c15565b611095565b3480156106d557600080fd5b506103996106e4366004612a53565b6110c7565b3480156106f557600080fd5b50610709610704366004612b1f565b6110f2565b6040516103709190612c41565b34801561072257600080fd5b506103dd6111f6565b34801561073757600080fd5b50610399610746366004612b3a565b61120f565b34801561075757600080fd5b506103b061125f565b34801561076c57600080fd5b5061046060135481565b34801561078257600080fd5b50610399610791366004612c54565b61126e565b3480156107a257600080fd5b50610399611282565b3480156107b757600080fd5b506008546103dd906001600160a01b031681565b3480156107d757600080fd5b506104606107e6366004612a53565b60176020526000908152604090205481565b610399610806366004612c80565b611497565b610399610819366004612cf9565b611640565b34801561082a57600080fd5b50610399610839366004612b1f565b61166d565b34801561084a57600080fd5b5061046060155481565b34801561086057600080fd5b5061046061086f366004612afd565b611700565b34801561088057600080fd5b506103b061088f366004612a53565b61173f565b3480156108a057600080fd5b506105b4600c81565b3480156108b557600080fd5b506104606108c4366004612a53565b611799565b3480156108d557600080fd5b506103b06117cb565b3480156108ea57600080fd5b506103646108f9366004612dd5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561093357600080fd5b5060085461036490600160a01b900460ff1681565b34801561095457600080fd5b50610399610963366004612b1f565b6117d8565b34801561097457600080fd5b50610399610983366004612a53565b611865565b34801561099457600080fd5b506103996109a3366004612a53565b6118a2565b3480156109b457600080fd5b50610460600f5481565b60006109c982611933565b806109d857506109d8826119b3565b92915050565b6109e6611a01565b6109f08282611a60565b5050565b606060028054610a0390612dff565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2f90612dff565b8015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b820191906000526020600020905b815481529060010190602001808311610a5f57829003601f168201915b5050505050905090565b6000610a9182611b7a565b610ac7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610aed81611baf565b610af78383611bc9565b505050565b600e8181548110610b0c57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b826001600160a01b0381163314610b4e57610b4e33611baf565b610b59848484611c8f565b50505050565b610b67611a01565b601354610b8757604051639dd854d360e01b815260040160405180910390fd5b6014805460ff19168215159081179091556040519081527f992fe84c8bbd52855b22035907ca1f9e1d6bcbb390bc81150808e8443d01668c906020015b60405180910390a150565b6000828152600a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610c4e5750604080518082019091526009546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610c72906bffffffffffffffffffffffff1687612e4f565b610c7c9190612e66565b915196919550909350505050565b610c92611a01565b610c9a611e71565b80600003610cd4576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f54811115610d10576040517fc02fc37d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f6000828254610d229190612e88565b9091555050600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050610d6d576040516307a4ced160e51b815260040160405180910390fd5b610d776001600c55565b50565b826001600160a01b0381163314610d9457610d9433611baf565b610b59848484611eca565b610daa816001611ee5565b600090815260176020526040812055565b610dc3611e71565b610dcb611a01565b610dd58282612056565b6109f06001600c55565b610de7611a01565b6000819003610e27576040516318a996bb60e21b81526020600482015260066024820152656e657755524960d01b60448201526064015b60405180910390fd5b6018610af7828483612ee1565b606080610e40836110f2565b9150815167ffffffffffffffff811115610e5c57610e5c612ce3565b604051908082528060200260200182016040528015610e85578160200160208202803683370190505b50905060005b8251811015610ee657610eb7838281518110610ea957610ea9612fa1565b602002602001015142611700565b828281518110610ec957610ec9612fa1565b602090810291909101015280610ede81612fb7565b915050610e8b565b50915091565b610ef46111f6565b6001600160a01b0316336001600160a01b031614610f2557604051635fc483c560e01b815260040160405180910390fd5b600854600160a01b900460ff1615610f5057604051631551a48f60e11b815260040160405180910390fd5b600880547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b179055565b60006109d8826120ed565b60188054610f9890612dff565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc490612dff565b80156110115780601f10610fe657610100808354040283529160200191611011565b820191906000526020600020905b815481529060010190602001808311610ff457829003601f168201915b505050505081565b60006001600160a01b03821661105b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611089611a01565b611093600061217c565b565b61109d611e71565b6000828152601a60205260409020805460ff19166001179055610dd56110c03390565b8284611eca565b6110cf611a01565b806110ed57604051639dd854d360e01b815260040160405180910390fd5b601355565b6060600080600061110285611019565b905060008167ffffffffffffffff81111561111f5761111f612ce3565b604051908082528060200260200182016040528015611148578160200160208202803683370190505b5060408051608081018252600080825260208201819052918101829052606081019190915290915060015b8386146111ea57611183816121db565b915081604001516111e25781516001600160a01b0316156111a357815194505b876001600160a01b0316856001600160a01b0316036111e257808387806001019850815181106111d5576111d5612fa1565b6020026020010181815250505b600101611173565b50909695505050505050565b600061120a600b546001600160a01b031690565b905090565b611217611a01565b6000819003611252576040516318a996bb60e21b81526020600482015260066024820152656e657755524960d01b6044820152606401610e1e565b6019610af7828483612ee1565b606060038054610a0390612dff565b8161127881611baf565b610af7838361225a565b61128a6111f6565b6001600160a01b0316336001600160a01b031614806112b857503360009081526011602052604090205460ff165b15611465576112c5611e71565b600f544711611300576040517f7ac5237f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f54476113109190612e88565b905060005b600e54811015611459576000600e828154811061133457611334612fa1565b600091825260208083206040805180820190915260029093020180546001600160a01b031683526001015490820181905260105491935060649161137d9160ff90911690612e66565b6113879086612e4f565b6113919190612e66565b905061139d8185612e88565b600f60008282546113ae9190612fd0565b909155505081516040516001600160a01b039091169082156108fc029083906000818181858888f193505050506113f8576040516307a4ced160e51b815260040160405180910390fd5b8151604080516001600160a01b0390921682526020820186905281018290527f38eb0ca2a3c8d54ed43becde8d31f720d1902caa6fdb19049112d64692b467af9060600160405180910390a15050808061145190612fb7565b915050611315565b50506110936001600c55565b6040517f232b7a3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61149f611e71565b8181611516828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206122c6565b61154c576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60145460ff16611588576040517f343295c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60125434146115c3576040517f69640e7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526016602052604090205460ff161561160d576040517ff37edc8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601660205260409020805460ff191660019081179091556116349190612056565b50506109f06001600c55565b836001600160a01b038116331461165a5761165a33611baf565b611666858585856122dc565b5050505050565b6116756111f6565b6001600160a01b0316336001600160a01b0316146116a657604051635fc483c560e01b815260040160405180910390fd5b600854600160a01b900460ff16156116d157604051631551a48f60e11b815260040160405180910390fd5b6008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600082815260176020526040812054819062015180906117209085612e88565b61172a9190612e66565b9050611737600c82612e4f565b949350505050565b606061174a82611b7a565b61176757604051636c01c8cf60e11b815260040160405180910390fd5b601861177283612320565b604051602001611783929190612fe3565b6040516020818303038152906040529050919050565b60006117a482611b7a565b6117c157604051636c01c8cf60e11b815260040160405180910390fd5b6109d88242611700565b60198054610f9890612dff565b6117e0611a01565b6001600160a01b03811661185c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e1e565b610d778161217c565b61186d611a01565b60128190556040518181527f25b1f9f6b6e61dfca5575239769e4450ed2e49176670837f5d1a82a9a2fc693f90602001610bc4565b6118aa611a01565b61012c816015546118bb9190612fd0565b11156118d3576015546118d09061012c612e88565b90505b80601560008282546118e59190612fd0565b90915550506015546040805183815260208101929092527f75ac8f259038a0ab4134de3b31c8dc5c89e9e8f21886707f2697bda351ea3bbc9101610bc4565b600b546001600160a01b031690565b60006301ffc9a760e01b6001600160e01b03198316148061197d57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806109d85750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f2a55205a0000000000000000000000000000000000000000000000000000000014806109d857506301ffc9a760e01b6001600160e01b03198316146109d8565b33611a0a6111f6565b6001600160a01b0316146110935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e1e565b6127106bffffffffffffffffffffffff82161115611ae65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610e1e565b6001600160a01b038216611b3c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610e1e565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600955565b600081600111158015611b8e575060005482105b80156109d8575050600090815260046020526040902054600160e01b161590565b6008546001600160a01b031615610d7757610d77816123c0565b6000611bd482610f80565b9050336001600160a01b03821614611c2657611bf081336108f9565b611c26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611c9a826120ed565b9050836001600160a01b0316816001600160a01b031614611ce7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090208054611d138187335b6001600160a01b039081169116811491141790565b611d3e57611d2186336108f9565b611d3e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611d7e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015611d8957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611e1b57600184016000818152600460205260408120549003611e19576000548114611e195760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e6986868660016124b4565b505050505050565b6002600c5403611ec35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e1e565b6002600c55565b610af783838360405180602001604052806000815250611640565b6000611ef0836120ed565b905080600080611f0e86600090815260066020526040902080549091565b915091508415611f4e57611f23818433611cfe565b611f4e57611f3183336108f9565b611f4e57604051632ce44b5f60e11b815260040160405180910390fd5b8015611f5957600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b177c030000000000000000000000000000000000000000000000000000000017600087815260046020526040812091909155600160e11b8516900361200057600186016000818152600460205260408120549003611ffe576000548114611ffe5760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46120468360008860016124b4565b5050600180548101905550505050565b80600003612090576040517ff4f5b73300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61012c816120a16000546000190190565b6120ab9190612fd0565b11156120e3576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f08282612559565b6000818060011161214a5760005481101561214a5760008181526004602052604081205490600160e01b82169003612148575b80600003612141575060001901600081815260046020526040902054612120565b9392505050565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546109d890604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000826122d38584612573565b14949350505050565b6122e7848484610b34565b6001600160a01b0383163b15610b5957612303848484846125c0565b610b59576040516368d2bf6b60e11b815260040160405180910390fd5b6060600061232d836126ab565b600101905060008167ffffffffffffffff81111561234d5761234d612ce3565b6040519080825280601f01601f191660200182016040528015612377576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461238157509392505050565b6008546001600160a01b031680158015906123e557506000816001600160a01b03163b115b156109f0576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015282169063c617113490604401602060405180830381865afa15801561244f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124739190613093565b6109f0576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610e1e565b60005b818110156116665760006124cb8285612fd0565b6000818152601a602052604090205490915060ff16612531576000818152601760205260408082204290819055905190916001600160a01b03881691839185917fc0661bcb60a896b1a9fcad2d5bec6c241efd9a2bbc98ada22a56ea9e991e2d949190a4505b6000908152601a60205260409020805460ff191690558061255181612fb7565b9150506124b7565b6109f082826040518060200160405280600081525061278d565b600081815b84518110156125b8576125a48286838151811061259757612597612fa1565b60200260200101516127f3565b9150806125b081612fb7565b915050612578565b509392505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125f59033908990889088906004016130b0565b6020604051808303816000875af1925050508015612630575060408051601f3d908101601f1916820190925261262d918101906130ec565b60015b61268e573d80801561265e576040519150601f19603f3d011682016040523d82523d6000602084013e612663565b606091505b508051600003612686576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106126f4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612720576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061273e57662386f26fc10000830492506010015b6305f5e1008310612756576305f5e100830492506008015b612710831061276a57612710830492506004015b6064831061277c576064830492506002015b600a83106109d85760010192915050565b612797838361281f565b6001600160a01b0383163b15610af7576000548281035b6127c160008683806001019450866125c0565b6127de576040516368d2bf6b60e11b815260040160405180910390fd5b8181106127ae57816000541461166657600080fd5b600081831061280f576000828152602084905260409020612141565b5060009182526020526040902090565b600080549082900361285d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461290c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016128d4565b5081600003612947576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908155610af791508483856124b4565b6001600160e01b031981168114610d7757600080fd5b60006020828403121561298157600080fd5b813561214181612959565b80356001600160a01b03811681146129a357600080fd5b919050565b600080604083850312156129bb57600080fd5b6129c48361298c565b915060208301356bffffffffffffffffffffffff811681146129e557600080fd5b809150509250929050565b60005b83811015612a0b5781810151838201526020016129f3565b50506000910152565b60008151808452612a2c8160208601602086016129f0565b601f01601f19169290920160200192915050565b6020815260006121416020830184612a14565b600060208284031215612a6557600080fd5b5035919050565b60008060408385031215612a7f57600080fd5b612a888361298c565b946020939093013593505050565b600080600060608486031215612aab57600080fd5b612ab48461298c565b9250612ac26020850161298c565b9150604084013590509250925092565b8015158114610d7757600080fd5b600060208284031215612af257600080fd5b813561214181612ad2565b60008060408385031215612b1057600080fd5b50508035926020909101359150565b600060208284031215612b3157600080fd5b6121418261298c565b60008060208385031215612b4d57600080fd5b823567ffffffffffffffff80821115612b6557600080fd5b818501915085601f830112612b7957600080fd5b813581811115612b8857600080fd5b866020828501011115612b9a57600080fd5b60209290920196919550909350505050565b600081518084526020808501945080840160005b83811015612bdc57815187529582019590820190600101612bc0565b509495945050505050565b604081526000612bfa6040830185612bac565b8281036020840152612c0c8185612bac565b95945050505050565b60008060408385031215612c2857600080fd5b82359150612c386020840161298c565b90509250929050565b6020815260006121416020830184612bac565b60008060408385031215612c6757600080fd5b612c708361298c565b915060208301356129e581612ad2565b60008060208385031215612c9357600080fd5b823567ffffffffffffffff80821115612cab57600080fd5b818501915085601f830112612cbf57600080fd5b813581811115612cce57600080fd5b8660208260051b8501011115612b9a57600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d0f57600080fd5b612d188561298c565b9350612d266020860161298c565b925060408501359150606085013567ffffffffffffffff80821115612d4a57600080fd5b818701915087601f830112612d5e57600080fd5b813581811115612d7057612d70612ce3565b604051601f8201601f19908116603f01168101908382118183101715612d9857612d98612ce3565b816040528281528a6020848701011115612db157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612de857600080fd5b612df18361298c565b9150612c386020840161298c565b600181811c90821680612e1357607f821691505b602082108103612e3357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109d8576109d8612e39565b600082612e8357634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109d8576109d8612e39565b601f821115610af757600081815260208120601f850160051c81016020861015612ec25750805b601f850160051c820191505b81811015611e6957828155600101612ece565b67ffffffffffffffff831115612ef957612ef9612ce3565b612f0d83612f078354612dff565b83612e9b565b6000601f841160018114612f415760008515612f295750838201355b600019600387901b1c1916600186901b178355611666565b600083815260209020601f19861690835b82811015612f725786850135825560209485019460019092019101612f52565b5086821015612f8f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201612fc957612fc9612e39565b5060010190565b808201808211156109d8576109d8612e39565b6000808454612ff181612dff565b60018281168015613009576001811461301e5761304d565b60ff198416875282151583028701945061304d565b8860005260208060002060005b858110156130445781548a82015290840190820161302b565b50505082870194505b507f2f000000000000000000000000000000000000000000000000000000000000008452865192506130858382860160208a016129f0565b919092010195945050505050565b6000602082840312156130a557600080fd5b815161214181612ad2565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130e26080830184612a14565b9695505050505050565b6000602082840312156130fe57600080fd5b81516121418161295956fea26469706673582212202bbee7458df10238032955554fe0feba7007068f4f6c6377d3f932bca821e9d864736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000154d656b612042656173743a204d656761204f726273000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d424d4f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f6d656b6162656173742d6f7262732e6170702e706170657268616e646c6162732e696f2f6170692f6d657461646174610000000000000000000000000000000000000000000000000000000000000000000000000000004168747470733a2f2f6d656b6162656173742d6f7262732e6170702e706170657268616e646c6162732e696f2f6170692f6d657461646174612f636f6e747261637400000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061033f5760003560e01c806378cf124f116101b0578063b8d1e532116100ec578063e8a3d48511610095578063f2fde38b1161006f578063f2fde38b14610948578063f4a0a52814610968578063f64c3f0a14610988578063f77e58ae146109a857600080fd5b8063e8a3d485146108c9578063e985e9c5146108de578063ecba222a1461092757600080fd5b8063c87b56dd116100c6578063c87b56dd14610874578063d6dae0cd14610894578063e2ea8956146108a957600080fd5b8063b8d1e5321461081e578063bbd78e931461083e578063c0341fa61461085457600080fd5b80639bb906e011610159578063b0ccc31e11610133578063b0ccc31e146107ab578063b488311b146107cb578063b77a147b146107f8578063b88d4fde1461080b57600080fd5b80639bb906e014610760578063a22cb46514610776578063ac78dc161461079657600080fd5b80638da5cb5b1161018a5780638da5cb5b14610716578063938e3d7b1461072b57806395d89b411461074b57600080fd5b806378cf124f146106a95780637cb64759146106c95780638462151c146106e957600080fd5b80633cf96af11161027f57806358556c12116102285780636817c76c116102025780636817c76c146106495780636c0360eb1461065f57806370a0823114610674578063715018a61461069457600080fd5b806358556c12146105e65780635ef9432a146106145780636352211e1461062957600080fd5b8063449a52f811610259578063449a52f814610564578063532778791461058457806355f804b3146105c657600080fd5b80633cf96af11461051157806342842e0e1461053157806342966c681461054457600080fd5b806318160ddd116102ec57806326412aca116102c657806326412aca1461049b5780632a55205a146104bb5780632e1a7d4d146104db57806332cb6b0c146104fb57600080fd5b806318160ddd1461044757806323b872dd1461046e57806325fd90f31461048157600080fd5b8063081812fc1161031d578063081812fc146103bd578063095ea7b3146103f55780630c9b7e131461040857600080fd5b806301ffc9a71461034457806304634d8d1461037957806306fdde031461039b575b600080fd5b34801561035057600080fd5b5061036461035f36600461296f565b6109be565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b506103996103943660046129a8565b6109de565b005b3480156103a757600080fd5b506103b06109f4565b6040516103709190612a40565b3480156103c957600080fd5b506103dd6103d8366004612a53565b610a86565b6040516001600160a01b039091168152602001610370565b610399610403366004612a6c565b610ae3565b34801561041457600080fd5b50610428610423366004612a53565b610afc565b604080516001600160a01b039093168352602083019190915201610370565b34801561045357600080fd5b5060015460005403600019015b604051908152602001610370565b61039961047c366004612a96565b610b34565b34801561048d57600080fd5b506014546103649060ff1681565b3480156104a757600080fd5b506103996104b6366004612ae0565b610b5f565b3480156104c757600080fd5b506104286104d6366004612afd565b610bcf565b3480156104e757600080fd5b506103996104f6366004612a53565b610c8a565b34801561050757600080fd5b5061046061012c81565b34801561051d57600080fd5b50600d546103dd906001600160a01b031681565b61039961053f366004612a96565b610d7a565b34801561055057600080fd5b5061039961055f366004612a53565b610d9f565b34801561057057600080fd5b5061039961057f366004612a6c565b610dbb565b34801561059057600080fd5b506105b461059f366004612b1f565b60166020526000908152604090205460ff1681565b60405160ff9091168152602001610370565b3480156105d257600080fd5b506103996105e1366004612b3a565b610ddf565b3480156105f257600080fd5b50610606610601366004612b1f565b610e34565b604051610370929190612be7565b34801561062057600080fd5b50610399610eec565b34801561063557600080fd5b506103dd610644366004612a53565b610f80565b34801561065557600080fd5b5061046060125481565b34801561066b57600080fd5b506103b0610f8b565b34801561068057600080fd5b5061046061068f366004612b1f565b611019565b3480156106a057600080fd5b50610399611081565b3480156106b557600080fd5b506103996106c4366004612c15565b611095565b3480156106d557600080fd5b506103996106e4366004612a53565b6110c7565b3480156106f557600080fd5b50610709610704366004612b1f565b6110f2565b6040516103709190612c41565b34801561072257600080fd5b506103dd6111f6565b34801561073757600080fd5b50610399610746366004612b3a565b61120f565b34801561075757600080fd5b506103b061125f565b34801561076c57600080fd5b5061046060135481565b34801561078257600080fd5b50610399610791366004612c54565b61126e565b3480156107a257600080fd5b50610399611282565b3480156107b757600080fd5b506008546103dd906001600160a01b031681565b3480156107d757600080fd5b506104606107e6366004612a53565b60176020526000908152604090205481565b610399610806366004612c80565b611497565b610399610819366004612cf9565b611640565b34801561082a57600080fd5b50610399610839366004612b1f565b61166d565b34801561084a57600080fd5b5061046060155481565b34801561086057600080fd5b5061046061086f366004612afd565b611700565b34801561088057600080fd5b506103b061088f366004612a53565b61173f565b3480156108a057600080fd5b506105b4600c81565b3480156108b557600080fd5b506104606108c4366004612a53565b611799565b3480156108d557600080fd5b506103b06117cb565b3480156108ea57600080fd5b506103646108f9366004612dd5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561093357600080fd5b5060085461036490600160a01b900460ff1681565b34801561095457600080fd5b50610399610963366004612b1f565b6117d8565b34801561097457600080fd5b50610399610983366004612a53565b611865565b34801561099457600080fd5b506103996109a3366004612a53565b6118a2565b3480156109b457600080fd5b50610460600f5481565b60006109c982611933565b806109d857506109d8826119b3565b92915050565b6109e6611a01565b6109f08282611a60565b5050565b606060028054610a0390612dff565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2f90612dff565b8015610a7c5780601f10610a5157610100808354040283529160200191610a7c565b820191906000526020600020905b815481529060010190602001808311610a5f57829003601f168201915b5050505050905090565b6000610a9182611b7a565b610ac7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610aed81611baf565b610af78383611bc9565b505050565b600e8181548110610b0c57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b826001600160a01b0381163314610b4e57610b4e33611baf565b610b59848484611c8f565b50505050565b610b67611a01565b601354610b8757604051639dd854d360e01b815260040160405180910390fd5b6014805460ff19168215159081179091556040519081527f992fe84c8bbd52855b22035907ca1f9e1d6bcbb390bc81150808e8443d01668c906020015b60405180910390a150565b6000828152600a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610c4e5750604080518082019091526009546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610c72906bffffffffffffffffffffffff1687612e4f565b610c7c9190612e66565b915196919550909350505050565b610c92611a01565b610c9a611e71565b80600003610cd4576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f54811115610d10576040517fc02fc37d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f6000828254610d229190612e88565b9091555050600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050610d6d576040516307a4ced160e51b815260040160405180910390fd5b610d776001600c55565b50565b826001600160a01b0381163314610d9457610d9433611baf565b610b59848484611eca565b610daa816001611ee5565b600090815260176020526040812055565b610dc3611e71565b610dcb611a01565b610dd58282612056565b6109f06001600c55565b610de7611a01565b6000819003610e27576040516318a996bb60e21b81526020600482015260066024820152656e657755524960d01b60448201526064015b60405180910390fd5b6018610af7828483612ee1565b606080610e40836110f2565b9150815167ffffffffffffffff811115610e5c57610e5c612ce3565b604051908082528060200260200182016040528015610e85578160200160208202803683370190505b50905060005b8251811015610ee657610eb7838281518110610ea957610ea9612fa1565b602002602001015142611700565b828281518110610ec957610ec9612fa1565b602090810291909101015280610ede81612fb7565b915050610e8b565b50915091565b610ef46111f6565b6001600160a01b0316336001600160a01b031614610f2557604051635fc483c560e01b815260040160405180910390fd5b600854600160a01b900460ff1615610f5057604051631551a48f60e11b815260040160405180910390fd5b600880547fffffffffffffffffffffff00000000000000000000000000000000000000000016600160a01b179055565b60006109d8826120ed565b60188054610f9890612dff565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc490612dff565b80156110115780601f10610fe657610100808354040283529160200191611011565b820191906000526020600020905b815481529060010190602001808311610ff457829003601f168201915b505050505081565b60006001600160a01b03821661105b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611089611a01565b611093600061217c565b565b61109d611e71565b6000828152601a60205260409020805460ff19166001179055610dd56110c03390565b8284611eca565b6110cf611a01565b806110ed57604051639dd854d360e01b815260040160405180910390fd5b601355565b6060600080600061110285611019565b905060008167ffffffffffffffff81111561111f5761111f612ce3565b604051908082528060200260200182016040528015611148578160200160208202803683370190505b5060408051608081018252600080825260208201819052918101829052606081019190915290915060015b8386146111ea57611183816121db565b915081604001516111e25781516001600160a01b0316156111a357815194505b876001600160a01b0316856001600160a01b0316036111e257808387806001019850815181106111d5576111d5612fa1565b6020026020010181815250505b600101611173565b50909695505050505050565b600061120a600b546001600160a01b031690565b905090565b611217611a01565b6000819003611252576040516318a996bb60e21b81526020600482015260066024820152656e657755524960d01b6044820152606401610e1e565b6019610af7828483612ee1565b606060038054610a0390612dff565b8161127881611baf565b610af7838361225a565b61128a6111f6565b6001600160a01b0316336001600160a01b031614806112b857503360009081526011602052604090205460ff165b15611465576112c5611e71565b600f544711611300576040517f7ac5237f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f54476113109190612e88565b905060005b600e54811015611459576000600e828154811061133457611334612fa1565b600091825260208083206040805180820190915260029093020180546001600160a01b031683526001015490820181905260105491935060649161137d9160ff90911690612e66565b6113879086612e4f565b6113919190612e66565b905061139d8185612e88565b600f60008282546113ae9190612fd0565b909155505081516040516001600160a01b039091169082156108fc029083906000818181858888f193505050506113f8576040516307a4ced160e51b815260040160405180910390fd5b8151604080516001600160a01b0390921682526020820186905281018290527f38eb0ca2a3c8d54ed43becde8d31f720d1902caa6fdb19049112d64692b467af9060600160405180910390a15050808061145190612fb7565b915050611315565b50506110936001600c55565b6040517f232b7a3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61149f611e71565b8181611516828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206122c6565b61154c576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60145460ff16611588576040517f343295c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60125434146115c3576040517f69640e7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526016602052604090205460ff161561160d576040517ff37edc8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601660205260409020805460ff191660019081179091556116349190612056565b50506109f06001600c55565b836001600160a01b038116331461165a5761165a33611baf565b611666858585856122dc565b5050505050565b6116756111f6565b6001600160a01b0316336001600160a01b0316146116a657604051635fc483c560e01b815260040160405180910390fd5b600854600160a01b900460ff16156116d157604051631551a48f60e11b815260040160405180910390fd5b6008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600082815260176020526040812054819062015180906117209085612e88565b61172a9190612e66565b9050611737600c82612e4f565b949350505050565b606061174a82611b7a565b61176757604051636c01c8cf60e11b815260040160405180910390fd5b601861177283612320565b604051602001611783929190612fe3565b6040516020818303038152906040529050919050565b60006117a482611b7a565b6117c157604051636c01c8cf60e11b815260040160405180910390fd5b6109d88242611700565b60198054610f9890612dff565b6117e0611a01565b6001600160a01b03811661185c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e1e565b610d778161217c565b61186d611a01565b60128190556040518181527f25b1f9f6b6e61dfca5575239769e4450ed2e49176670837f5d1a82a9a2fc693f90602001610bc4565b6118aa611a01565b61012c816015546118bb9190612fd0565b11156118d3576015546118d09061012c612e88565b90505b80601560008282546118e59190612fd0565b90915550506015546040805183815260208101929092527f75ac8f259038a0ab4134de3b31c8dc5c89e9e8f21886707f2697bda351ea3bbc9101610bc4565b600b546001600160a01b031690565b60006301ffc9a760e01b6001600160e01b03198316148061197d57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806109d85750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f2a55205a0000000000000000000000000000000000000000000000000000000014806109d857506301ffc9a760e01b6001600160e01b03198316146109d8565b33611a0a6111f6565b6001600160a01b0316146110935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e1e565b6127106bffffffffffffffffffffffff82161115611ae65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610e1e565b6001600160a01b038216611b3c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610e1e565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600955565b600081600111158015611b8e575060005482105b80156109d8575050600090815260046020526040902054600160e01b161590565b6008546001600160a01b031615610d7757610d77816123c0565b6000611bd482610f80565b9050336001600160a01b03821614611c2657611bf081336108f9565b611c26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611c9a826120ed565b9050836001600160a01b0316816001600160a01b031614611ce7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090208054611d138187335b6001600160a01b039081169116811491141790565b611d3e57611d2186336108f9565b611d3e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611d7e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015611d8957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611e1b57600184016000818152600460205260408120549003611e19576000548114611e195760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e6986868660016124b4565b505050505050565b6002600c5403611ec35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e1e565b6002600c55565b610af783838360405180602001604052806000815250611640565b6000611ef0836120ed565b905080600080611f0e86600090815260066020526040902080549091565b915091508415611f4e57611f23818433611cfe565b611f4e57611f3183336108f9565b611f4e57604051632ce44b5f60e11b815260040160405180910390fd5b8015611f5957600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b177c030000000000000000000000000000000000000000000000000000000017600087815260046020526040812091909155600160e11b8516900361200057600186016000818152600460205260408120549003611ffe576000548114611ffe5760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46120468360008860016124b4565b5050600180548101905550505050565b80600003612090576040517ff4f5b73300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61012c816120a16000546000190190565b6120ab9190612fd0565b11156120e3576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f08282612559565b6000818060011161214a5760005481101561214a5760008181526004602052604081205490600160e01b82169003612148575b80600003612141575060001901600081815260046020526040902054612120565b9392505050565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546109d890604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000826122d38584612573565b14949350505050565b6122e7848484610b34565b6001600160a01b0383163b15610b5957612303848484846125c0565b610b59576040516368d2bf6b60e11b815260040160405180910390fd5b6060600061232d836126ab565b600101905060008167ffffffffffffffff81111561234d5761234d612ce3565b6040519080825280601f01601f191660200182016040528015612377576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461238157509392505050565b6008546001600160a01b031680158015906123e557506000816001600160a01b03163b115b156109f0576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015282169063c617113490604401602060405180830381865afa15801561244f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124739190613093565b6109f0576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610e1e565b60005b818110156116665760006124cb8285612fd0565b6000818152601a602052604090205490915060ff16612531576000818152601760205260408082204290819055905190916001600160a01b03881691839185917fc0661bcb60a896b1a9fcad2d5bec6c241efd9a2bbc98ada22a56ea9e991e2d949190a4505b6000908152601a60205260409020805460ff191690558061255181612fb7565b9150506124b7565b6109f082826040518060200160405280600081525061278d565b600081815b84518110156125b8576125a48286838151811061259757612597612fa1565b60200260200101516127f3565b9150806125b081612fb7565b915050612578565b509392505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125f59033908990889088906004016130b0565b6020604051808303816000875af1925050508015612630575060408051601f3d908101601f1916820190925261262d918101906130ec565b60015b61268e573d80801561265e576040519150601f19603f3d011682016040523d82523d6000602084013e612663565b606091505b508051600003612686576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106126f4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612720576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061273e57662386f26fc10000830492506010015b6305f5e1008310612756576305f5e100830492506008015b612710831061276a57612710830492506004015b6064831061277c576064830492506002015b600a83106109d85760010192915050565b612797838361281f565b6001600160a01b0383163b15610af7576000548281035b6127c160008683806001019450866125c0565b6127de576040516368d2bf6b60e11b815260040160405180910390fd5b8181106127ae57816000541461166657600080fd5b600081831061280f576000828152602084905260409020612141565b5060009182526020526040902090565b600080549082900361285d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461290c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016128d4565b5081600003612947576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908155610af791508483856124b4565b6001600160e01b031981168114610d7757600080fd5b60006020828403121561298157600080fd5b813561214181612959565b80356001600160a01b03811681146129a357600080fd5b919050565b600080604083850312156129bb57600080fd5b6129c48361298c565b915060208301356bffffffffffffffffffffffff811681146129e557600080fd5b809150509250929050565b60005b83811015612a0b5781810151838201526020016129f3565b50506000910152565b60008151808452612a2c8160208601602086016129f0565b601f01601f19169290920160200192915050565b6020815260006121416020830184612a14565b600060208284031215612a6557600080fd5b5035919050565b60008060408385031215612a7f57600080fd5b612a888361298c565b946020939093013593505050565b600080600060608486031215612aab57600080fd5b612ab48461298c565b9250612ac26020850161298c565b9150604084013590509250925092565b8015158114610d7757600080fd5b600060208284031215612af257600080fd5b813561214181612ad2565b60008060408385031215612b1057600080fd5b50508035926020909101359150565b600060208284031215612b3157600080fd5b6121418261298c565b60008060208385031215612b4d57600080fd5b823567ffffffffffffffff80821115612b6557600080fd5b818501915085601f830112612b7957600080fd5b813581811115612b8857600080fd5b866020828501011115612b9a57600080fd5b60209290920196919550909350505050565b600081518084526020808501945080840160005b83811015612bdc57815187529582019590820190600101612bc0565b509495945050505050565b604081526000612bfa6040830185612bac565b8281036020840152612c0c8185612bac565b95945050505050565b60008060408385031215612c2857600080fd5b82359150612c386020840161298c565b90509250929050565b6020815260006121416020830184612bac565b60008060408385031215612c6757600080fd5b612c708361298c565b915060208301356129e581612ad2565b60008060208385031215612c9357600080fd5b823567ffffffffffffffff80821115612cab57600080fd5b818501915085601f830112612cbf57600080fd5b813581811115612cce57600080fd5b8660208260051b8501011115612b9a57600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d0f57600080fd5b612d188561298c565b9350612d266020860161298c565b925060408501359150606085013567ffffffffffffffff80821115612d4a57600080fd5b818701915087601f830112612d5e57600080fd5b813581811115612d7057612d70612ce3565b604051601f8201601f19908116603f01168101908382118183101715612d9857612d98612ce3565b816040528281528a6020848701011115612db157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612de857600080fd5b612df18361298c565b9150612c386020840161298c565b600181811c90821680612e1357607f821691505b602082108103612e3357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109d8576109d8612e39565b600082612e8357634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109d8576109d8612e39565b601f821115610af757600081815260208120601f850160051c81016020861015612ec25750805b601f850160051c820191505b81811015611e6957828155600101612ece565b67ffffffffffffffff831115612ef957612ef9612ce3565b612f0d83612f078354612dff565b83612e9b565b6000601f841160018114612f415760008515612f295750838201355b600019600387901b1c1916600186901b178355611666565b600083815260209020601f19861690835b82811015612f725786850135825560209485019460019092019101612f52565b5086821015612f8f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201612fc957612fc9612e39565b5060010190565b808201808211156109d8576109d8612e39565b6000808454612ff181612dff565b60018281168015613009576001811461301e5761304d565b60ff198416875282151583028701945061304d565b8860005260208060002060005b858110156130445781548a82015290840190820161302b565b50505082870194505b507f2f000000000000000000000000000000000000000000000000000000000000008452865192506130858382860160208a016129f0565b919092010195945050505050565b6000602082840312156130a557600080fd5b815161214181612ad2565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130e26080830184612a14565b9695505050505050565b6000602082840312156130fe57600080fd5b81516121418161295956fea26469706673582212202bbee7458df10238032955554fe0feba7007068f4f6c6377d3f932bca821e9d864736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000154d656b612042656173743a204d656761204f726273000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d424d4f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f6d656b6162656173742d6f7262732e6170702e706170657268616e646c6162732e696f2f6170692f6d657461646174610000000000000000000000000000000000000000000000000000000000000000000000000000004168747470733a2f2f6d656b6162656173742d6f7262732e6170702e706170657268616e646c6162732e696f2f6170692f6d657461646174612f636f6e747261637400000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Meka Beast: Mega Orbs
Arg [1] : symbol_ (string): MBMO
Arg [2] : baseUri_ (string): https://mekabeast-orbs.app.paperhandlabs.io/api/metadata
Arg [3] : contractUri_ (string): https://mekabeast-orbs.app.paperhandlabs.io/api/metadata/contract
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [5] : 4d656b612042656173743a204d656761204f7262730000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4d424d4f00000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000038
Arg [9] : 68747470733a2f2f6d656b6162656173742d6f7262732e6170702e7061706572
Arg [10] : 68616e646c6162732e696f2f6170692f6d657461646174610000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [12] : 68747470733a2f2f6d656b6162656173742d6f7262732e6170702e7061706572
Arg [13] : 68616e646c6162732e696f2f6170692f6d657461646174612f636f6e74726163
Arg [14] : 7400000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
108517:19618:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124277:487;;;;;;;;;;-1:-1:-1;124277:487:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;124277:487:0;;;;;;;;115973:169;;;;;;;;;;-1:-1:-1;115973:169:0;;;;;:::i;:::-;;:::i;:::-;;56580:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63071:218::-;;;;;;;;;;-1:-1:-1;63071:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2315:55:1;;;2297:74;;2285:2;2270:18;63071:218:0;2151:226:1;118151:206:0;;;;;;:::i;:::-;;:::i;41808:33::-;;;;;;;;;;-1:-1:-1;41808:33:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;2849:55:1;;;2831:74;;2936:2;2921:18;;2914:34;;;;2804:18;41808:33:0;2641:313:1;52331:323:0;;;;;;;;;;-1:-1:-1;127737:1:0;52605:12;52392:7;52589:13;:28;-1:-1:-1;;52589:46:0;52331:323;;;3105:25:1;;;3093:2;3078:18;52331:323:0;2959:177:1;118625:205:0;;;;;;:::i;:::-;;:::i;108859:22::-;;;;;;;;;;-1:-1:-1;108859:22:0;;;;;;;;114711:236;;;;;;;;;;-1:-1:-1;114711:236:0;;;;;:::i;:::-;;:::i;90525:442::-;;;;;;;;;;-1:-1:-1;90525:442:0;;;;;:::i;:::-;;:::i;44861:411::-;;;;;;;;;;-1:-1:-1;44861:411:0;;;;;:::i;:::-;;:::i;108668:40::-;;;;;;;;;;;;108705:3;108668:40;;41762:37;;;;;;;;;;-1:-1:-1;41762:37:0;;;;-1:-1:-1;;;;;41762:37:0;;;119102:213;;;;;;:::i;:::-;;:::i;112882:120::-;;;;;;;;;;-1:-1:-1;112882:120:0;;;;;:::i;:::-;;:::i;112449:160::-;;;;;;;;;;-1:-1:-1;112449:160:0;;;;;:::i;:::-;;:::i;108961:43::-;;;;;;;;;;-1:-1:-1;108961:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5008:4:1;4996:17;;;4978:36;;4966:2;4951:18;108961:43:0;4836:184:1;113971:194:0;;;;;;;;;;-1:-1:-1;113971:194:0;;;;;:::i;:::-;;:::i;122840:478::-;;;;;;;;;;-1:-1:-1;122840:478:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;15699:484::-;;;;;;;;;;;;;:::i;57973:152::-;;;;;;;;;;-1:-1:-1;57973:152:0;;;;;:::i;:::-;;:::i;108769:38::-;;;;;;;;;;;;;;;;109143:21;;;;;;;;;;;;;:::i;53515:233::-;;;;;;;;;;-1:-1:-1;53515:233:0;;;;;:::i;:::-;;:::i;5944:103::-;;;;;;;;;;;;;:::i;113601:240::-;;;;;;;;;;-1:-1:-1;113601:240:0;;;;;:::i;:::-;;:::i;115483:208::-;;;;;;;;;;-1:-1:-1;115483:208:0;;;;;:::i;:::-;;:::i;120753:982::-;;;;;;;;;;-1:-1:-1;120753:982:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;117231:174::-;;;;;;;;;;;;;:::i;114303:202::-;;;;;;;;;;-1:-1:-1;114303:202:0;;;;;:::i;:::-;;:::i;56756:104::-;;;;;;;;;;;;;:::i;108816:34::-;;;;;;;;;;;;;;;;117679:208;;;;;;;;;;-1:-1:-1;117679:208:0;;;;;:::i;:::-;;:::i;43779:1074::-;;;;;;;;;;;;;:::i;10311:53::-;;;;;;;;;;-1:-1:-1;10311:53:0;;;;-1:-1:-1;;;;;10311:53:0;;;109082:52;;;;;;;;;;-1:-1:-1;109082:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;111657:507;;;;;;:::i;:::-;;:::i;119587:247::-;;;;;;:::i;:::-;;:::i;15151:422::-;;;;;;;;;;-1:-1:-1;15151:422:0;;;;;:::i;:::-;;:::i;108888:28::-;;;;;;;;;;;;;;;;125534:373;;;;;;;;;;-1:-1:-1;125534:373:0;;;;;:::i;:::-;;:::i;123566:307::-;;;;;;;;;;-1:-1:-1;123566:307:0;;;;;:::i;:::-;;:::i;108715:45::-;;;;;;;;;;;;108758:2;108715:45;;122091:305;;;;;;;;;;-1:-1:-1;122091:305:0;;;;;:::i;:::-;;:::i;109171:25::-;;;;;;;;;;;;;:::i;64020:164::-;;;;;;;;;;-1:-1:-1;64020:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;64141:25:0;;;64117:4;64141:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;64020:164;14240:43;;;;;;;;;;-1:-1:-1;14240:43:0;;;;-1:-1:-1;;;14240:43:0;;;;;;6202:201;;;;;;;;;;-1:-1:-1;6202:201:0;;;;;:::i;:::-;;:::i;115115:140::-;;;;;;;;;;-1:-1:-1;115115:140:0;;;;;:::i;:::-;;:::i;116729:282::-;;;;;;;;;;-1:-1:-1;116729:282:0;;;;;:::i;:::-;;:::i;41848:39::-;;;;;;;;;;;;;;;;124277:487;124425:4;124663:38;124689:11;124663:25;:38::i;:::-;:93;;;;124718:38;124744:11;124718:25;:38::i;:::-;124643:113;124277:487;-1:-1:-1;;124277:487:0:o;115973:169::-;5182:13;:11;:13::i;:::-;116092:42:::1;116111:8;116121:12;116092:18;:42::i;:::-;115973:169:::0;;:::o;56580:100::-;56634:13;56667:5;56660:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56580:100;:::o;63071:218::-;63147:7;63172:16;63180:7;63172;:16::i;:::-;63167:64;;63197:34;;;;;;;;;;;;;;63167:64;-1:-1:-1;63251:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;63251:30:0;;63071:218::o;118151:206::-;118291:8;11821:30;11842:8;11821:20;:30::i;:::-;118317:32:::1;118331:8;118341:7;118317:13;:32::i;:::-;118151:206:::0;;;:::o;41808:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41808:33:0;;;;-1:-1:-1;41808:33:0;:::o;118625:205::-;118768:4;-1:-1:-1;;;;;11641:18:0;;11649:10;11641:18;11637:83;;11676:32;11697:10;11676:20;:32::i;:::-;118785:37:::1;118804:4;118810:2;118814:7;118785:18;:37::i;:::-;118625:205:::0;;;;:::o;114711:236::-;5182:13;:11;:13::i;:::-;114780:19:::1;::::0;114776:92:::1;;114837:19;;-1:-1:-1::0;;;114837:19:0::1;;;;;;;;;;;114776:92;114880:10;:19:::0;;-1:-1:-1;;114880:19:0::1;::::0;::::1;;::::0;;::::1;::::0;;;114915:24:::1;::::0;586:41:1;;;114915:24:0::1;::::0;574:2:1;559:18;114915:24:0::1;;;;;;;;114711:236:::0;:::o;90525:442::-;90622:7;90680:27;;;:17;:27;;;;;;;;90651:56;;;;;;;;;-1:-1:-1;;;;;90651:56:0;;;;;-1:-1:-1;;;90651:56:0;;;;;;;;;;;;90622:7;;90720:92;;-1:-1:-1;90771:29:0;;;;;;;;;90781:19;90771:29;-1:-1:-1;;;;;90771:29:0;;;;-1:-1:-1;;;90771:29:0;;;;;;;;90720:92;90862:23;;;;90824:21;;91333:5;;90849:36;;90848:58;90849:36;:10;:36;:::i;:::-;90848:58;;;;:::i;:::-;90927:16;;;;;-1:-1:-1;90525:442:0;;-1:-1:-1;;;;90525:442:0:o;44861:411::-;5182:13;:11;:13::i;:::-;3357:21:::1;:19;:21::i;:::-;44941:6:::2;44951:1;44941:11:::0;44938:62:::2;;44976:12;;;;;;;;;;;;;;44938:62;45032:24;;45023:6;:33;45020:94;;;45080:22;;;;;;;;;;;;;;45020:94;45154:6;45126:24;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;45186:14:0::2;::::0;45178:36:::2;::::0;-1:-1:-1;;;;;45186:14:0;;::::2;::::0;45178:36;::::2;;;::::0;45207:6;;45186:14:::2;45178:36:::0;45186:14;45178:36;45207:6;45186:14;45178:36;::::2;;;;;;45173:92;;45238:15;;-1:-1:-1::0;;;45238:15:0::2;;;;;;;;;;;45173:92;3401:20:::1;2795:1:::0;3921:7;:22;3738:213;3401:20:::1;44861:411:::0;:::o;119102:213::-;119249:4;-1:-1:-1;;;;;11641:18:0;;11649:10;11641:18;11637:83;;11676:32;11697:10;11676:20;:32::i;:::-;119266:41:::1;119289:4;119295:2;119299:7;119266:22;:41::i;112882:120::-:0;112933:20;112939:7;112948:4;112933:5;:20::i;:::-;112993:1;112964:26;;;:17;:26;;;;;:30;112882:120::o;112449:160::-;3357:21;:19;:21::i;:::-;5182:13:::1;:11;:13::i;:::-;112572:29:::2;112586:9;112597:3;112572:13;:29::i;:::-;3401:20:::0;2795:1;3921:7;:22;3738:213;113971:194;5182:13;:11;:13::i;:::-;114073:1:::1;114049:25:::0;;;114045:86:::1;;114098:21;::::0;-1:-1:-1;;;114098:21:0;;11830:2:1;114098:21:0::1;::::0;::::1;11812::1::0;11869:1;11849:18;;;11842:29;-1:-1:-1;;;11887:18:1;;;11880:36;11933:18;;114098:21:0::1;;;;;;;;114045:86;114141:7;:16;114151:6:::0;;114141:7;:16:::1;:::i;122840:478::-:0;122939:25;122966;123020:21;123034:6;123020:13;:21::i;:::-;123009:32;;123077:8;:15;123063:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;123063:30:0;;123052:41;;123111:9;123106:205;123130:8;:15;123126:1;:19;123106:205;;;123240:59;123270:8;123279:1;123270:11;;;;;;;;:::i;:::-;;;;;;;123283:15;123240:29;:59::i;:::-;123226:8;123235:1;123226:11;;;;;;;;:::i;:::-;;;;;;;;;;:73;123147:3;;;;:::i;:::-;;;;123106:205;;;;122840:478;;;:::o;15699:484::-;15775:7;:5;:7::i;:::-;-1:-1:-1;;;;;15761:21:0;:10;-1:-1:-1;;;;;15761:21:0;;15757:72;;15806:11;;-1:-1:-1;;;15806:11:0;;;;;;;;;;;15757:72;15914:31;;-1:-1:-1;;;15914:31:0;;;;15910:95;;;15969:24;;-1:-1:-1;;;15969:24:0;;;;;;;;;;;15910:95;16066:22;:60;;16137:38;;-1:-1:-1;;;16137:38:0;;;15699:484::o;57973:152::-;58045:7;58088:27;58107:7;58088:18;:27::i;109143:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53515:233::-;53587:7;-1:-1:-1;;;;;53611:19:0;;53607:60;;53639:28;;;;;;;;;;;;;;53607:60;-1:-1:-1;;;;;;53685:25:0;;;;;:18;:25;;;;;;47674:13;53685:55;;53515:233::o;5944:103::-;5182:13;:11;:13::i;:::-;6009:30:::1;6036:1;6009:18;:30::i;:::-;5944:103::o:0;113601:240::-;3357:21;:19;:21::i;:::-;113722:35:::1;::::0;;;:26:::1;:35;::::0;;;;:42;;-1:-1:-1;;113722:42:0::1;113760:4;113722:42;::::0;;113777:56:::1;113800:12;821:10:::0;;741:98;113800:12:::1;113814:9;113825:7;113777:22;:56::i;115483:208::-:0;5182:13;:11;:13::i;:::-;115560:10;115556:83:::1;;115608:19;;-1:-1:-1::0;;;115608:19:0::1;;;;;;;;;;;115556:83;115651:19;:32:::0;115483:208::o;120753:982::-;120840:16;120899:19;120933:25;120973:22;120998:17;121008:6;120998:9;:17::i;:::-;120973:42;;121030:25;121072:14;121058:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;121058:29:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;121030:57:0;;-1:-1:-1;127737:1:0;121148:539;121232:14;121217:11;:29;121148:539;;121315:15;121328:1;121315:12;:15::i;:::-;121303:27;;121353:9;:16;;;121394:8;121349:73;121444:14;;-1:-1:-1;;;;;121444:28:0;;121440:111;;121517:14;;;-1:-1:-1;121440:111:0;121594:6;-1:-1:-1;;;;;121573:27:0;:17;-1:-1:-1;;;;;121573:27:0;;121569:103;;121651:1;121625:8;121634:13;;;;;;121625:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;121569:103;121265:3;;121148:539;;;-1:-1:-1;121708:8:0;;120753:982;-1:-1:-1;;;;;;120753:982:0:o;117231:174::-;117350:7;117382:15;5369:6;;-1:-1:-1;;;;;5369:6:0;;5296:87;117382:15;117375:22;;117231:174;:::o;114303:202::-;5182:13;:11;:13::i;:::-;114409:1:::1;114385:25:::0;;;114381:86:::1;;114434:21;::::0;-1:-1:-1;;;114434:21:0;;11830:2:1;114434:21:0::1;::::0;::::1;11812::1::0;11869:1;11849:18;;;11842:29;-1:-1:-1;;;11887:18:1;;;11880:36;11933:18;;114434:21:0::1;11628:329:1::0;114381:86:0::1;114477:11;:20;114491:6:::0;;114477:11;:20:::1;:::i;56756:104::-:0;56812:13;56845:7;56838:14;;;;;:::i;117679:208::-;117810:8;11821:30;11842:8;11821:20;:30::i;:::-;117836:43:::1;117860:8;117870;117836:23;:43::i;43779:1074::-:0;42172:7;:5;:7::i;:::-;-1:-1:-1;;;;;42156:23:0;821:10;-1:-1:-1;;;;;42156:23:0;;:48;;;-1:-1:-1;821:10:0;42183:21;;;;:7;:21;;;;;;;;42156:48;42152:139;;;3357:21:::1;:19;:21::i;:::-;43881:24:::2;;43856:21;:49;43853:106;;43929:18;;;;;;;;;;;;;;43853:106;43971:22;44020:24;;43996:21;:48;;;;:::i;:::-;43971:73;;44062:9;44057:789;44081:12;:19:::0;44077:23;::::2;44057:789;;;44122:24;44149:12;44162:1;44149:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;44122:42:::2;::::0;;;;::::2;::::0;;;44149:15:::2;::::0;;::::2;;44122:42:::0;;-1:-1:-1;;;;;44122:42:0::2;::::0;;;::::2;::::0;;;::::2;::::0;;;44237:17:::2;::::0;44122:42;;-1:-1:-1;44259:3:0::2;::::0;44224:30:::2;::::0;44237:17:::2;::::0;;::::2;::::0;44224:30:::2;:::i;:::-;44206:49;::::0;:14;:49:::2;:::i;:::-;44205:57;;;;:::i;:::-;44181:81:::0;-1:-1:-1;44466:30:0::2;44181:81:::0;44466:14;:30:::2;:::i;:::-;44437:24;;:60;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;44584:18:0;;44576:47:::2;::::0;-1:-1:-1;;;;;44576:32:0;;::::2;::::0;:47;::::2;;;::::0;44609:13;;44584:18:::2;44576:47:::0;44584:18;44576:47;44609:13;44576:32;:47;::::2;;;;;;44571:111;;44651:15;;-1:-1:-1::0;;;44651:15:0::2;;;;;;;;;;;44571:111;44736:18:::0;;44703:131:::2;::::0;;-1:-1:-1;;;;;14707:55:1;;;14689:74;;14794:2;14779:18;;14772:34;;;14822:18;;14815:34;;;44703:131:0::2;::::0;14677:2:1;14662:18;44703:131:0::2;;;;;;;44107:739;;44102:3;;;;;:::i;:::-;;;;44057:789;;;;43842:1011;3401:20:::1;2795:1:::0;3921:7;:22;3738:213;42152:139;42262:17;;;;;;;;;;;;;;111657:507;3357:21;:19;:21::i;:::-;111780:11:::1;;110066:161;110103:11;;110066:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;110133:19:0::1;::::0;110181:30:::1;::::0;-1:-1:-1;;821:10:0;15009:2:1;15005:15;15001:53;110181:30:0::1;::::0;::::1;14989:66:1::0;110133:19:0;;-1:-1:-1;15071:12:1;;;-1:-1:-1;110181:30:0::1;;;;;;;;;;;;110171:41;;;;;;110066:18;:161::i;:::-;110047:240;;110261:14;;;;;;;;;;;;;;110047:240;111814:10:::2;::::0;::::2;;111809:65;;111848:14;;;;;;;;;;;;;;111809:65;111903:9;;111890;:22;111886:79;;111936:17;;;;;;;;;;;;;;111886:79;821:10:::0;111981:24:::2;::::0;;;:10:::2;:24;::::0;;;;;::::2;;:29:::0;111977:98:::2;;112034:29;;;;;;;;;;;;;;111977:98;821:10:::0;112087:24:::2;::::0;;;:10:::2;:24;::::0;;;;:28;;-1:-1:-1;;112087:28:0::2;112114:1;112087:28:::0;;::::2;::::0;;;112126:30:::2;::::0;821:10;112126:13:::2;:30::i;:::-;3389:1:::1;;3401:20:::0;2795:1;3921:7;:22;3738:213;119587:247;119762:4;-1:-1:-1;;;;;11641:18:0;;11649:10;11641:18;11637:83;;11676:32;11697:10;11676:20;:32::i;:::-;119779:47:::1;119802:4;119808:2;119812:7;119821:4;119779:22;:47::i;:::-;119587:247:::0;;;;;:::o;15151:422::-;15262:7;:5;:7::i;:::-;-1:-1:-1;;;;;15248:21:0;:10;-1:-1:-1;;;;;15248:21:0;;15244:72;;15293:11;;-1:-1:-1;;;15293:11:0;;;;;;;;;;;15244:72;15401:31;;-1:-1:-1;;;15401:31:0;;;;15397:95;;;15456:24;;-1:-1:-1;;;15456:24:0;;;;;;;;;;;15397:95;15504:22;:61;;-1:-1:-1;;15504:61:0;-1:-1:-1;;;;;15504:61:0;;;;;;;;;;15151:422::o;125534:373::-;125667:7;125744:26;;;:17;:26;;;;;;125667:7;;125774:5;;125707:63;;:21;:63;:::i;:::-;125706:73;;;;:::i;:::-;125687:92;-1:-1:-1;125870:29:0;108758:2;125687:92;125870:29;:::i;:::-;125863:36;125534:373;-1:-1:-1;;;;125534:373:0:o;123566:307::-;123676:13;123712:16;123720:7;123712;:16::i;:::-;123707:83;;123752:26;;-1:-1:-1;;;123752:26:0;;;;;;;;;;;123707:83;123831:7;123845:18;:7;:16;:18::i;:::-;123814:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;123800:65;;123566:307;;;:::o;122091:305::-;122156:7;122181:16;122189:7;122181;:16::i;:::-;122176:83;;122221:26;;-1:-1:-1;;;122221:26:0;;;;;;;;;;;122176:83;122333:55;122363:7;122372:15;122333:29;:55::i;109171:25::-;;;;;;;:::i;6202:201::-;5182:13;:11;:13::i;:::-;-1:-1:-1;;;;;6291:22:0;::::1;6283:73;;;::::0;-1:-1:-1;;;6283:73:0;;16465:2:1;6283:73:0::1;::::0;::::1;16447:21:1::0;16504:2;16484:18;;;16477:30;16543:34;16523:18;;;16516:62;16614:8;16594:18;;;16587:36;16640:19;;6283:73:0::1;16263:402:1::0;6283:73:0::1;6367:28;6386:8;6367:18;:28::i;115115:140::-:0;5182:13;:11;:13::i;:::-;115185:9:::1;:20:::0;;;115221:26:::1;::::0;3105:25:1;;;115221:26:0::1;::::0;3093:2:1;3078:18;115221:26:0::1;2959:177:1::0;116729:282:0;5182:13;:11;:13::i;:::-;108705:3:::1;116819:9;116803:13;;:25;;;;:::i;:::-;:38;116799:109;;;116883:13;::::0;116870:26:::1;::::0;108705:3:::1;116870:26;:::i;:::-;116858:38;;116799:109;116937:9;116920:13;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;116989:13:0::1;::::0;116964:39:::1;::::0;;16844:25:1;;;16900:2;16885:18;;16878:34;;;;116964:39:0::1;::::0;16817:18:1;116964:39:0::1;16670:248:1::0;5296:87:0;5369:6;;-1:-1:-1;;;;;5369:6:0;;5296:87::o;55678:639::-;55763:4;-1:-1:-1;;;;;;;;;56087:25:0;;;;:102;;-1:-1:-1;56164:25:0;-1:-1:-1;;;;;;56164:25:0;;;56087:102;:179;;;-1:-1:-1;;;;;;;;56241:25:0;;;;55678:639::o;90255:215::-;90357:4;-1:-1:-1;;;;;;90381:41:0;;90396:26;90381:41;;:81;;-1:-1:-1;;;;;;;;;;27307:40:0;;;90426:36;27198:157;5461:132;821:10;5525:7;:5;:7::i;:::-;-1:-1:-1;;;;;5525:23:0;;5517:68;;;;-1:-1:-1;;;5517:68:0;;17125:2:1;5517:68:0;;;17107:21:1;;;17144:18;;;17137:30;17203:34;17183:18;;;17176:62;17255:18;;5517:68:0;16923:356:1;91617:332:0;91333:5;91720:33;;;;;91712:88;;;;-1:-1:-1;;;91712:88:0;;17486:2:1;91712:88:0;;;17468:21:1;17525:2;17505:18;;;17498:30;17564:34;17544:18;;;17537:62;17635:12;17615:18;;;17608:40;17665:19;;91712:88:0;17284:406:1;91712:88:0;-1:-1:-1;;;;;91819:22:0;;91811:60;;;;-1:-1:-1;;;91811:60:0;;17897:2:1;91811:60:0;;;17879:21:1;17936:2;17916:18;;;17909:30;17975:27;17955:18;;;17948:55;18020:18;;91811:60:0;17695:349:1;91811:60:0;91906:35;;;;;;;;;-1:-1:-1;;;;;91906:35:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;91884:57:0;;;;:19;:57;91617:332::o;64442:282::-;64507:4;64563:7;127737:1;64544:26;;:66;;;;;64597:13;;64587:7;:23;64544:66;:153;;;;-1:-1:-1;;64648:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;64648:44:0;:49;;64442:282::o;14685:211::-;14787:22;;-1:-1:-1;;;;;14787:22:0;14779:45;14775:114;;14841:36;14868:8;14841:26;:36::i;62504:408::-;62593:13;62609:16;62617:7;62609;:16::i;:::-;62593:32;-1:-1:-1;821:10:0;-1:-1:-1;;;;;62642:28:0;;;62638:175;;62690:44;62707:5;821:10;64020:164;:::i;62690:44::-;62685:128;;62762:35;;;;;;;;;;;;;;62685:128;62825:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;62825:35:0;-1:-1:-1;;;;;62825:35:0;;;;;;;;;62876:28;;62825:24;;62876:28;;;;;;;62582:330;62504:408;;:::o;66710:2825::-;66852:27;66882;66901:7;66882:18;:27::i;:::-;66852:57;;66967:4;-1:-1:-1;;;;;66926:45:0;66942:19;-1:-1:-1;;;;;66926:45:0;;66922:86;;66980:28;;;;;;;;;;;;;;66922:86;67022:27;65818:24;;;:15;:24;;;;;66046:26;;67213:68;66046:26;67255:4;821:10;67261:19;-1:-1:-1;;;;;65292:32:0;;;65136:28;;65421:20;;65443:30;;65418:56;;64833:659;67213:68;67208:180;;67301:43;67318:4;821:10;64020:164;:::i;67301:43::-;67296:92;;67353:35;;-1:-1:-1;;;67353:35:0;;;;;;;;;;;67296:92;-1:-1:-1;;;;;67405:16:0;;67401:52;;67430:23;;;;;;;;;;;;;;67401:52;67602:15;67599:160;;;67742:1;67721:19;67714:30;67599:160;-1:-1:-1;;;;;68139:24:0;;;;;;;:18;:24;;;;;;68137:26;;-1:-1:-1;;68137:26:0;;;68208:22;;;;;;;;;68206:24;;-1:-1:-1;68206:24:0;;;61362:11;61337:23;61333:41;61320:63;-1:-1:-1;;;61320:63:0;68501:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;68796:47:0;;:52;;68792:627;;68901:1;68891:11;;68869:19;69024:30;;;:17;:30;;;;;;:35;;69020:384;;69162:13;;69147:11;:28;69143:242;;69309:30;;;;:17;:30;;;;;:52;;;69143:242;68850:569;68792:627;69466:7;69462:2;-1:-1:-1;;;;;69447:27:0;69456:4;-1:-1:-1;;;;;69447:27:0;;;;;;;;;;;69485:42;69506:4;69512:2;69516:7;69525:1;69485:20;:42::i;:::-;66841:2694;;;66710:2825;;;:::o;3437:293::-;2839:1;3571:7;;:19;3563:63;;;;-1:-1:-1;;;3563:63:0;;18251:2:1;3563:63:0;;;18233:21:1;18290:2;18270:18;;;18263:30;18329:33;18309:18;;;18302:61;18380:18;;3563:63:0;18049:355:1;3563:63:0;2839:1;3704:7;:18;3437:293::o;69631:193::-;69777:39;69794:4;69800:2;69804:7;69777:39;;;;;;;;;;;;:16;:39::i;81279:3081::-;81359:27;81389;81408:7;81389:18;:27::i;:::-;81359:57;-1:-1:-1;81359:57:0;81429:12;;81551:35;81578:7;65707:27;65818:24;;;:15;:24;;;;;66046:26;;65818:24;;65605:485;81551:35;81494:92;;;;81603:13;81599:316;;;81724:68;81749:15;81766:4;821:10;81772:19;741:98;81724:68;81719:184;;81816:43;81833:4;821:10;64020:164;:::i;81816:43::-;81811:92;;81868:35;;-1:-1:-1;;;81868:35:0;;;;;;;;;;;81811:92;82071:15;82068:160;;;82211:1;82190:19;82183:30;82068:160;-1:-1:-1;;;;;82830:24:0;;;;;;:18;:24;;;;;:60;;82858:32;82830:60;;;61362:11;61337:23;61333:41;61320:63;83218:43;61320:63;83128:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;83453:47:0;;:52;;83449:627;;83558:1;83548:11;;83526:19;83681:30;;;:17;:30;;;;;;:35;;83677:384;;83819:13;;83804:11;:28;83800:242;;83966:30;;;;:17;:30;;;;;:52;;;83800:242;83507:569;83449:627;84104:35;;84131:7;;84127:1;;-1:-1:-1;;;;;84104:35:0;;;;;84127:1;;84104:35;84150:50;84171:4;84185:1;84189:7;84198:1;84150:20;:50::i;:::-;-1:-1:-1;;84327:12:0;:14;;;;;;-1:-1:-1;;;;81279:3081:0:o;127846:286::-;127924:3;127931:1;127924:8;127920:62;;127956:14;;;;;;;;;;;;;;127920:62;108705:3;128016;127999:14;52807:7;52998:13;-1:-1:-1;;52998:31:0;;52752:296;127999:14;:20;;;;:::i;:::-;127998:35;127994:93;;;128057:18;;;;;;;;;;;;;;127994:93;128099:25;128109:9;128120:3;128099:9;:25::i;59128:1275::-;59195:7;59230;;127737:1;59279:23;59275:1061;;59332:13;;59325:4;:20;59321:1015;;;59370:14;59387:23;;;:17;:23;;;;;;;-1:-1:-1;;;59476:24:0;;:29;;59472:845;;60141:113;60148:6;60158:1;60148:11;60141:113;;-1:-1:-1;;;60219:6:0;60201:25;;;;:17;:25;;;;;;60141:113;;;60287:6;59128:1275;-1:-1:-1;;;59128:1275:0:o;59472:845::-;59347:989;59321:1015;60364:31;;;;;;;;;;;;;;6563:191;6656:6;;;-1:-1:-1;;;;;6673:17:0;;;-1:-1:-1;;6673:17:0;;;;;;;6706:40;;6656:6;;;6673:17;6656:6;;6706:40;;6637:16;;6706:40;6626:128;6563:191;:::o;58576:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58704:24:0;;;;:17;:24;;;;;;58685:44;;-1:-1:-1;;;;;;;;;;;;;60612:41:0;;;;48333:3;60698:33;;;60664:68;;-1:-1:-1;;;60664:68:0;-1:-1:-1;;;60762:24:0;;:29;;-1:-1:-1;;;60743:48:0;;;;48854:3;60831:28;;;;-1:-1:-1;;;60802:58:0;-1:-1:-1;60502:366:0;63629:234;821:10;63724:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;63724:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;63724:60:0;;;;;;;;;;63800:55;;586:41:1;;;63724:49:0;;821:10;63800:55;;559:18:1;63800:55:0;;;;;;;63629:234;;:::o;96716:190::-;96841:4;96894;96865:25;96878:5;96885:4;96865:12;:25::i;:::-;:33;;96716:190;-1:-1:-1;;;;96716:190:0:o;70422:407::-;70597:31;70610:4;70616:2;70620:7;70597:12;:31::i;:::-;-1:-1:-1;;;;;70643:14:0;;;:19;70639:183;;70682:56;70713:4;70719:2;70723:7;70732:5;70682:30;:56::i;:::-;70677:145;;70766:40;;-1:-1:-1;;;70766:40:0;;;;;;;;;;;93549:716;93605:13;93656:14;93673:17;93684:5;93673:10;:17::i;:::-;93693:1;93673:21;93656:38;;93709:20;93743:6;93732:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93732:18:0;-1:-1:-1;93709:41:0;-1:-1:-1;93874:28:0;;;93890:2;93874:28;93931:288;-1:-1:-1;;93963:5:0;94105:8;94100:2;94089:14;;94084:30;93963:5;94071:44;94161:2;94152:11;;;-1:-1:-1;94182:21:0;93931:288;94182:21;-1:-1:-1;94240:6:0;93549:716;-1:-1:-1;;;93549:716:0:o;12520:490::-;12636:22;;-1:-1:-1;;;;;12636:22:0;12779:31;;;;;:68;;;12846:1;12822:8;-1:-1:-1;;;;;12814:29:0;;:33;12779:68;12775:228;;;12869:51;;;;;12904:4;12869:51;;;18644:34:1;-1:-1:-1;;;;;18714:15:1;;;18694:18;;;18687:43;12869:26:0;;;;;18556:18:1;;12869:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12864:128;;12948:28;;;;;-1:-1:-1;;;;;2315:55:1;;12948:28:0;;;2297:74:1;2270:18;;12948:28:0;2151:226:1;126342:990:0;126588:9;126583:742;126607:8;126603:1;:12;126583:742;;;126637:22;126662:16;126677:1;126662:12;:16;:::i;:::-;126700:42;;;;:26;:42;;;;;;126637:41;;-1:-1:-1;126700:42:0;;126695:338;;126826:24;126889:33;;;:17;:33;;;;;;126853:15;126889:52;;;;126967:50;;126853:15;;-1:-1:-1;;;;;126967:50:0;;;126853:15;;126907:14;;126967:50;;126826:24;126967:50;126744:289;126695:338;127308:5;127263:42;;;:26;:42;;;;;:50;;-1:-1:-1;;127263:50:0;;;126617:3;;;;:::i;:::-;;;;126583:742;;80582:112;80659:27;80669:2;80673:8;80659:27;;;;;;;;;;;;:9;:27::i;97583:296::-;97666:7;97709:4;97666:7;97724:118;97748:5;:12;97744:1;:16;97724:118;;;97797:33;97807:12;97821:5;97827:1;97821:8;;;;;;;;:::i;:::-;;;;;;;97797:9;:33::i;:::-;97782:48;-1:-1:-1;97762:3:0;;;;:::i;:::-;;;;97724:118;;;-1:-1:-1;97859:12:0;97583:296;-1:-1:-1;;;97583:296:0:o;72913:716::-;73097:88;;-1:-1:-1;;;73097:88:0;;73076:4;;-1:-1:-1;;;;;73097:45:0;;;;;:88;;821:10;;73164:4;;73170:7;;73179:5;;73097:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73097:88:0;;;;;;;;-1:-1:-1;;73097:88:0;;;;;;;;;;;;:::i;:::-;;;73093:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73380:6;:13;73397:1;73380:18;73376:235;;73426:40;;-1:-1:-1;;;73426:40:0;;;;;;;;;;;73376:235;73569:6;73563:13;73554:6;73550:2;73546:15;73539:38;73093:529;-1:-1:-1;;;;;;73256:64:0;-1:-1:-1;;;73256:64:0;;-1:-1:-1;72913:716:0;;;;;;:::o;38609:922::-;38662:7;;38749:6;38740:15;;38736:102;;38785:6;38776:15;;;-1:-1:-1;38820:2:0;38810:12;38736:102;38865:6;38856:5;:15;38852:102;;38901:6;38892:15;;;-1:-1:-1;38936:2:0;38926:12;38852:102;38981:6;38972:5;:15;38968:102;;39017:6;39008:15;;;-1:-1:-1;39052:2:0;39042:12;38968:102;39097:5;39088;:14;39084:99;;39132:5;39123:14;;;-1:-1:-1;39166:1:0;39156:11;39084:99;39210:5;39201;:14;39197:99;;39245:5;39236:14;;;-1:-1:-1;39279:1:0;39269:11;39197:99;39323:5;39314;:14;39310:99;;39358:5;39349:14;;;-1:-1:-1;39392:1:0;39382:11;39310:99;39436:5;39427;:14;39423:66;;39472:1;39462:11;39517:6;38609:922;-1:-1:-1;;38609:922:0:o;79809:689::-;79940:19;79946:2;79950:8;79940:5;:19::i;:::-;-1:-1:-1;;;;;80001:14:0;;;:19;79997:483;;80041:11;80055:13;80103:14;;;80136:233;80167:62;80206:1;80210:2;80214:7;;;;;;80223:5;80167:30;:62::i;:::-;80162:167;;80265:40;;-1:-1:-1;;;80265:40:0;;;;;;;;;;;80162:167;80364:3;80356:5;:11;80136:233;;80451:3;80434:13;;:20;80430:34;;80456:8;;;104623:149;104686:7;104717:1;104713;:5;:51;;104848:13;104942:15;;;104978:4;104971:15;;;105025:4;105009:21;;104713:51;;;-1:-1:-1;104848:13:0;104942:15;;;104978:4;104971:15;105025:4;105009:21;;;104623:149::o;74091:2966::-;74164:20;74187:13;;;74215;;;74211:44;;74237:18;;;;;;;;;;;;;;74211:44;-1:-1:-1;;;;;74743:22:0;;;;;;:18;:22;;;;47812:2;74743:22;;;:71;;74781:32;74769:45;;74743:71;;;75057:31;;;:17;:31;;;;;-1:-1:-1;61793:15:0;;61767:24;61763:46;61362:11;61337:23;61333:41;61330:52;61320:63;;75057:173;;75292:23;;;;75057:31;;74743:22;;76057:25;74743:22;;75910:335;76571:1;76557:12;76553:20;76511:346;76612:3;76603:7;76600:16;76511:346;;76830:7;76820:8;76817:1;76790:25;76787:1;76784;76779:59;76665:1;76652:15;76511:346;;;76515:77;76890:8;76902:1;76890:13;76886:45;;76912:19;;;;;;;;;;;;;;76886:45;76948:13;:19;;;76989:60;;-1:-1:-1;77022:2:0;77026:12;77040:8;76989:20;:60::i;14:177:1:-;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:196::-;706:20;;-1:-1:-1;;;;;755:54:1;;745:65;;735:93;;824:1;821;814:12;735:93;638:196;;;:::o;839:366::-;906:6;914;967:2;955:9;946:7;942:23;938:32;935:52;;;983:1;980;973:12;935:52;1006:29;1025:9;1006:29;:::i;:::-;996:39;;1085:2;1074:9;1070:18;1057:32;1129:26;1122:5;1118:38;1111:5;1108:49;1098:77;;1171:1;1168;1161:12;1098:77;1194:5;1184:15;;;839:366;;;;;:::o;1210:250::-;1295:1;1305:113;1319:6;1316:1;1313:13;1305:113;;;1395:11;;;1389:18;1376:11;;;1369:39;1341:2;1334:10;1305:113;;;-1:-1:-1;;1452:1:1;1434:16;;1427:27;1210:250::o;1465:271::-;1507:3;1545:5;1539:12;1572:6;1567:3;1560:19;1588:76;1657:6;1650:4;1645:3;1641:14;1634:4;1627:5;1623:16;1588:76;:::i;:::-;1718:2;1697:15;-1:-1:-1;;1693:29:1;1684:39;;;;1725:4;1680:50;;1465:271;-1:-1:-1;;1465:271:1:o;1741:220::-;1890:2;1879:9;1872:21;1853:4;1910:45;1951:2;1940:9;1936:18;1928:6;1910:45;:::i;1966:180::-;2025:6;2078:2;2066:9;2057:7;2053:23;2049:32;2046:52;;;2094:1;2091;2084:12;2046:52;-1:-1:-1;2117:23:1;;1966:180;-1:-1:-1;1966:180:1:o;2382:254::-;2450:6;2458;2511:2;2499:9;2490:7;2486:23;2482:32;2479:52;;;2527:1;2524;2517:12;2479:52;2550:29;2569:9;2550:29;:::i;:::-;2540:39;2626:2;2611:18;;;;2598:32;;-1:-1:-1;;;2382:254:1:o;3141:328::-;3218:6;3226;3234;3287:2;3275:9;3266:7;3262:23;3258:32;3255:52;;;3303:1;3300;3293:12;3255:52;3326:29;3345:9;3326:29;:::i;:::-;3316:39;;3374:38;3408:2;3397:9;3393:18;3374:38;:::i;:::-;3364:48;;3459:2;3448:9;3444:18;3431:32;3421:42;;3141:328;;;;;:::o;3474:118::-;3560:5;3553:13;3546:21;3539:5;3536:32;3526:60;;3582:1;3579;3572:12;3597:241;3653:6;3706:2;3694:9;3685:7;3681:23;3677:32;3674:52;;;3722:1;3719;3712:12;3674:52;3761:9;3748:23;3780:28;3802:5;3780:28;:::i;3843:248::-;3911:6;3919;3972:2;3960:9;3951:7;3947:23;3943:32;3940:52;;;3988:1;3985;3978:12;3940:52;-1:-1:-1;;4011:23:1;;;4081:2;4066:18;;;4053:32;;-1:-1:-1;3843:248:1:o;4645:186::-;4704:6;4757:2;4745:9;4736:7;4732:23;4728:32;4725:52;;;4773:1;4770;4763:12;4725:52;4796:29;4815:9;4796:29;:::i;5025:592::-;5096:6;5104;5157:2;5145:9;5136:7;5132:23;5128:32;5125:52;;;5173:1;5170;5163:12;5125:52;5213:9;5200:23;5242:18;5283:2;5275:6;5272:14;5269:34;;;5299:1;5296;5289:12;5269:34;5337:6;5326:9;5322:22;5312:32;;5382:7;5375:4;5371:2;5367:13;5363:27;5353:55;;5404:1;5401;5394:12;5353:55;5444:2;5431:16;5470:2;5462:6;5459:14;5456:34;;;5486:1;5483;5476:12;5456:34;5531:7;5526:2;5517:6;5513:2;5509:15;5505:24;5502:37;5499:57;;;5552:1;5549;5542:12;5499:57;5583:2;5575:11;;;;;5605:6;;-1:-1:-1;5025:592:1;;-1:-1:-1;;;;5025:592:1:o;5622:435::-;5675:3;5713:5;5707:12;5740:6;5735:3;5728:19;5766:4;5795:2;5790:3;5786:12;5779:19;;5832:2;5825:5;5821:14;5853:1;5863:169;5877:6;5874:1;5871:13;5863:169;;;5938:13;;5926:26;;5972:12;;;;6007:15;;;;5899:1;5892:9;5863:169;;;-1:-1:-1;6048:3:1;;5622:435;-1:-1:-1;;;;;5622:435:1:o;6062:465::-;6319:2;6308:9;6301:21;6282:4;6345:56;6397:2;6386:9;6382:18;6374:6;6345:56;:::i;:::-;6449:9;6441:6;6437:22;6432:2;6421:9;6417:18;6410:50;6477:44;6514:6;6506;6477:44;:::i;:::-;6469:52;6062:465;-1:-1:-1;;;;;6062:465:1:o;6532:254::-;6600:6;6608;6661:2;6649:9;6640:7;6636:23;6632:32;6629:52;;;6677:1;6674;6667:12;6629:52;6713:9;6700:23;6690:33;;6742:38;6776:2;6765:9;6761:18;6742:38;:::i;:::-;6732:48;;6532:254;;;;;:::o;6976:261::-;7155:2;7144:9;7137:21;7118:4;7175:56;7227:2;7216:9;7212:18;7204:6;7175:56;:::i;7424:315::-;7489:6;7497;7550:2;7538:9;7529:7;7525:23;7521:32;7518:52;;;7566:1;7563;7556:12;7518:52;7589:29;7608:9;7589:29;:::i;:::-;7579:39;;7668:2;7657:9;7653:18;7640:32;7681:28;7703:5;7681:28;:::i;8006:615::-;8092:6;8100;8153:2;8141:9;8132:7;8128:23;8124:32;8121:52;;;8169:1;8166;8159:12;8121:52;8209:9;8196:23;8238:18;8279:2;8271:6;8268:14;8265:34;;;8295:1;8292;8285:12;8265:34;8333:6;8322:9;8318:22;8308:32;;8378:7;8371:4;8367:2;8363:13;8359:27;8349:55;;8400:1;8397;8390:12;8349:55;8440:2;8427:16;8466:2;8458:6;8455:14;8452:34;;;8482:1;8479;8472:12;8452:34;8535:7;8530:2;8520:6;8517:1;8513:14;8509:2;8505:23;8501:32;8498:45;8495:65;;;8556:1;8553;8546:12;8626:184;-1:-1:-1;;;8675:1:1;8668:88;8775:4;8772:1;8765:15;8799:4;8796:1;8789:15;8815:1138;8910:6;8918;8926;8934;8987:3;8975:9;8966:7;8962:23;8958:33;8955:53;;;9004:1;9001;8994:12;8955:53;9027:29;9046:9;9027:29;:::i;:::-;9017:39;;9075:38;9109:2;9098:9;9094:18;9075:38;:::i;:::-;9065:48;;9160:2;9149:9;9145:18;9132:32;9122:42;;9215:2;9204:9;9200:18;9187:32;9238:18;9279:2;9271:6;9268:14;9265:34;;;9295:1;9292;9285:12;9265:34;9333:6;9322:9;9318:22;9308:32;;9378:7;9371:4;9367:2;9363:13;9359:27;9349:55;;9400:1;9397;9390:12;9349:55;9436:2;9423:16;9458:2;9454;9451:10;9448:36;;;9464:18;;:::i;:::-;9539:2;9533:9;9507:2;9593:13;;-1:-1:-1;;9589:22:1;;;9613:2;9585:31;9581:40;9569:53;;;9637:18;;;9657:22;;;9634:46;9631:72;;;9683:18;;:::i;:::-;9723:10;9719:2;9712:22;9758:2;9750:6;9743:18;9798:7;9793:2;9788;9784;9780:11;9776:20;9773:33;9770:53;;;9819:1;9816;9809:12;9770:53;9875:2;9870;9866;9862:11;9857:2;9849:6;9845:15;9832:46;9920:1;9915:2;9910;9902:6;9898:15;9894:24;9887:35;9941:6;9931:16;;;;;;;8815:1138;;;;;;;:::o;9958:260::-;10026:6;10034;10087:2;10075:9;10066:7;10062:23;10058:32;10055:52;;;10103:1;10100;10093:12;10055:52;10126:29;10145:9;10126:29;:::i;:::-;10116:39;;10174:38;10208:2;10197:9;10193:18;10174:38;:::i;10223:437::-;10302:1;10298:12;;;;10345;;;10366:61;;10420:4;10412:6;10408:17;10398:27;;10366:61;10473:2;10465:6;10462:14;10442:18;10439:38;10436:218;;-1:-1:-1;;;10507:1:1;10500:88;10611:4;10608:1;10601:15;10639:4;10636:1;10629:15;10436:218;;10223:437;;;:::o;10665:184::-;-1:-1:-1;;;10714:1:1;10707:88;10814:4;10811:1;10804:15;10838:4;10835:1;10828:15;10854:168;10927:9;;;10958;;10975:15;;;10969:22;;10955:37;10945:71;;10996:18;;:::i;11216:274::-;11256:1;11282;11272:189;;-1:-1:-1;;;11314:1:1;11307:88;11418:4;11415:1;11408:15;11446:4;11443:1;11436:15;11272:189;-1:-1:-1;11475:9:1;;11216:274::o;11495:128::-;11562:9;;;11583:11;;;11580:37;;;11597:18;;:::i;12088:545::-;12190:2;12185:3;12182:11;12179:448;;;12226:1;12251:5;12247:2;12240:17;12296:4;12292:2;12282:19;12366:2;12354:10;12350:19;12347:1;12343:27;12337:4;12333:38;12402:4;12390:10;12387:20;12384:47;;;-1:-1:-1;12425:4:1;12384:47;12480:2;12475:3;12471:12;12468:1;12464:20;12458:4;12454:31;12444:41;;12535:82;12553:2;12546:5;12543:13;12535:82;;;12598:17;;;12579:1;12568:13;12535:82;;12809:1206;12933:18;12928:3;12925:27;12922:53;;;12955:18;;:::i;:::-;12984:94;13074:3;13034:38;13066:4;13060:11;13034:38;:::i;:::-;13028:4;12984:94;:::i;:::-;13104:1;13129:2;13124:3;13121:11;13146:1;13141:616;;;;13801:1;13818:3;13815:93;;;-1:-1:-1;13874:19:1;;;13861:33;13815:93;-1:-1:-1;;12766:1:1;12762:11;;;12758:24;12754:29;12744:40;12790:1;12786:11;;;12741:57;13921:78;;13114:895;;13141:616;12035:1;12028:14;;;12072:4;12059:18;;-1:-1:-1;;13177:17:1;;;13278:9;13300:229;13314:7;13311:1;13308:14;13300:229;;;13403:19;;;13390:33;13375:49;;13510:4;13495:20;;;;13463:1;13451:14;;;;13330:12;13300:229;;;13304:3;13557;13548:7;13545:16;13542:159;;;13681:1;13677:6;13671:3;13665;13662:1;13658:11;13654:21;13650:34;13646:39;13633:9;13628:3;13624:19;13611:33;13607:79;13599:6;13592:95;13542:159;;;13744:1;13738:3;13735:1;13731:11;13727:19;13721:4;13714:33;13114:895;;12809:1206;;;:::o;14020:184::-;-1:-1:-1;;;14069:1:1;14062:88;14169:4;14166:1;14159:15;14193:4;14190:1;14183:15;14209:135;14248:3;14269:17;;;14266:43;;14289:18;;:::i;:::-;-1:-1:-1;14336:1:1;14325:13;;14209:135::o;14349:125::-;14414:9;;;14435:10;;;14432:36;;;14448:18;;:::i;15094:1164::-;15371:3;15400:1;15433:6;15427:13;15463:36;15489:9;15463:36;:::i;:::-;15518:1;15535:18;;;15562:133;;;;15709:1;15704:356;;;;15528:532;;15562:133;-1:-1:-1;;15595:24:1;;15583:37;;15668:14;;15661:22;15649:35;;15640:45;;;-1:-1:-1;15562:133:1;;15704:356;15735:6;15732:1;15725:17;15765:4;15810:2;15807:1;15797:16;15835:1;15849:165;15863:6;15860:1;15857:13;15849:165;;;15941:14;;15928:11;;;15921:35;15984:16;;;;15878:10;;15849:165;;;15853:3;;;16043:6;16038:3;16034:16;16027:23;;15528:532;;16081:3;16076;16069:16;16116:6;16110:13;16094:29;;16132:77;16200:8;16195:2;16190:3;16186:12;16179:4;16171:6;16167:17;16132:77;:::i;:::-;16229:18;;;;16225:27;;;-1:-1:-1;;;;;15094:1164:1:o;18741:245::-;18808:6;18861:2;18849:9;18840:7;18836:23;18832:32;18829:52;;;18877:1;18874;18867:12;18829:52;18909:9;18903:16;18928:28;18950:5;18928:28;:::i;18991:512::-;19185:4;-1:-1:-1;;;;;19295:2:1;19287:6;19283:15;19272:9;19265:34;19347:2;19339:6;19335:15;19330:2;19319:9;19315:18;19308:43;;19387:6;19382:2;19371:9;19367:18;19360:34;19430:3;19425:2;19414:9;19410:18;19403:31;19451:46;19492:3;19481:9;19477:19;19469:6;19451:46;:::i;:::-;19443:54;18991:512;-1:-1:-1;;;;;;18991:512:1:o;19508:249::-;19577:6;19630:2;19618:9;19609:7;19605:23;19601:32;19598:52;;;19646:1;19643;19636:12;19598:52;19678:9;19672:16;19697:30;19721:5;19697:30;:::i
Swarm Source
ipfs://2bbee7458df10238032955554fe0feba7007068f4f6c6377d3f932bca821e9d8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.