ETH Price: $3,834.76 (+1.91%)
Gas: 4 Gwei

Token

GAMA Space Station v2 (GAMAv2)
 

Overview

Max Total Supply

9,999 GAMAv2

Holders

790

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
infohazard.eth
Balance
1 GAMAv2
0x8143aad694567424162a949c1580c91d03437858
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

GAMA is a decentralized organization that is sending 10k crew members into space to complete energy harnessing missions across the universe.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GAMAv2

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-06
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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
    ) external;

    /**
     * @dev Transfers `tokenId` token 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;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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 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);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: contracts/ERC721G/ERC721G.sol


// Creator: Chiru Labs
// Modifications Copyright (c) 2022 Cyber Manufacture Co.

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128).
 */
contract ERC721G is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _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 ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    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, tokenId.toString())) : '';
    }

    /**
     * @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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721G.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = uint128(updatedIndex);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // 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**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // 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**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @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 {}
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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);
    }
}

// File: contracts/@rarible/royalties/contracts/LibPart.sol



pragma solidity ^0.8.0;

library LibPart {
    bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)");

    struct Part {
        address payable account;
        uint96 value;
    }

    function hash(Part memory part) internal pure returns (bytes32) {
        return keccak256(abi.encode(TYPE_HASH, part.account, part.value));
    }
}

// File: contracts/@rarible/royalties/contracts/impl/AbstractRoyalties.sol



pragma solidity ^0.8.0;

abstract contract AbstractRoyalties {
    mapping (uint256 => LibPart.Part[]) public royalties;

    function _saveRoyalties(uint256 _id, LibPart.Part[] memory _royalties) internal {
        for (uint i = 0; i < _royalties.length; i++) {
            require(_royalties[i].account != address(0x0), "Recipient should be present");
            require(_royalties[i].value != 0, "Royalty value should be positive");
            royalties[_id].push(_royalties[i]);
        }
        _onRoyaltiesSet(_id, _royalties);
    }

    function _updateAccount(uint256 _id, address _from, address _to) internal {
        uint length = royalties[_id].length;
        for(uint i = 0; i < length; i++) {
            if (royalties[_id][i].account == _from) {
                royalties[_id][i].account = payable(address(uint160(_to)));
            }
        }
    }

    function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) virtual internal;
}

// File: contracts/@rarible/royalties/contracts/RoyaltiesV2.sol



pragma solidity ^0.8.0;

interface RoyaltiesV2 {
    event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);

    function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory);
}

// File: contracts/@rarible/royalties/contracts/impl/RoyaltiesV2Impl.sol



pragma solidity ^0.8.0;


contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2 {
    function getRaribleV2Royalties(uint256 id) override external view returns (LibPart.Part[] memory) {
        return royalties[id];
    }

    function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) override internal {
        emit RoyaltiesSet(_id, _royalties);
    }
}

// File: contracts/@rarible/royalties/contracts/LibRoyaltiesV2.sol



pragma solidity ^0.8.0;

library LibRoyaltiesV2 {
    /*
    * bytes4(keccak256('getRoyalties(LibAsset.AssetType)')) == 0x44c74bcc
    */
    bytes4 constant _INTERFACE_ID_ROYALTIES = 0x44c74bcc;
}

// File: contracts/GAMAv2.sol

pragma solidity ^0.8.4;





/// By John Whitton (github: johnwhitton), Aaron Li (github: polymorpher)
contract GAMAv2 is ERC721G, Ownable, RoyaltiesV2Impl {
    bytes32 internal salt;
    uint256 public maxGamaTokens;
    uint256 public mintPrice;
    uint256 public maxPerMint;
    uint256 public startIndex;

    string public provenanceHash = "";
    uint256 public offsetValue;

    bool public metadataFrozen;
    bool public provenanceFrozen;
    bool public saleIsActive;
    bool public saleStarted;

    mapping(uint256 => string) internal metadataUris;
    string internal _contractUri;
    string public temporaryTokenUri;
    string internal baseUri;
    address internal revenueAccount;

    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;

    event SetBaseUri(string baseUri);
    event SetStartIndex(uint256 index);
    event GAMAMint(uint256 lastTokenId, uint256 numTokens, address initialOwner);
    event GAMAMintCommunity(uint256 lastTokenId, uint256 numTokens, address initialOwner);
    event GAMABurn(uint256 id);
    event GAMABatchBurn(uint256[] ids);
    event GAMATransfer(uint256 id, address from, address to, address operator);
    event GAMASetup(uint32 coolingPeriod_, uint32 shipNumber_, string contractUri);

    constructor(bool _saleIsActive, bool _metadataFrozen, bool _provenanceFrozen, uint256 _maxGamaTokens, uint256 _mintPrice, uint256 _maxPerMint, string memory _baseUri, string memory contractUri_) ERC721G("GAMA Space Station v2", "GAMAv2") {
        saleIsActive = _saleIsActive;
        if (saleIsActive) {
            saleStarted = true;
        }
        metadataFrozen = _metadataFrozen;
        provenanceFrozen = _provenanceFrozen;
        maxGamaTokens = _maxGamaTokens;
        mintPrice = _mintPrice;
        maxPerMint = _maxPerMint;
        baseUri = _baseUri;
        _contractUri = contractUri_;
    }

    modifier whenSaleActive {
        require(saleIsActive, "GAMAv2: Sale is not active");
        _;
    }

    modifier whenMetadataNotFrozen {
        require(!metadataFrozen, "GAMAv2: Metadata is frozen");
        _;
    }

    modifier whenProvenanceNotFrozen {
        require(!provenanceFrozen, "GAMAv2: Provenance is frozen");
        _;
    }

    // ------------------
    // Explicit overrides
    // ------------------

    function _burn(uint256 tokenId) internal virtual override(ERC721G) {
        super._burn(tokenId);
    }

    function setTemporaryTokenUri(string memory uri) public onlyOwner {
        temporaryTokenUri = uri;
    }

    function tokenURI(uint256 tokenId) public view virtual override(ERC721G) returns (string memory) {
        if (!metadataFrozen && bytes(temporaryTokenUri).length > 0) {
            return temporaryTokenUri;
        }
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        uint256 tid = tokenId;
        if (tid >= offsetValue) {
            tid = ((startIndex + tid - offsetValue) % (maxGamaTokens - offsetValue)) + offsetValue ;
        }

        if (bytes(metadataUris[tokenId]).length == 0) {
            return bytes(baseUri).length != 0 ? string(abi.encodePacked(baseUri, uint2str(tid))) : '';
        }
        return metadataUris[tokenId];
    }

    function setStartIndex() external onlyOwner {
        startIndex = uint256(keccak256(abi.encodePacked(blockhash(block.number - 2), bytes20(msg.sender), bytes32(totalSupply())))) % (maxGamaTokens - offsetValue);
        emit SetStartIndex(startIndex);
    }

    function _baseURI() internal view override returns (string memory) {
        return baseUri;
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return interfaceId == this.name.selector ||
        interfaceId == this.symbol.selector ||
        interfaceId == LibRoyaltiesV2._INTERFACE_ID_ROYALTIES ||
        interfaceId == _INTERFACE_ID_ERC2981 ||
        ERC721G.supportsInterface(interfaceId);
    }

    // ------------------
    // Utility view functions
    // ------------------

    function exists(uint256 _tokenId) public view returns (bool) {
        return _exists(_tokenId);
    }

    //TODO review if we need to override the contractURI
    function contractURI() public view returns (string memory) {
        return _contractUri;
    }


    // ------------------
    // Functions for external (user) minting
    // ------------------

    function mintGAMA(uint256 amount) external payable whenSaleActive {
        require(totalSupply() + amount < maxGamaTokens, "GAMAv2: Purchase would exceed cap");
        require(amount <= maxPerMint, "GAMAv2: Amount exceeds max per mint");
        require(mintPrice * amount <= msg.value, "GAMAv2: Ether value sent is not correct");
        uint256 excess = msg.value - (amount * mintPrice);
        if (excess > 0) {
            payable(msg.sender).transfer(excess);
        }
        _safeMint(msg.sender, amount);
        emit GAMAMint(totalSupply(), amount, msg.sender);
    }

    function burn(uint256 id) public onlyOwner() whenMetadataNotFrozen() {
        ERC721G._burn(id);
        emit GAMABurn(id);
    }

    function batchBurn(uint256[] memory ids) public onlyOwner() whenMetadataNotFrozen() {
        for (uint32 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            ERC721G._burn(id);
        }
        emit GAMABatchBurn(ids);
    }

    // ------------------
    // Functions for the owner (GAMA minting contracts)
    // ------------------

    function freezeMetadata() external onlyOwner whenMetadataNotFrozen {
        metadataFrozen = true;
    }

    function freezeProvenance() external onlyOwner whenProvenanceNotFrozen {
        provenanceFrozen = true;
    }

    function toggleSaleState() external onlyOwner {
        require ((saleIsActive || (offsetValue != 0)), "cannot start sale until airdrop is complete and offset set"); 
        saleIsActive = !saleIsActive;
        if (saleIsActive && !saleStarted) {
            saleStarted = true;
        }
    }

    function setContractUri(string memory uri_) public onlyOwner() {
        _contractUri = uri_;
    }

    function setProvenanceHash(string memory _provenanceHash) external onlyOwner whenProvenanceNotFrozen {
        provenanceHash = _provenanceHash;
    }

    function setOffsetValue(uint256 _offsetValue) external onlyOwner {
        require(!saleStarted, "sale already begun");
        offsetValue = _offsetValue;
    }

    function setMaxPerMint(uint256 _maxPerMint) external onlyOwner {
        maxPerMint = _maxPerMint;
    }

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function setBaseUri(string memory _baseUri) external onlyOwner whenMetadataNotFrozen {
        baseUri = _baseUri;
        emit SetBaseUri(baseUri);
    }

    function mintForCommunity(address _to, uint256 _numberOfTokens) external onlyOwner {
        require(_to != address(0), "GAMAv2: Cannot mint to zero address.");
        require(totalSupply() + _numberOfTokens < maxGamaTokens, "GAMAv2: Minting would exceed cap");
        _safeMint(_to, _numberOfTokens);
        emit GAMAMintCommunity(totalSupply(), _numberOfTokens, _to);
    }

    function withdraw(uint256 amount, bool shouldUseRevenueAccount) public {
        require(msg.sender == Ownable.owner() || msg.sender == revenueAccount, "unauthorized");
        address a = shouldUseRevenueAccount ? revenueAccount : Ownable.owner();
        (bool success,) = a.call{value : amount}("");
        require(success);
    }

    function setUri(uint256 id, string memory uri_) public onlyOwner() whenMetadataNotFrozen {
        metadataUris[id] = uri_;
    }

    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function setRevenueAccount(address account) public onlyOwner() {
        revenueAccount = account;
    }

    function setRoyalties(uint _tokenId, address payable _royaltiesReceipientAddress, uint96 _percentageBasisPoints) public  onlyOwner() {
        LibPart.Part[] memory _royalties = new LibPart.Part[](1);
        _royalties[0].value = _percentageBasisPoints;
        _royalties[0].account = _royaltiesReceipientAddress;
        _saveRoyalties(_tokenId, _royalties);
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external  view returns (address receiver, uint256 royaltyAmount) {
        LibPart.Part[] memory _royalties = royalties[_tokenId];
        if (_royalties.length > 0) {
            return (_royalties[0].account, (_salePrice * _royalties[0].value) / 10000);
        }
        return (address(0), 0);

    }

    receive() external payable {

    }

    // ------------------
    // Utility function for getting the tokens of a certain address
    // ------------------

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            for (uint256 index; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bool","name":"_saleIsActive","type":"bool"},{"internalType":"bool","name":"_metadataFrozen","type":"bool"},{"internalType":"bool","name":"_provenanceFrozen","type":"bool"},{"internalType":"uint256","name":"_maxGamaTokens","type":"uint256"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPerMint","type":"uint256"},{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"string","name":"contractUri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","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"},{"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":"ids","type":"uint256[]"}],"name":"GAMABatchBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"GAMABurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lastTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numTokens","type":"uint256"},{"indexed":false,"internalType":"address","name":"initialOwner","type":"address"}],"name":"GAMAMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lastTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numTokens","type":"uint256"},{"indexed":false,"internalType":"address","name":"initialOwner","type":"address"}],"name":"GAMAMintCommunity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"coolingPeriod_","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"shipNumber_","type":"uint32"},{"indexed":false,"internalType":"string","name":"contractUri","type":"string"}],"name":"GAMASetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"GAMATransfer","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":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseUri","type":"string"}],"name":"SetBaseUri","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"SetStartIndex","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeProvenance","outputs":[],"stateMutability":"nonpayable","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":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"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":"maxGamaTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"mintForCommunity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintGAMA","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offsetValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"provenanceFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"royalties","outputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerMint","type":"uint256"}],"name":"setMaxPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offsetValue","type":"uint256"}],"name":"setOffsetValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setRevenueAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_royaltiesReceipientAddress","type":"address"},{"internalType":"uint96","name":"_percentageBasisPoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTemporaryTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"temporaryTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"shouldUseRevenueAccount","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040819052600060808190526200001b91600e91620001d7565b503480156200002957600080fd5b5060405162003c9c38038062003c9c8339810160408190526200004c9162000346565b604080518082018252601581527f47414d412053706163652053746174696f6e207632000000000000000000000060208083019182528351808501909452600684526523a0a6a0bb1960d11b908401528151919291620000af91600191620001d7565b508051620000c5906002906020840190620001d7565b505050620000e2620000dc6200018160201b60201c565b62000185565b6010805462ff00001916620100008a15158102919091179182905560ff910416156200011c576010805463ff000000191663010000001790555b6010805461ffff191688151561ff0019161761010088151502179055600a859055600b849055600c83905581516200015c906014906020850190620001d7565b50805162000172906012906020840190620001d7565b50505050505050505062000457565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001e59062000404565b90600052602060002090601f01602090048101928262000209576000855562000254565b82601f106200022457805160ff191683800117855562000254565b8280016001018555821562000254579182015b828111156200025457825182559160200191906001019062000237565b506200026292915062000266565b5090565b5b8082111562000262576000815560010162000267565b805180151581146200028e57600080fd5b919050565b600082601f830112620002a4578081fd5b81516001600160401b0380821115620002c157620002c162000441565b604051601f8301601f19908116603f01168101908282118183101715620002ec57620002ec62000441565b8160405283815260209250868385880101111562000308578485fd5b8491505b838210156200032b57858201830151818301840152908201906200030c565b838211156200033c57848385830101525b9695505050505050565b600080600080600080600080610100898b03121562000363578384fd5b6200036e896200027d565b97506200037e60208a016200027d565b96506200038e60408a016200027d565b60608a015160808b015160a08c015160c08d0151939950919750955093506001600160401b0380821115620003c1578384fd5b620003cf8c838d0162000293565b935060e08b0151915080821115620003e5578283fd5b50620003f48b828c0162000293565b9150509295985092959890939650565b600181811c908216806200041957607f821691505b602082108114156200043b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61383580620004676000396000f3fe6080604052600436106103545760003560e01c80638462151c116101c6578063d111515d116100f7578063e8a3d48511610095578063eb8d24441161006f578063eb8d2444146109d9578063f2fde38b146109f9578063f4a0a52814610a19578063fb3cc6c214610a3957600080fd5b8063e8a3d48514610966578063e8db53951461097b578063e985e9c51461099057600080fd5b8063daaeec86116100d1578063daaeec86146108fc578063db6242c314610911578063dc8e92ea14610931578063e7d773a01461095157600080fd5b8063d111515d146108be578063d29aba0f146108d3578063d330175a146108e657600080fd5b8063a2cdbd0711610164578063c6ab67a31161013e578063c6ab67a31461083c578063c87b56dd14610851578063cad96cca14610871578063ccb4807b1461089e57600080fd5b8063a2cdbd07146107f1578063b88d4fde14610806578063b991b0fe1461082657600080fd5b80638da5cb5b116101a05780638da5cb5b1461077e57806395d89b411461079c578063a0bcfc7f146107b1578063a22cb465146107d157600080fd5b80638462151c146106ea57806384d5f97b146107175780638924af741461073757600080fd5b806338d07436116102a0578063507e094f1161023e5780636817c76c116102185780636817c76c1461067f57806370a0823114610695578063715018a6146106b5578063782f08ae146106ca57600080fd5b8063507e094f146106285780635c474f9e1461063e5780636352211e1461065f57600080fd5b806342966c681161027a57806342966c68146105a85780634e114e19146105c85780634f558e79146105e85780634f6ccce71461060857600080fd5b806338d07436146105525780633e0e828b1461057257806342842e0e1461058857600080fd5b8063143094db1161030d57806323b872dd116102e757806323b872dd146104b35780632a55205a146104d35780632f745c591461051257806330027f3b1461053257600080fd5b8063143094db1461045157806314ea928a1461047157806318160ddd1461049057600080fd5b806301ffc9a71461036057806306fdde0314610395578063081812fc146103b7578063095ea7b3146103ef5780630b1244d214610411578063109695231461043157600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b366004613222565b610a53565b60405190151581526020015b60405180910390f35b3480156103a157600080fd5b506103aa610acf565b60405161038c919061350e565b3480156103c357600080fd5b506103d76103d236600461328c565b610b61565b6040516001600160a01b03909116815260200161038c565b3480156103fb57600080fd5b5061040f61040a366004613150565b610ba5565b005b34801561041d57600080fd5b5061040f61042c36600461325a565b610c33565b34801561043d57600080fd5b5061040f61044c36600461325a565b610c7d565b34801561045d57600080fd5b5061040f61046c3660046132a4565b610d12565b34801561047d57600080fd5b5060105461038090610100900460ff1681565b34801561049c57600080fd5b506104a5610e0c565b60405190815260200161038c565b3480156104bf57600080fd5b5061040f6104ce366004613060565b610e2b565b3480156104df57600080fd5b506104f36104ee366004613356565b610e36565b604080516001600160a01b03909316835260208301919091520161038c565b34801561051e57600080fd5b506104a561052d366004613150565b610f58565b34801561053e57600080fd5b5061040f61054d36600461300c565b611054565b34801561055e57600080fd5b5061040f61056d3660046132f0565b6110a0565b34801561057e57600080fd5b506104a5600d5481565b34801561059457600080fd5b5061040f6105a3366004613060565b611185565b3480156105b457600080fd5b5061040f6105c336600461328c565b6111a0565b3480156105d457600080fd5b5061040f6105e3366004613150565b61122d565b3480156105f457600080fd5b5061038061060336600461328c565b61137b565b34801561061457600080fd5b506104a561062336600461328c565b611386565b34801561063457600080fd5b506104a5600c5481565b34801561064a57600080fd5b50601054610380906301000000900460ff1681565b34801561066b57600080fd5b506103d761067a36600461328c565b611430565b34801561068b57600080fd5b506104a5600b5481565b3480156106a157600080fd5b506104a56106b036600461300c565b611442565b3480156106c157600080fd5b5061040f611490565b3480156106d657600080fd5b5061040f6106e5366004613312565b6114c6565b3480156106f657600080fd5b5061070a61070536600461300c565b611532565b60405161038c91906134ca565b34801561072357600080fd5b5061040f61073236600461328c565b61160c565b34801561074357600080fd5b50610757610752366004613356565b61168a565b604080516001600160a01b0390931683526001600160601b0390911660208301520161038c565b34801561078a57600080fd5b506007546001600160a01b03166103d7565b3480156107a857600080fd5b506103aa6116d3565b3480156107bd57600080fd5b5061040f6107cc36600461325a565b6116e2565b3480156107dd57600080fd5b5061040f6107ec36600461311c565b611773565b3480156107fd57600080fd5b5061040f611809565b34801561081257600080fd5b5061040f6108213660046130a0565b6118ea565b34801561083257600080fd5b506104a5600f5481565b34801561084857600080fd5b506103aa61191e565b34801561085d57600080fd5b506103aa61086c36600461328c565b6119ac565b34801561087d57600080fd5b5061089161088c36600461328c565b611bf8565b60405161038c91906134b7565b3480156108aa57600080fd5b5061040f6108b936600461325a565b611c87565b3480156108ca57600080fd5b5061040f611cc4565b61040f6108e136600461328c565b611d20565b3480156108f257600080fd5b506104a5600a5481565b34801561090857600080fd5b5061040f611f4f565b34801561091d57600080fd5b5061040f61092c36600461328c565b612058565b34801561093d57600080fd5b5061040f61094c36600461317b565b612087565b34801561095d57600080fd5b5061040f612164565b34801561097257600080fd5b506103aa6121f7565b34801561098757600080fd5b506103aa612206565b34801561099c57600080fd5b506103806109ab366004613028565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156109e557600080fd5b506010546103809062010000900460ff1681565b348015610a0557600080fd5b5061040f610a1436600461300c565b612213565b348015610a2557600080fd5b5061040f610a3436600461328c565b6122ae565b348015610a4557600080fd5b506010546103809060ff1681565b60006001600160e01b031982166306fdde0360e01b1480610a8457506001600160e01b031982166395d89b4160e01b145b80610a9f57506001600160e01b03198216631131d2f360e21b145b80610aba57506001600160e01b0319821663152a902d60e11b145b80610ac95750610ac9826122dd565b92915050565b606060018054610ade9061370a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0a9061370a565b8015610b575780601f10610b2c57610100808354040283529160200191610b57565b820191906000526020600020905b815481529060010190602001808311610b3a57829003601f168201915b5050505050905090565b6000610b6c82612348565b610b89576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610bb082611430565b9050806001600160a01b0316836001600160a01b03161415610be55760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610c055750610c0381336109ab565b155b15610c23576040516367d9dca160e11b815260040160405180910390fd5b610c2e83838361237c565b505050565b6007546001600160a01b03163314610c665760405162461bcd60e51b8152600401610c5d906135d9565b60405180910390fd5b8051610c79906013906020840190612ee8565b5050565b6007546001600160a01b03163314610ca75760405162461bcd60e51b8152600401610c5d906135d9565b601054610100900460ff1615610cff5760405162461bcd60e51b815260206004820152601c60248201527f47414d4176323a2050726f76656e616e63652069732066726f7a656e000000006044820152606401610c5d565b8051610c7990600e906020840190612ee8565b6007546001600160a01b03163314610d3c5760405162461bcd60e51b8152600401610c5d906135d9565b604080516001808252818301909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081610d535790505090508181600081518110610d9e57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001906001600160601b031690816001600160601b0316815250508281600081518110610de457634e487b7160e01b600052603260045260246000fd5b60209081029190910101516001600160a01b039091169052610e0684826123d8565b50505050565b6000546001600160801b03600160801b82048116918116919091031690565b610c2e838383612586565b6000828152600860209081526040808320805482518185028101850190935280835284938493929190849084015b82821015610eb357600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610e64565b505050509050600081511115610f485780600081518110610ee457634e487b7160e01b600052603260045260246000fd5b60200260200101516000015161271082600081518110610f1457634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160601b031686610f3491906136a8565b610f3e9190613694565b9250925050610f51565b60008092509250505b9250929050565b6000610f6383611442565b8210610f82576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561104e57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290610ffa5750611046565b80516001600160a01b03161561100f57805192505b876001600160a01b0316836001600160a01b03161415611044578684141561103d57509350610ac992505050565b6001909301925b505b600101610f93565b50600080fd5b6007546001600160a01b0316331461107e5760405162461bcd60e51b8152600401610c5d906135d9565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314806110c357506015546001600160a01b031633145b6110fe5760405162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b6044820152606401610c5d565b600081611116576007546001600160a01b0316611123565b6015546001600160a01b03165b90506000816001600160a01b03168460405160006040518083038185875af1925050503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b5050905080610e0657600080fd5b610c2e838383604051806020016040528060008152506118ea565b6007546001600160a01b031633146111ca5760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff16156111ed5760405162461bcd60e51b8152600401610c5d906135a2565b6111f6816127a3565b6040518181527fc76077ece30e116ac83a5164a858697a39e017125e2b39902d2aebb358d49ff6906020015b60405180910390a150565b6007546001600160a01b031633146112575760405162461bcd60e51b8152600401610c5d906135d9565b6001600160a01b0382166112b95760405162461bcd60e51b8152602060048201526024808201527f47414d4176323a2043616e6e6f74206d696e7420746f207a65726f206164647260448201526332b9b99760e11b6064820152608401610c5d565b600a54816112c5610e0c565b6112cf9190613657565b1061131c5760405162461bcd60e51b815260206004820181905260248201527f47414d4176323a204d696e74696e6720776f756c6420657863656564206361706044820152606401610c5d565b6113268282612946565b7f933b70097c417841107292c83f583c8be5ceecdf29042164ea5339aabc15374761134f610e0c565b60408051918252602082018490526001600160a01b038516908201526060015b60405180910390a15050565b6000610ac982612348565b600080546001600160801b031681805b8281101561141657600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061140d57858314156114065750949350505050565b6001909201915b50600101611396565b506040516329c8c00760e21b815260040160405180910390fd5b600061143b82612960565b5192915050565b60006001600160a01b03821661146b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b6007546001600160a01b031633146114ba5760405162461bcd60e51b8152600401610c5d906135d9565b6114c46000612a82565b565b6007546001600160a01b031633146114f05760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff16156115135760405162461bcd60e51b8152600401610c5d906135a2565b60008281526011602090815260409091208251610c2e92840190612ee8565b6060600061153f83611442565b9050806115605760408051600080825260208201909252905b509392505050565b6000816001600160401b0381111561158857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156115b1578160200160208202803683370190505b50905060005b82811015611558576115c98582610f58565b8282815181106115e957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806115fe8161373f565b9150506115b7565b50919050565b6007546001600160a01b031633146116365760405162461bcd60e51b8152600401610c5d906135d9565b6010546301000000900460ff16156116855760405162461bcd60e51b815260206004820152601260248201527139b0b6329030b63932b0b23c903132b3bab760711b6044820152606401610c5d565b600f55565b600860205281600052604060002081815481106116a657600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b606060028054610ade9061370a565b6007546001600160a01b0316331461170c5760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff161561172f5760405162461bcd60e51b8152600401610c5d906135a2565b8051611742906014906020840190612ee8565b507fafa35f42f46f5052816d7c6a2e9406eca98294b20726677862d83b4a7418d8d560146040516112229190613521565b6001600160a01b03821633141561179d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146118335760405162461bcd60e51b8152600401610c5d906135d9565b600f54600a5461184391906136c7565b61184e6002436136c7565b403360601b61185b610e0c565b60405161188d939291906020019283526bffffffffffffffffffffffff19919091166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c6118b0919061377e565b600d8190556040519081527ffb0b2459ef0b436ea50d577db242217edfa1e86a7404361aaae9b6bb406b7e2f9060200160405180910390a1565b6118f5848484612586565b61190184848484612ad4565b610e06576040516368d2bf6b60e11b815260040160405180910390fd5b600e805461192b9061370a565b80601f01602080910402602001604051908101604052809291908181526020018280546119579061370a565b80156119a45780601f10611979576101008083540402835291602001916119a4565b820191906000526020600020905b81548152906001019060200180831161198757829003601f168201915b505050505081565b60105460609060ff161580156119d057506000601380546119cc9061370a565b9050115b15611a6757601380546119e29061370a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0e9061370a565b8015611a5b5780601f10611a3057610100808354040283529160200191611a5b565b820191906000526020600020905b815481529060010190602001808311611a3e57829003601f168201915b50505050509050919050565b611a7082612348565b611a8d57604051630a14c4b560e41b815260040160405180910390fd5b600f5482908110611adb57600f54600a54611aa99082906136c7565b600f5483600d54611aba9190613657565b611ac491906136c7565b611ace919061377e565b611ad89190613657565b90505b60008381526011602052604090208054611af49061370a565b15159050611b595760148054611b099061370a565b15159050611b265760405180602001604052806000815250611b52565b6014611b3182612be3565b604051602001611b429291906133fa565b6040516020818303038152906040525b9392505050565b60008381526011602052604090208054611b729061370a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9e9061370a565b8015611beb5780601f10611bc057610100808354040283529160200191611beb565b820191906000526020600020905b815481529060010190602001808311611bce57829003601f168201915b5050505050915050919050565b606060086000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611c7c57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611c2d565b505050509050919050565b6007546001600160a01b03163314611cb15760405162461bcd60e51b8152600401610c5d906135d9565b8051610c79906012906020840190612ee8565b6007546001600160a01b03163314611cee5760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff1615611d115760405162461bcd60e51b8152600401610c5d906135a2565b6010805460ff19166001179055565b60105462010000900460ff16611d785760405162461bcd60e51b815260206004820152601a60248201527f47414d4176323a2053616c65206973206e6f74206163746976650000000000006044820152606401610c5d565b600a5481611d84610e0c565b611d8e9190613657565b10611de55760405162461bcd60e51b815260206004820152602160248201527f47414d4176323a20507572636861736520776f756c64206578636565642063616044820152600760fc1b6064820152608401610c5d565b600c54811115611e435760405162461bcd60e51b815260206004820152602360248201527f47414d4176323a20416d6f756e742065786365656473206d617820706572206d6044820152621a5b9d60ea1b6064820152608401610c5d565b3481600b54611e5291906136a8565b1115611eb05760405162461bcd60e51b815260206004820152602760248201527f47414d4176323a2045746865722076616c75652073656e74206973206e6f742060448201526618dbdc9c9958dd60ca1b6064820152608401610c5d565b6000600b5482611ec091906136a8565b611eca90346136c7565b90508015611f0157604051339082156108fc029083906000818181858888f19350505050158015611eff573d6000803e3d6000fd5b505b611f0b3383612946565b7f7b3a422906a2e80ba6a4c0a65741e7b971c42518a27bd44cc1867ee591feea41611f34610e0c565b6040805191825260208201859052339082015260600161136f565b6007546001600160a01b03163314611f795760405162461bcd60e51b8152600401610c5d906135d9565b60105462010000900460ff1680611f915750600f5415155b6120035760405162461bcd60e51b815260206004820152603a60248201527f63616e6e6f742073746172742073616c6520756e74696c2061697264726f702060448201527f697320636f6d706c65746520616e64206f6666736574207365740000000000006064820152608401610c5d565b6010805460ff62010000808304821615810262ff0000199093169290921792839055910416801561203e57506010546301000000900460ff16155b156114c4576010805463ff00000019166301000000179055565b6007546001600160a01b031633146120825760405162461bcd60e51b8152600401610c5d906135d9565b600c55565b6007546001600160a01b031633146120b15760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff16156120d45760405162461bcd60e51b8152600401610c5d906135a2565b60005b81518163ffffffff161015612134576000828263ffffffff168151811061210e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050612121816127a3565b508061212c8161375a565b9150506120d7565b507f35a335e5bf170dab75d92b3967e88de15c5d4b6e2f269e8dc56e59f47acb9f268160405161122291906134ca565b6007546001600160a01b0316331461218e5760405162461bcd60e51b8152600401610c5d906135d9565b601054610100900460ff16156121e65760405162461bcd60e51b815260206004820152601c60248201527f47414d4176323a2050726f76656e616e63652069732066726f7a656e000000006044820152606401610c5d565b6010805461ff001916610100179055565b606060128054610ade9061370a565b6013805461192b9061370a565b6007546001600160a01b0316331461223d5760405162461bcd60e51b8152600401610c5d906135d9565b6001600160a01b0381166122a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c5d565b6122ab81612a82565b50565b6007546001600160a01b031633146122d85760405162461bcd60e51b8152600401610c5d906135d9565b600b55565b60006001600160e01b031982166380ac58cd60e01b148061230e57506001600160e01b03198216635b5e139f60e01b145b8061232957506001600160e01b0319821663780e9d6360e01b145b80610ac957506301ffc9a760e01b6001600160e01b0319831614610ac9565b600080546001600160801b031682108015610ac9575050600090815260036020526040902054600160e01b900460ff161590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60005b815181101561257b5760006001600160a01b031682828151811061240f57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031614156124725760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e7400000000006044820152606401610c5d565b81818151811061249257634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160601b0316600014156124f75760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f7369746976656044820152606401610c5d565b6000838152600860205260409020825183908390811061252757634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155806125738161373f565b9150506123db565b50610c798282612d27565b600061259182612960565b80519091506000906001600160a01b0316336001600160a01b031614806125bf575081516125bf90336109ab565b806125da5750336125cf84610b61565b6001600160a01b0316145b9050806125fa57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461262f5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661265657604051633a954ecd60e21b815260040160405180910390fd5b612666600084846000015161237c565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116612759576000546001600160801b031681101561275957825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60006127ae82612960565b90506127c0600083836000015161237c565b80516001600160a01b039081166000908152600460209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260039094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b19169390931790559085018083529120549091166128e0576000546001600160801b03168110156128e057815160008281526003602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506000805460016001600160801b03600160801b80840482169290920181169091029116179055565b610c79828260405180602001604052806000815250612d58565b60408051606081018252600080825260208201819052918101829052905482906001600160801b0316811015612a6957600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612a675780516001600160a01b0316156129fe579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612a62579392505050565b6129fe565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15612bd757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b1890339089908890889060040161347a565b602060405180830381600087803b158015612b3257600080fd5b505af1925050508015612b62575060408051601f3d908101601f19168201909252612b5f9181019061323e565b60015b612bbd573d808015612b90576040519150601f19603f3d011682016040523d82523d6000602084013e612b95565b606091505b508051612bb5576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612bdb565b5060015b949350505050565b606081612c075750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c315780612c1b8161373f565b9150612c2a9050600a83613694565b9150612c0b565b6000816001600160401b03811115612c5957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c83576020820181803683370190505b509050815b8515612d1e57612c996001826136c7565b90506000612ca8600a88613694565b612cb390600a6136a8565b612cbd90886136c7565b612cc890603061366f565b905060008160f81b905080848481518110612cf357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612d15600a89613694565b97505050612c88565b50949350505050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df828260405161136f92919061360e565b610c2e83838360016000546001600160801b03166001600160a01b038516612d9257604051622e076360e81b815260040160405180910390fd5b83612db05760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612ec25760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612e985750612e966000888488612ad4565b155b15612eb6576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612e41565b50600080546001600160801b0319166001600160801b039290921691909117905561279c565b828054612ef49061370a565b90600052602060002090601f016020900481019282612f165760008555612f5c565b82601f10612f2f57805160ff1916838001178555612f5c565b82800160010185558215612f5c579182015b82811115612f5c578251825591602001919060010190612f41565b50612f68929150612f6c565b5090565b5b80821115612f685760008155600101612f6d565b60006001600160401b03831115612f9a57612f9a6137be565b612fad601f8401601f1916602001613627565b9050828152838383011115612fc157600080fd5b828260208301376000602084830101529392505050565b80358015158114612fe857600080fd5b919050565b600082601f830112612ffd578081fd5b611b5283833560208501612f81565b60006020828403121561301d578081fd5b8135611b52816137d4565b6000806040838503121561303a578081fd5b8235613045816137d4565b91506020830135613055816137d4565b809150509250929050565b600080600060608486031215613074578081fd5b833561307f816137d4565b9250602084013561308f816137d4565b929592945050506040919091013590565b600080600080608085870312156130b5578081fd5b84356130c0816137d4565b935060208501356130d0816137d4565b92506040850135915060608501356001600160401b038111156130f1578182fd5b8501601f81018713613101578182fd5b61311087823560208401612f81565b91505092959194509250565b6000806040838503121561312e578182fd5b8235613139816137d4565b915061314760208401612fd8565b90509250929050565b60008060408385031215613162578182fd5b823561316d816137d4565b946020939093013593505050565b6000602080838503121561318d578182fd5b82356001600160401b03808211156131a3578384fd5b818501915085601f8301126131b6578384fd5b8135818111156131c8576131c86137be565b8060051b91506131d9848301613627565b8181528481019084860184860187018a10156131f3578788fd5b8795505b838610156132155780358352600195909501949186019186016131f7565b5098975050505050505050565b600060208284031215613233578081fd5b8135611b52816137e9565b60006020828403121561324f578081fd5b8151611b52816137e9565b60006020828403121561326b578081fd5b81356001600160401b03811115613280578182fd5b612bdb84828501612fed565b60006020828403121561329d578081fd5b5035919050565b6000806000606084860312156132b8578081fd5b8335925060208401356132ca816137d4565b915060408401356001600160601b03811681146132e5578182fd5b809150509250925092565b60008060408385031215613302578182fd5b8235915061314760208401612fd8565b60008060408385031215613324578182fd5b8235915060208301356001600160401b03811115613340578182fd5b61334c85828601612fed565b9150509250929050565b60008060408385031215613368578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156133c357815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161338a565b509495945050505050565b600081518084526133e68160208601602086016136de565b601f01601f19169290920160200192915050565b60008084546134088161370a565b6001828116801561342057600181146134315761345d565b60ff1984168752828701945061345d565b8886526020808720875b858110156134545781548a82015290840190820161343b565b50505082870194505b5050505083516134718183602088016136de565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134ad908301846133ce565b9695505050505050565b602081526000611b526020830184613377565b6020808252825182820181905260009190848201906040850190845b81811015613502578351835292840192918401916001016134e6565b50909695505050505050565b602081526000611b5260208301846133ce565b600060208083528184546135348161370a565b80848701526040600180841660008114613555576001811461356957613594565b60ff19851689840152606089019550613594565b898852868820885b8581101561358c5781548b8201860152908301908801613571565b8a0184019650505b509398975050505050505050565b6020808252601a908201527f47414d4176323a204d657461646174612069732066726f7a656e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b828152604060208201526000612bdb6040830184613377565b604051601f8201601f191681016001600160401b038111828210171561364f5761364f6137be565b604052919050565b6000821982111561366a5761366a613792565b500190565b600060ff821660ff84168060ff0382111561368c5761368c613792565b019392505050565b6000826136a3576136a36137a8565b500490565b60008160001904831182151516156136c2576136c2613792565b500290565b6000828210156136d9576136d9613792565b500390565b60005b838110156136f95781810151838201526020016136e1565b83811115610e065750506000910152565b600181811c9082168061371e57607f821691505b6020821081141561160657634e487b7160e01b600052602260045260246000fd5b600060001982141561375357613753613792565b5060010190565b600063ffffffff8083168181141561377457613774613792565b6001019392505050565b60008261378d5761378d6137a8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146122ab57600080fd5b6001600160e01b0319811681146122ab57600080fdfea26469706673582212202c2dc6c5a3b839e7cc89809ff8f371e193710d2f45818cc290833072376d623764736f6c634300080400330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d657a6f3577444b7a376b487741505255534a62793936726e43667668716756714444375a6f727839727179380000000000000000000000

Deployed Bytecode

0x6080604052600436106103545760003560e01c80638462151c116101c6578063d111515d116100f7578063e8a3d48511610095578063eb8d24441161006f578063eb8d2444146109d9578063f2fde38b146109f9578063f4a0a52814610a19578063fb3cc6c214610a3957600080fd5b8063e8a3d48514610966578063e8db53951461097b578063e985e9c51461099057600080fd5b8063daaeec86116100d1578063daaeec86146108fc578063db6242c314610911578063dc8e92ea14610931578063e7d773a01461095157600080fd5b8063d111515d146108be578063d29aba0f146108d3578063d330175a146108e657600080fd5b8063a2cdbd0711610164578063c6ab67a31161013e578063c6ab67a31461083c578063c87b56dd14610851578063cad96cca14610871578063ccb4807b1461089e57600080fd5b8063a2cdbd07146107f1578063b88d4fde14610806578063b991b0fe1461082657600080fd5b80638da5cb5b116101a05780638da5cb5b1461077e57806395d89b411461079c578063a0bcfc7f146107b1578063a22cb465146107d157600080fd5b80638462151c146106ea57806384d5f97b146107175780638924af741461073757600080fd5b806338d07436116102a0578063507e094f1161023e5780636817c76c116102185780636817c76c1461067f57806370a0823114610695578063715018a6146106b5578063782f08ae146106ca57600080fd5b8063507e094f146106285780635c474f9e1461063e5780636352211e1461065f57600080fd5b806342966c681161027a57806342966c68146105a85780634e114e19146105c85780634f558e79146105e85780634f6ccce71461060857600080fd5b806338d07436146105525780633e0e828b1461057257806342842e0e1461058857600080fd5b8063143094db1161030d57806323b872dd116102e757806323b872dd146104b35780632a55205a146104d35780632f745c591461051257806330027f3b1461053257600080fd5b8063143094db1461045157806314ea928a1461047157806318160ddd1461049057600080fd5b806301ffc9a71461036057806306fdde0314610395578063081812fc146103b7578063095ea7b3146103ef5780630b1244d214610411578063109695231461043157600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b366004613222565b610a53565b60405190151581526020015b60405180910390f35b3480156103a157600080fd5b506103aa610acf565b60405161038c919061350e565b3480156103c357600080fd5b506103d76103d236600461328c565b610b61565b6040516001600160a01b03909116815260200161038c565b3480156103fb57600080fd5b5061040f61040a366004613150565b610ba5565b005b34801561041d57600080fd5b5061040f61042c36600461325a565b610c33565b34801561043d57600080fd5b5061040f61044c36600461325a565b610c7d565b34801561045d57600080fd5b5061040f61046c3660046132a4565b610d12565b34801561047d57600080fd5b5060105461038090610100900460ff1681565b34801561049c57600080fd5b506104a5610e0c565b60405190815260200161038c565b3480156104bf57600080fd5b5061040f6104ce366004613060565b610e2b565b3480156104df57600080fd5b506104f36104ee366004613356565b610e36565b604080516001600160a01b03909316835260208301919091520161038c565b34801561051e57600080fd5b506104a561052d366004613150565b610f58565b34801561053e57600080fd5b5061040f61054d36600461300c565b611054565b34801561055e57600080fd5b5061040f61056d3660046132f0565b6110a0565b34801561057e57600080fd5b506104a5600d5481565b34801561059457600080fd5b5061040f6105a3366004613060565b611185565b3480156105b457600080fd5b5061040f6105c336600461328c565b6111a0565b3480156105d457600080fd5b5061040f6105e3366004613150565b61122d565b3480156105f457600080fd5b5061038061060336600461328c565b61137b565b34801561061457600080fd5b506104a561062336600461328c565b611386565b34801561063457600080fd5b506104a5600c5481565b34801561064a57600080fd5b50601054610380906301000000900460ff1681565b34801561066b57600080fd5b506103d761067a36600461328c565b611430565b34801561068b57600080fd5b506104a5600b5481565b3480156106a157600080fd5b506104a56106b036600461300c565b611442565b3480156106c157600080fd5b5061040f611490565b3480156106d657600080fd5b5061040f6106e5366004613312565b6114c6565b3480156106f657600080fd5b5061070a61070536600461300c565b611532565b60405161038c91906134ca565b34801561072357600080fd5b5061040f61073236600461328c565b61160c565b34801561074357600080fd5b50610757610752366004613356565b61168a565b604080516001600160a01b0390931683526001600160601b0390911660208301520161038c565b34801561078a57600080fd5b506007546001600160a01b03166103d7565b3480156107a857600080fd5b506103aa6116d3565b3480156107bd57600080fd5b5061040f6107cc36600461325a565b6116e2565b3480156107dd57600080fd5b5061040f6107ec36600461311c565b611773565b3480156107fd57600080fd5b5061040f611809565b34801561081257600080fd5b5061040f6108213660046130a0565b6118ea565b34801561083257600080fd5b506104a5600f5481565b34801561084857600080fd5b506103aa61191e565b34801561085d57600080fd5b506103aa61086c36600461328c565b6119ac565b34801561087d57600080fd5b5061089161088c36600461328c565b611bf8565b60405161038c91906134b7565b3480156108aa57600080fd5b5061040f6108b936600461325a565b611c87565b3480156108ca57600080fd5b5061040f611cc4565b61040f6108e136600461328c565b611d20565b3480156108f257600080fd5b506104a5600a5481565b34801561090857600080fd5b5061040f611f4f565b34801561091d57600080fd5b5061040f61092c36600461328c565b612058565b34801561093d57600080fd5b5061040f61094c36600461317b565b612087565b34801561095d57600080fd5b5061040f612164565b34801561097257600080fd5b506103aa6121f7565b34801561098757600080fd5b506103aa612206565b34801561099c57600080fd5b506103806109ab366004613028565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156109e557600080fd5b506010546103809062010000900460ff1681565b348015610a0557600080fd5b5061040f610a1436600461300c565b612213565b348015610a2557600080fd5b5061040f610a3436600461328c565b6122ae565b348015610a4557600080fd5b506010546103809060ff1681565b60006001600160e01b031982166306fdde0360e01b1480610a8457506001600160e01b031982166395d89b4160e01b145b80610a9f57506001600160e01b03198216631131d2f360e21b145b80610aba57506001600160e01b0319821663152a902d60e11b145b80610ac95750610ac9826122dd565b92915050565b606060018054610ade9061370a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0a9061370a565b8015610b575780601f10610b2c57610100808354040283529160200191610b57565b820191906000526020600020905b815481529060010190602001808311610b3a57829003601f168201915b5050505050905090565b6000610b6c82612348565b610b89576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610bb082611430565b9050806001600160a01b0316836001600160a01b03161415610be55760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610c055750610c0381336109ab565b155b15610c23576040516367d9dca160e11b815260040160405180910390fd5b610c2e83838361237c565b505050565b6007546001600160a01b03163314610c665760405162461bcd60e51b8152600401610c5d906135d9565b60405180910390fd5b8051610c79906013906020840190612ee8565b5050565b6007546001600160a01b03163314610ca75760405162461bcd60e51b8152600401610c5d906135d9565b601054610100900460ff1615610cff5760405162461bcd60e51b815260206004820152601c60248201527f47414d4176323a2050726f76656e616e63652069732066726f7a656e000000006044820152606401610c5d565b8051610c7990600e906020840190612ee8565b6007546001600160a01b03163314610d3c5760405162461bcd60e51b8152600401610c5d906135d9565b604080516001808252818301909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081610d535790505090508181600081518110610d9e57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001906001600160601b031690816001600160601b0316815250508281600081518110610de457634e487b7160e01b600052603260045260246000fd5b60209081029190910101516001600160a01b039091169052610e0684826123d8565b50505050565b6000546001600160801b03600160801b82048116918116919091031690565b610c2e838383612586565b6000828152600860209081526040808320805482518185028101850190935280835284938493929190849084015b82821015610eb357600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610e64565b505050509050600081511115610f485780600081518110610ee457634e487b7160e01b600052603260045260246000fd5b60200260200101516000015161271082600081518110610f1457634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160601b031686610f3491906136a8565b610f3e9190613694565b9250925050610f51565b60008092509250505b9250929050565b6000610f6383611442565b8210610f82576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561104e57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290610ffa5750611046565b80516001600160a01b03161561100f57805192505b876001600160a01b0316836001600160a01b03161415611044578684141561103d57509350610ac992505050565b6001909301925b505b600101610f93565b50600080fd5b6007546001600160a01b0316331461107e5760405162461bcd60e51b8152600401610c5d906135d9565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314806110c357506015546001600160a01b031633145b6110fe5760405162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b6044820152606401610c5d565b600081611116576007546001600160a01b0316611123565b6015546001600160a01b03165b90506000816001600160a01b03168460405160006040518083038185875af1925050503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b5050905080610e0657600080fd5b610c2e838383604051806020016040528060008152506118ea565b6007546001600160a01b031633146111ca5760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff16156111ed5760405162461bcd60e51b8152600401610c5d906135a2565b6111f6816127a3565b6040518181527fc76077ece30e116ac83a5164a858697a39e017125e2b39902d2aebb358d49ff6906020015b60405180910390a150565b6007546001600160a01b031633146112575760405162461bcd60e51b8152600401610c5d906135d9565b6001600160a01b0382166112b95760405162461bcd60e51b8152602060048201526024808201527f47414d4176323a2043616e6e6f74206d696e7420746f207a65726f206164647260448201526332b9b99760e11b6064820152608401610c5d565b600a54816112c5610e0c565b6112cf9190613657565b1061131c5760405162461bcd60e51b815260206004820181905260248201527f47414d4176323a204d696e74696e6720776f756c6420657863656564206361706044820152606401610c5d565b6113268282612946565b7f933b70097c417841107292c83f583c8be5ceecdf29042164ea5339aabc15374761134f610e0c565b60408051918252602082018490526001600160a01b038516908201526060015b60405180910390a15050565b6000610ac982612348565b600080546001600160801b031681805b8281101561141657600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061140d57858314156114065750949350505050565b6001909201915b50600101611396565b506040516329c8c00760e21b815260040160405180910390fd5b600061143b82612960565b5192915050565b60006001600160a01b03821661146b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b6007546001600160a01b031633146114ba5760405162461bcd60e51b8152600401610c5d906135d9565b6114c46000612a82565b565b6007546001600160a01b031633146114f05760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff16156115135760405162461bcd60e51b8152600401610c5d906135a2565b60008281526011602090815260409091208251610c2e92840190612ee8565b6060600061153f83611442565b9050806115605760408051600080825260208201909252905b509392505050565b6000816001600160401b0381111561158857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156115b1578160200160208202803683370190505b50905060005b82811015611558576115c98582610f58565b8282815181106115e957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806115fe8161373f565b9150506115b7565b50919050565b6007546001600160a01b031633146116365760405162461bcd60e51b8152600401610c5d906135d9565b6010546301000000900460ff16156116855760405162461bcd60e51b815260206004820152601260248201527139b0b6329030b63932b0b23c903132b3bab760711b6044820152606401610c5d565b600f55565b600860205281600052604060002081815481106116a657600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b606060028054610ade9061370a565b6007546001600160a01b0316331461170c5760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff161561172f5760405162461bcd60e51b8152600401610c5d906135a2565b8051611742906014906020840190612ee8565b507fafa35f42f46f5052816d7c6a2e9406eca98294b20726677862d83b4a7418d8d560146040516112229190613521565b6001600160a01b03821633141561179d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146118335760405162461bcd60e51b8152600401610c5d906135d9565b600f54600a5461184391906136c7565b61184e6002436136c7565b403360601b61185b610e0c565b60405161188d939291906020019283526bffffffffffffffffffffffff19919091166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c6118b0919061377e565b600d8190556040519081527ffb0b2459ef0b436ea50d577db242217edfa1e86a7404361aaae9b6bb406b7e2f9060200160405180910390a1565b6118f5848484612586565b61190184848484612ad4565b610e06576040516368d2bf6b60e11b815260040160405180910390fd5b600e805461192b9061370a565b80601f01602080910402602001604051908101604052809291908181526020018280546119579061370a565b80156119a45780601f10611979576101008083540402835291602001916119a4565b820191906000526020600020905b81548152906001019060200180831161198757829003601f168201915b505050505081565b60105460609060ff161580156119d057506000601380546119cc9061370a565b9050115b15611a6757601380546119e29061370a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0e9061370a565b8015611a5b5780601f10611a3057610100808354040283529160200191611a5b565b820191906000526020600020905b815481529060010190602001808311611a3e57829003601f168201915b50505050509050919050565b611a7082612348565b611a8d57604051630a14c4b560e41b815260040160405180910390fd5b600f5482908110611adb57600f54600a54611aa99082906136c7565b600f5483600d54611aba9190613657565b611ac491906136c7565b611ace919061377e565b611ad89190613657565b90505b60008381526011602052604090208054611af49061370a565b15159050611b595760148054611b099061370a565b15159050611b265760405180602001604052806000815250611b52565b6014611b3182612be3565b604051602001611b429291906133fa565b6040516020818303038152906040525b9392505050565b60008381526011602052604090208054611b729061370a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9e9061370a565b8015611beb5780601f10611bc057610100808354040283529160200191611beb565b820191906000526020600020905b815481529060010190602001808311611bce57829003601f168201915b5050505050915050919050565b606060086000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611c7c57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611c2d565b505050509050919050565b6007546001600160a01b03163314611cb15760405162461bcd60e51b8152600401610c5d906135d9565b8051610c79906012906020840190612ee8565b6007546001600160a01b03163314611cee5760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff1615611d115760405162461bcd60e51b8152600401610c5d906135a2565b6010805460ff19166001179055565b60105462010000900460ff16611d785760405162461bcd60e51b815260206004820152601a60248201527f47414d4176323a2053616c65206973206e6f74206163746976650000000000006044820152606401610c5d565b600a5481611d84610e0c565b611d8e9190613657565b10611de55760405162461bcd60e51b815260206004820152602160248201527f47414d4176323a20507572636861736520776f756c64206578636565642063616044820152600760fc1b6064820152608401610c5d565b600c54811115611e435760405162461bcd60e51b815260206004820152602360248201527f47414d4176323a20416d6f756e742065786365656473206d617820706572206d6044820152621a5b9d60ea1b6064820152608401610c5d565b3481600b54611e5291906136a8565b1115611eb05760405162461bcd60e51b815260206004820152602760248201527f47414d4176323a2045746865722076616c75652073656e74206973206e6f742060448201526618dbdc9c9958dd60ca1b6064820152608401610c5d565b6000600b5482611ec091906136a8565b611eca90346136c7565b90508015611f0157604051339082156108fc029083906000818181858888f19350505050158015611eff573d6000803e3d6000fd5b505b611f0b3383612946565b7f7b3a422906a2e80ba6a4c0a65741e7b971c42518a27bd44cc1867ee591feea41611f34610e0c565b6040805191825260208201859052339082015260600161136f565b6007546001600160a01b03163314611f795760405162461bcd60e51b8152600401610c5d906135d9565b60105462010000900460ff1680611f915750600f5415155b6120035760405162461bcd60e51b815260206004820152603a60248201527f63616e6e6f742073746172742073616c6520756e74696c2061697264726f702060448201527f697320636f6d706c65746520616e64206f6666736574207365740000000000006064820152608401610c5d565b6010805460ff62010000808304821615810262ff0000199093169290921792839055910416801561203e57506010546301000000900460ff16155b156114c4576010805463ff00000019166301000000179055565b6007546001600160a01b031633146120825760405162461bcd60e51b8152600401610c5d906135d9565b600c55565b6007546001600160a01b031633146120b15760405162461bcd60e51b8152600401610c5d906135d9565b60105460ff16156120d45760405162461bcd60e51b8152600401610c5d906135a2565b60005b81518163ffffffff161015612134576000828263ffffffff168151811061210e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050612121816127a3565b508061212c8161375a565b9150506120d7565b507f35a335e5bf170dab75d92b3967e88de15c5d4b6e2f269e8dc56e59f47acb9f268160405161122291906134ca565b6007546001600160a01b0316331461218e5760405162461bcd60e51b8152600401610c5d906135d9565b601054610100900460ff16156121e65760405162461bcd60e51b815260206004820152601c60248201527f47414d4176323a2050726f76656e616e63652069732066726f7a656e000000006044820152606401610c5d565b6010805461ff001916610100179055565b606060128054610ade9061370a565b6013805461192b9061370a565b6007546001600160a01b0316331461223d5760405162461bcd60e51b8152600401610c5d906135d9565b6001600160a01b0381166122a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c5d565b6122ab81612a82565b50565b6007546001600160a01b031633146122d85760405162461bcd60e51b8152600401610c5d906135d9565b600b55565b60006001600160e01b031982166380ac58cd60e01b148061230e57506001600160e01b03198216635b5e139f60e01b145b8061232957506001600160e01b0319821663780e9d6360e01b145b80610ac957506301ffc9a760e01b6001600160e01b0319831614610ac9565b600080546001600160801b031682108015610ac9575050600090815260036020526040902054600160e01b900460ff161590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60005b815181101561257b5760006001600160a01b031682828151811061240f57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031614156124725760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e7400000000006044820152606401610c5d565b81818151811061249257634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160601b0316600014156124f75760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f7369746976656044820152606401610c5d565b6000838152600860205260409020825183908390811061252757634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155806125738161373f565b9150506123db565b50610c798282612d27565b600061259182612960565b80519091506000906001600160a01b0316336001600160a01b031614806125bf575081516125bf90336109ab565b806125da5750336125cf84610b61565b6001600160a01b0316145b9050806125fa57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461262f5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661265657604051633a954ecd60e21b815260040160405180910390fd5b612666600084846000015161237c565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116612759576000546001600160801b031681101561275957825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60006127ae82612960565b90506127c0600083836000015161237c565b80516001600160a01b039081166000908152600460209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260039094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b19169390931790559085018083529120549091166128e0576000546001600160801b03168110156128e057815160008281526003602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506000805460016001600160801b03600160801b80840482169290920181169091029116179055565b610c79828260405180602001604052806000815250612d58565b60408051606081018252600080825260208201819052918101829052905482906001600160801b0316811015612a6957600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612a675780516001600160a01b0316156129fe579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612a62579392505050565b6129fe565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15612bd757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b1890339089908890889060040161347a565b602060405180830381600087803b158015612b3257600080fd5b505af1925050508015612b62575060408051601f3d908101601f19168201909252612b5f9181019061323e565b60015b612bbd573d808015612b90576040519150601f19603f3d011682016040523d82523d6000602084013e612b95565b606091505b508051612bb5576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612bdb565b5060015b949350505050565b606081612c075750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c315780612c1b8161373f565b9150612c2a9050600a83613694565b9150612c0b565b6000816001600160401b03811115612c5957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c83576020820181803683370190505b509050815b8515612d1e57612c996001826136c7565b90506000612ca8600a88613694565b612cb390600a6136a8565b612cbd90886136c7565b612cc890603061366f565b905060008160f81b905080848481518110612cf357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612d15600a89613694565b97505050612c88565b50949350505050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df828260405161136f92919061360e565b610c2e83838360016000546001600160801b03166001600160a01b038516612d9257604051622e076360e81b815260040160405180910390fd5b83612db05760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612ec25760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612e985750612e966000888488612ad4565b155b15612eb6576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612e41565b50600080546001600160801b0319166001600160801b039290921691909117905561279c565b828054612ef49061370a565b90600052602060002090601f016020900481019282612f165760008555612f5c565b82601f10612f2f57805160ff1916838001178555612f5c565b82800160010185558215612f5c579182015b82811115612f5c578251825591602001919060010190612f41565b50612f68929150612f6c565b5090565b5b80821115612f685760008155600101612f6d565b60006001600160401b03831115612f9a57612f9a6137be565b612fad601f8401601f1916602001613627565b9050828152838383011115612fc157600080fd5b828260208301376000602084830101529392505050565b80358015158114612fe857600080fd5b919050565b600082601f830112612ffd578081fd5b611b5283833560208501612f81565b60006020828403121561301d578081fd5b8135611b52816137d4565b6000806040838503121561303a578081fd5b8235613045816137d4565b91506020830135613055816137d4565b809150509250929050565b600080600060608486031215613074578081fd5b833561307f816137d4565b9250602084013561308f816137d4565b929592945050506040919091013590565b600080600080608085870312156130b5578081fd5b84356130c0816137d4565b935060208501356130d0816137d4565b92506040850135915060608501356001600160401b038111156130f1578182fd5b8501601f81018713613101578182fd5b61311087823560208401612f81565b91505092959194509250565b6000806040838503121561312e578182fd5b8235613139816137d4565b915061314760208401612fd8565b90509250929050565b60008060408385031215613162578182fd5b823561316d816137d4565b946020939093013593505050565b6000602080838503121561318d578182fd5b82356001600160401b03808211156131a3578384fd5b818501915085601f8301126131b6578384fd5b8135818111156131c8576131c86137be565b8060051b91506131d9848301613627565b8181528481019084860184860187018a10156131f3578788fd5b8795505b838610156132155780358352600195909501949186019186016131f7565b5098975050505050505050565b600060208284031215613233578081fd5b8135611b52816137e9565b60006020828403121561324f578081fd5b8151611b52816137e9565b60006020828403121561326b578081fd5b81356001600160401b03811115613280578182fd5b612bdb84828501612fed565b60006020828403121561329d578081fd5b5035919050565b6000806000606084860312156132b8578081fd5b8335925060208401356132ca816137d4565b915060408401356001600160601b03811681146132e5578182fd5b809150509250925092565b60008060408385031215613302578182fd5b8235915061314760208401612fd8565b60008060408385031215613324578182fd5b8235915060208301356001600160401b03811115613340578182fd5b61334c85828601612fed565b9150509250929050565b60008060408385031215613368578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156133c357815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161338a565b509495945050505050565b600081518084526133e68160208601602086016136de565b601f01601f19169290920160200192915050565b60008084546134088161370a565b6001828116801561342057600181146134315761345d565b60ff1984168752828701945061345d565b8886526020808720875b858110156134545781548a82015290840190820161343b565b50505082870194505b5050505083516134718183602088016136de565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134ad908301846133ce565b9695505050505050565b602081526000611b526020830184613377565b6020808252825182820181905260009190848201906040850190845b81811015613502578351835292840192918401916001016134e6565b50909695505050505050565b602081526000611b5260208301846133ce565b600060208083528184546135348161370a565b80848701526040600180841660008114613555576001811461356957613594565b60ff19851689840152606089019550613594565b898852868820885b8581101561358c5781548b8201860152908301908801613571565b8a0184019650505b509398975050505050505050565b6020808252601a908201527f47414d4176323a204d657461646174612069732066726f7a656e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b828152604060208201526000612bdb6040830184613377565b604051601f8201601f191681016001600160401b038111828210171561364f5761364f6137be565b604052919050565b6000821982111561366a5761366a613792565b500190565b600060ff821660ff84168060ff0382111561368c5761368c613792565b019392505050565b6000826136a3576136a36137a8565b500490565b60008160001904831182151516156136c2576136c2613792565b500290565b6000828210156136d9576136d9613792565b500390565b60005b838110156136f95781810151838201526020016136e1565b83811115610e065750506000910152565b600181811c9082168061371e57607f821691505b6020821081141561160657634e487b7160e01b600052602260045260246000fd5b600060001982141561375357613753613792565b5060010190565b600063ffffffff8083168181141561377457613774613792565b6001019392505050565b60008261378d5761378d6137a8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146122ab57600080fd5b6001600160e01b0319811681146122ab57600080fdfea26469706673582212202c2dc6c5a3b839e7cc89809ff8f371e193710d2f45818cc290833072376d623764736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d657a6f3577444b7a376b487741505255534a62793936726e43667668716756714444375a6f727839727179380000000000000000000000

-----Decoded View---------------
Arg [0] : _saleIsActive (bool): False
Arg [1] : _metadataFrozen (bool): False
Arg [2] : _provenanceFrozen (bool): False
Arg [3] : _maxGamaTokens (uint256): 10000
Arg [4] : _mintPrice (uint256): 100000000000000000
Arg [5] : _maxPerMint (uint256): 10
Arg [6] : _baseUri (string):
Arg [7] : contractUri_ (string): ipfs://Qmezo5wDKz7kHwAPRUSJby96rnCfvhqgVqDD7Zorx9rqy8

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [4] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [10] : 697066733a2f2f516d657a6f3577444b7a376b487741505255534a6279393672
Arg [11] : 6e43667668716756714444375a6f727839727179380000000000000000000000


Deployed Bytecode Sourcemap

49033:9879:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52606:356;;;;;;;;;;-1:-1:-1;52606:356:0;;;;;:::i;:::-;;:::i;:::-;;;11834:14:1;;11827:22;11809:41;;11797:2;11782:18;52606:356:0;;;;;;;;29938:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31441:204::-;;;;;;;;;;-1:-1:-1;31441:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9573:32:1;;;9555:51;;9543:2;9528:18;31441:204:0;9510:102:1;31004:371:0;;;;;;;;;;-1:-1:-1;31004:371:0;;;;;:::i;:::-;;:::i;:::-;;51418:108;;;;;;;;;;-1:-1:-1;51418:108:0;;;;;:::i;:::-;;:::i;55205:152::-;;;;;;;;;;-1:-1:-1;55205:152:0;;;;;:::i;:::-;;:::i;57503:372::-;;;;;;;;;;-1:-1:-1;57503:372:0;;;;;:::i;:::-;;:::i;49361:28::-;;;;;;;;;;-1:-1:-1;49361:28:0;;;;;;;;;;;24565:280;;;;;;;;;;;;;:::i;:::-;;;18821:25:1;;;18809:2;18794:18;24565:280:0;18776:76:1;32298:170:0;;;;;;;;;;-1:-1:-1;32298:170:0;;;;;:::i;:::-;;:::i;57883:370::-;;;;;;;;;;-1:-1:-1;57883:370:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10628:32:1;;;10610:51;;10692:2;10677:18;;10670:34;;;;10583:18;57883:370:0;10565:145:1;26151:1105:0;;;;;;;;;;-1:-1:-1;26151:1105:0;;;;;:::i;:::-;;:::i;57389:106::-;;;;;;;;;;-1:-1:-1;57389:106:0;;;;;:::i;:::-;;:::i;56317:339::-;;;;;;;;;;-1:-1:-1;56317:339:0;;;;;:::i;:::-;;:::i;49219:25::-;;;;;;;;;;;;;;;;32539:185;;;;;;;;;;-1:-1:-1;32539:185:0;;;;;:::i;:::-;;:::i;54034:133::-;;;;;;;;;;-1:-1:-1;54034:133:0;;;;;:::i;:::-;;:::i;55926:383::-;;;;;;;;;;-1:-1:-1;55926:383:0;;;;;:::i;:::-;;:::i;53057:104::-;;;;;;;;;;-1:-1:-1;53057:104:0;;;;;:::i;:::-;;:::i;25138:713::-;;;;;;;;;;-1:-1:-1;25138:713:0;;;;;:::i;:::-;;:::i;49187:25::-;;;;;;;;;;;;;;;;49427:23;;;;;;;;;;-1:-1:-1;49427:23:0;;;;;;;;;;;29747:124;;;;;;;;;;-1:-1:-1;29747:124:0;;;;;:::i;:::-;;:::i;49156:24::-;;;;;;;;;;;;;;;;27764:206;;;;;;;;;;-1:-1:-1;27764:206:0;;;;;:::i;:::-;;:::i;45501:103::-;;;;;;;;;;;;;:::i;56664:131::-;;;;;;;;;;-1:-1:-1;56664:131:0;;;;;:::i;:::-;;:::i;58431:478::-;;;;;;;;;;-1:-1:-1;58431:478:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55365:164::-;;;;;;;;;;-1:-1:-1;55365:164:0;;;;;:::i;:::-;;:::i;46919:52::-;;;;;;;;;;-1:-1:-1;46919:52:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9823:32:1;;;9805:51;;-1:-1:-1;;;;;9892:39:1;;;9887:2;9872:18;;9865:67;9778:18;46919:52:0;9760:178:1;44850:87:0;;;;;;;;;;-1:-1:-1;44923:6:0;;-1:-1:-1;;;;;44923:6:0;44850:87;;30107:104;;;;;;;;;;;;;:::i;55761:157::-;;;;;;;;;;-1:-1:-1;55761:157:0;;;;;:::i;:::-;;:::i;31717:279::-;;;;;;;;;;-1:-1:-1;31717:279:0;;;;;:::i;:::-;;:::i;52231:259::-;;;;;;;;;;;;;:::i;32795:342::-;;;;;;;;;;-1:-1:-1;32795:342:0;;;;;:::i;:::-;;:::i;49293:26::-;;;;;;;;;;;;;;;;49253:33;;;;;;;;;;;;;:::i;51534:689::-;;;;;;;;;;-1:-1:-1;51534:689:0;;;;;:::i;:::-;;:::i;48313:137::-;;;;;;;;;;-1:-1:-1;48313:137:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55096:101::-;;;;;;;;;;-1:-1:-1;55096:101:0;;;;;:::i;:::-;;:::i;54550:107::-;;;;;;;;;;;;;:::i;53436:590::-;;;;;;:::i;:::-;;:::i;49121:28::-;;;;;;;;;;;;;;;;54786:302;;;;;;;;;;;;;:::i;55537:106::-;;;;;;;;;;-1:-1:-1;55537:106:0;;;;;:::i;:::-;;:::i;54175:254::-;;;;;;;;;;-1:-1:-1;54175:254:0;;;;;:::i;:::-;;:::i;54665:113::-;;;;;;;;;;;;;:::i;53227:97::-;;;;;;;;;;;;;:::i;49549:31::-;;;;;;;;;;;;;:::i;32067:164::-;;;;;;;;;;-1:-1:-1;32067:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32188:25:0;;;32164:4;32188:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32067:164;49396:24;;;;;;;;;;-1:-1:-1;49396:24:0;;;;;;;;;;;45759:201;;;;;;;;;;-1:-1:-1;45759:201:0;;;;;:::i;:::-;;:::i;55651:102::-;;;;;;;;;;-1:-1:-1;55651:102:0;;;;;:::i;:::-;;:::i;49328:26::-;;;;;;;;;;-1:-1:-1;49328:26:0;;;;;;;;52606:356;52683:4;-1:-1:-1;;;;;;52707:33:0;;-1:-1:-1;;;52707:33:0;;:81;;-1:-1:-1;;;;;;;52753:35:0;;-1:-1:-1;;;52753:35:0;52707:81;:147;;;-1:-1:-1;;;;;;;52801:53:0;;-1:-1:-1;;;52801:53:0;52707:147;:196;;;-1:-1:-1;;;;;;;52867:36:0;;-1:-1:-1;;;52867:36:0;52707:196;:247;;;;52916:38;52942:11;52916:25;:38::i;:::-;52700:254;52606:356;-1:-1:-1;;52606:356:0:o;29938:100::-;29992:13;30025:5;30018:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29938:100;:::o;31441:204::-;31509:7;31534:16;31542:7;31534;:16::i;:::-;31529:64;;31559:34;;-1:-1:-1;;;31559:34:0;;;;;;;;;;;31529:64;-1:-1:-1;31613:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31613:24:0;;31441:204::o;31004:371::-;31077:13;31093:24;31109:7;31093:15;:24::i;:::-;31077:40;;31138:5;-1:-1:-1;;;;;31132:11:0;:2;-1:-1:-1;;;;;31132:11:0;;31128:48;;;31152:24;;-1:-1:-1;;;31152:24:0;;;;;;;;;;;31128:48;17959:10;-1:-1:-1;;;;;31193:21:0;;;;;;:63;;-1:-1:-1;31219:37:0;31236:5;17959:10;32067:164;:::i;31219:37::-;31218:38;31193:63;31189:138;;;31280:35;;-1:-1:-1;;;31280:35:0;;;;;;;;;;;31189:138;31339:28;31348:2;31352:7;31361:5;31339:8;:28::i;:::-;31004:371;;;:::o;51418:108::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;;;;;;;;;51495:23;;::::1;::::0;:17:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51418:108:::0;:::o;55205:152::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;51144:16:::1;::::0;::::1;::::0;::::1;;;51143:17;51135:58;;;::::0;-1:-1:-1;;;51135:58:0;;18164:2:1;51135:58:0::1;::::0;::::1;18146:21:1::0;18203:2;18183:18;;;18176:30;18242;18222:18;;;18215:58;18290:18;;51135:58:0::1;18136:178:1::0;51135:58:0::1;55317:32:::0;;::::2;::::0;:14:::2;::::0;:32:::2;::::0;::::2;::::0;::::2;:::i;57503:372::-:0;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;57682:21:::1;::::0;;57701:1:::1;57682:21:::0;;;;;::::1;::::0;;;57647:32:::1;::::0;57682:21:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;57682:21:0::1;;;;;;;;;;;;;;;57647:56;;57736:22;57714:10;57725:1;57714:13;;;;;;-1:-1:-1::0;;;57714:13:0::1;;;;;;;;;;;;;;;:19;;:44;-1:-1:-1::0;;;;;57714:44:0::1;;;-1:-1:-1::0;;;;;57714:44:0::1;;;::::0;::::1;57793:27;57769:10;57780:1;57769:13;;;;;;-1:-1:-1::0;;;57769:13:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;57769:51:0;;::::1;::::0;;57831:36:::1;57846:8:::0;57856:10;57831:14:::1;:36::i;:::-;45141:1;57503:372:::0;;;:::o;24565:280::-;24618:7;24810:12;-1:-1:-1;;;;;;;;24810:12:0;;;;24794:13;;;:28;;;;24787:35;;24565:280::o;32298:170::-;32432:28;32442:4;32448:2;32452:7;32432:9;:28::i;57883:370::-;57966:16;58053:19;;;:9;:19;;;;;;;;58018:54;;;;;;;;;;;;;;;;;57966:16;;;;58018:54;58053:19;58018:54;57966:16;;58018:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58018:54:0;;;;-1:-1:-1;;;58018:54:0;;-1:-1:-1;;;;;58018:54:0;;;;;;;;;;;;;;;;;;;;;;58107:1;58087:10;:17;:21;58083:128;;;58133:10;58144:1;58133:13;;;;;;-1:-1:-1;;;58133:13:0;;;;;;;;;;;;;;;:21;;;58193:5;58170:10;58181:1;58170:13;;;;;;-1:-1:-1;;;58170:13:0;;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;;;58157:32:0;:10;:32;;;;:::i;:::-;58156:42;;;;:::i;:::-;58125:74;;;;;;;58083:128;58237:1;58241;58221:22;;;;;57883:370;;;;;;:::o;26151:1105::-;26240:7;26273:16;26283:5;26273:9;:16::i;:::-;26264:5;:25;26260:61;;26298:23;;-1:-1:-1;;;26298:23:0;;;;;;;;;;;26260:61;26332:22;26357:13;;-1:-1:-1;;;;;26357:13:0;;26332:22;;26607:557;26627:14;26623:1;:18;26607:557;;;26667:31;26701:14;;;:11;:14;;;;;;;;;26667:48;;;;;;;;;-1:-1:-1;;;;;26667:48:0;;;;-1:-1:-1;;;26667:48:0;;-1:-1:-1;;;;;26667:48:0;;;;;;;;-1:-1:-1;;;26667:48:0;;;;;;;;;;;;;;;;26734:73;;26779:8;;;26734:73;26829:14;;-1:-1:-1;;;;;26829:28:0;;26825:111;;26902:14;;;-1:-1:-1;26825:111:0;26979:5;-1:-1:-1;;;;;26958:26:0;:17;-1:-1:-1;;;;;26958:26:0;;26954:195;;;27028:5;27013:11;:20;27009:85;;;-1:-1:-1;27069:1:0;-1:-1:-1;27062:8:0;;-1:-1:-1;;;27062:8:0;27009:85;27116:13;;;;;26954:195;26607:557;;26643:3;;26607:557;;;;27240:8;;;57389:106;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;57463:14:::1;:24:::0;;-1:-1:-1;;;;;;57463:24:0::1;-1:-1:-1::0;;;;;57463:24:0;;;::::1;::::0;;;::::1;::::0;;57389:106::o;56317:339::-;44923:6;;-1:-1:-1;;;;;44923:6:0;56407:10;:29;;:61;;-1:-1:-1;56454:14:0;;-1:-1:-1;;;;;56454:14:0;56440:10;:28;56407:61;56399:86;;;;-1:-1:-1;;;56399:86:0;;17107:2:1;56399:86:0;;;17089:21:1;17146:2;17126:18;;;17119:30;-1:-1:-1;;;17165:18:1;;;17158:42;17217:18;;56399:86:0;17079:162:1;56399:86:0;56496:9;56508:23;:58;;44923:6;;-1:-1:-1;;;;;44923:6:0;56508:58;;;56534:14;;-1:-1:-1;;;;;56534:14:0;56508:58;56496:70;;56578:12;56595:1;-1:-1:-1;;;;;56595:6:0;56610;56595:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56577:44;;;56640:7;56632:16;;;;;32539:185;32677:39;32694:4;32700:2;32704:7;32677:39;;;;;;;;;;;;:16;:39::i;54034:133::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;51018:14:::1;::::0;::::1;;51017:15;51009:54;;;;-1:-1:-1::0;;;51009:54:0::1;;;;;;;:::i;:::-;54114:17:::2;54128:2;54114:13;:17::i;:::-;54147:12;::::0;18821:25:1;;;54147:12:0::2;::::0;18809:2:1;18794:18;54147:12:0::2;;;;;;;;54034:133:::0;:::o;55926:383::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56028:17:0;::::1;56020:66;;;::::0;-1:-1:-1;;;56020:66:0;;13577:2:1;56020:66:0::1;::::0;::::1;13559:21:1::0;13616:2;13596:18;;;13589:30;13655:34;13635:18;;;13628:62;-1:-1:-1;;;13706:18:1;;;13699:34;13750:19;;56020:66:0::1;13549:226:1::0;56020:66:0::1;56139:13;;56121:15;56105:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:47;56097:92;;;::::0;-1:-1:-1;;;56097:92:0;;16746:2:1;56097:92:0::1;::::0;::::1;16728:21:1::0;;;16765:18;;;16758:30;16824:34;16804:18;;;16797:62;16876:18;;56097:92:0::1;16718:182:1::0;56097:92:0::1;56200:31;56210:3;56215:15;56200:9;:31::i;:::-;56247:54;56265:13;:11;:13::i;:::-;56247:54;::::0;;19444:25:1;;;19500:2;19485:18;;19478:34;;;-1:-1:-1;;;;;19548:32:1;;19528:18;;;19521:60;19432:2;19417:18;56247:54:0::1;;;;;;;;55926:383:::0;;:::o;53057:104::-;53112:4;53136:17;53144:8;53136:7;:17::i;25138:713::-;25205:7;25250:13;;-1:-1:-1;;;;;25250:13:0;25205:7;;25464:328;25484:14;25480:1;:18;25464:328;;;25524:31;25558:14;;;:11;:14;;;;;;;;;25524:48;;;;;;;;;-1:-1:-1;;;;;25524:48:0;;;;-1:-1:-1;;;25524:48:0;;-1:-1:-1;;;;;25524:48:0;;;;;;;;-1:-1:-1;;;25524:48:0;;;;;;;;;;;;;;25591:186;;25656:5;25641:11;:20;25637:85;;;-1:-1:-1;25697:1:0;25138:713;-1:-1:-1;;;;25138:713:0:o;25637:85::-;25744:13;;;;;25591:186;-1:-1:-1;25500:3:0;;25464:328;;;;25820:23;;-1:-1:-1;;;25820:23:0;;;;;;;;;;;29747:124;29811:7;29838:20;29850:7;29838:11;:20::i;:::-;:25;;29747:124;-1:-1:-1;;29747:124:0:o;27764:206::-;27828:7;-1:-1:-1;;;;;27852:19:0;;27848:60;;27880:28;;-1:-1:-1;;;27880:28:0;;;;;;;;;;;27848:60;-1:-1:-1;;;;;;27934:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27934:27:0;;27764:206::o;45501:103::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;45566:30:::1;45593:1;45566:18;:30::i;:::-;45501:103::o:0;56664:131::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;51018:14:::1;::::0;::::1;;51017:15;51009:54;;;;-1:-1:-1::0;;;51009:54:0::1;;;;;;;:::i;:::-;56764:16:::2;::::0;;;:12:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;::::2;::::0;::::2;:::i;58431:478::-:0;58493:16;58522:18;58543:17;58553:6;58543:9;:17::i;:::-;58522:38;-1:-1:-1;58575:15:0;58571:331;;58614:16;;;58628:1;58614:16;;;;;;;;;;;-1:-1:-1;58607:23:0;58431:478;-1:-1:-1;;;58431:478:0:o;58571:331::-;58663:23;58703:10;-1:-1:-1;;;;;58689:25:0;;;;;-1:-1:-1;;;58689:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58689:25:0;;58663:51;;58734:13;58729:134;58757:10;58749:5;:18;58729:134;;;58813:34;58833:6;58841:5;58813:19;:34::i;:::-;58797:6;58804:5;58797:13;;;;;;-1:-1:-1;;;58797:13:0;;;;;;;;;;;;;;;;;;:50;58769:7;;;;:::i;:::-;;;;58729:134;;58571:331;58431:478;;;;:::o;55365:164::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;55450:11:::1;::::0;;;::::1;;;55449:12;55441:43;;;::::0;-1:-1:-1;;;55441:43:0;;13230:2:1;55441:43:0::1;::::0;::::1;13212:21:1::0;13269:2;13249:18;;;13242:30;-1:-1:-1;;;13288:18:1;;;13281:48;13346:18;;55441:43:0::1;13202:168:1::0;55441:43:0::1;55495:11;:26:::0;55365:164::o;46919:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46919:52:0;;;-1:-1:-1;;;;46919:52:0;;-1:-1:-1;;;;;46919:52:0;;-1:-1:-1;46919:52:0;:::o;30107:104::-;30163:13;30196:7;30189:14;;;;;:::i;55761:157::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;51018:14:::1;::::0;::::1;;51017:15;51009:54;;;;-1:-1:-1::0;;;51009:54:0::1;;;;;;;:::i;:::-;55857:18:::0;;::::2;::::0;:7:::2;::::0;:18:::2;::::0;::::2;::::0;::::2;:::i;:::-;;55891:19;55902:7;55891:19;;;;;;:::i;31717:279::-:0;-1:-1:-1;;;;;31808:24:0;;17959:10;31808:24;31804:54;;;31841:17;;-1:-1:-1;;;31841:17:0;;;;;;;;;;;31804:54;17959:10;31871:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31871:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31871:53:0;;;;;;;;;;31940:48;;11809:41:1;;;31871:42:0;;17959:10;31940:48;;11782:18:1;31940:48:0;;;;;;;31717:279;;:::o;52231:259::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;52429:11:::1;;52413:13;;:27;;;;:::i;:::-;52344:16;52359:1;52344:12;:16;:::i;:::-;52334:27;52371:10;52363:19;;52392:13;:11;:13::i;:::-;52317:90;::::0;::::1;::::0;;;52384:22;52317:90:::1;;8038:19:1::0;;;-1:-1:-1;;8087:44:1;;;;8082:2;8073:12;;8066:66;8157:2;8148:12;;8141:28;8194:2;8185:12;;8028:175;52317:90:0::1;;;;;;;;;;;;;52307:101;;;;;;52299:110;;:142;;;;:::i;:::-;52286:10;:155:::0;;;52457:25:::1;::::0;18821::1;;;52457::0::1;::::0;18809:2:1;18794:18;52457:25:0::1;;;;;;;52231:259::o:0;32795:342::-;32962:28;32972:4;32978:2;32982:7;32962:9;:28::i;:::-;33006:48;33029:4;33035:2;33039:7;33048:5;33006:22;:48::i;:::-;33001:129;;33078:40;;-1:-1:-1;;;33078:40:0;;;;;;;;;;;49253:33;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51534:689::-;51647:14;;51616:13;;51647:14;;51646:15;:54;;;;;51699:1;51671:17;51665:31;;;;;:::i;:::-;;;:35;51646:54;51642:111;;;51724:17;51717:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51534:689;;;:::o;51642:111::-;51768:16;51776:7;51768;:16::i;:::-;51763:59;;51793:29;;-1:-1:-1;;;51793:29:0;;;;;;;;;;;51763:59;51876:11;;51847:7;;51869:18;;51865:138;;51979:11;;51947:13;;:27;;51979:11;;51947:27;:::i;:::-;51931:11;;51925:3;51912:10;;:16;;;;:::i;:::-;:30;;;;:::i;:::-;51911:64;;;;:::i;:::-;51910:80;;;;:::i;:::-;51904:86;;51865:138;52025:21;;;;:12;:21;;;;;52019:35;;;;;:::i;:::-;:40;52015:162;;-1:-1:-1;52015:162:0;;52089:7;52083:21;;;;;:::i;:::-;:26;;;-1:-1:-1;52083:82:0;;;;;;;;;;;;;;;;;52136:7;52145:13;52154:3;52145:8;:13::i;:::-;52119:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52083:82;52076:89;51534:689;-1:-1:-1;;;51534:689:0:o;52015:162::-;52194:21;;;;:12;:21;;;;;52187:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51534:689;;;:::o;48313:137::-;48388:21;48429:9;:13;48439:2;48429:13;;;;;;;;;;;48422:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48422:20:0;;;;-1:-1:-1;;;48422:20:0;;-1:-1:-1;;;;;48422:20:0;;;;;;;;;;;;;;;;;;;;;;48313:137;;;:::o;55096:101::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;55170:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;54550:107::-:0;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;51018:14:::1;::::0;::::1;;51017:15;51009:54;;;;-1:-1:-1::0;;;51009:54:0::1;;;;;;;:::i;:::-;54628:14:::2;:21:::0;;-1:-1:-1;;54628:21:0::2;54645:4;54628:21;::::0;;54550:107::o;53436:590::-;50896:12;;;;;;;50888:51;;;;-1:-1:-1;;;50888:51:0;;17809:2:1;50888:51:0;;;17791:21:1;17848:2;17828:18;;;17821:30;17887:28;17867:18;;;17860:56;17933:18;;50888:51:0;17781:176:1;50888:51:0;53546:13:::1;;53537:6;53521:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:38;53513:84;;;::::0;-1:-1:-1;;;53513:84:0;;14389:2:1;53513:84:0::1;::::0;::::1;14371:21:1::0;14428:2;14408:18;;;14401:30;14467:34;14447:18;;;14440:62;-1:-1:-1;;;14518:18:1;;;14511:31;14559:19;;53513:84:0::1;14361:223:1::0;53513:84:0::1;53626:10;;53616:6;:20;;53608:68;;;::::0;-1:-1:-1;;;53608:68:0;;15987:2:1;53608:68:0::1;::::0;::::1;15969:21:1::0;16026:2;16006:18;;;15999:30;16065:34;16045:18;;;16038:62;-1:-1:-1;;;16116:18:1;;;16109:33;16159:19;;53608:68:0::1;15959:225:1::0;53608:68:0::1;53717:9;53707:6;53695:9;;:18;;;;:::i;:::-;:31;;53687:83;;;::::0;-1:-1:-1;;;53687:83:0;;15218:2:1;53687:83:0::1;::::0;::::1;15200:21:1::0;15257:2;15237:18;;;15230:30;15296:34;15276:18;;;15269:62;-1:-1:-1;;;15347:18:1;;;15340:37;15394:19;;53687:83:0::1;15190:229:1::0;53687:83:0::1;53781:14;53820:9;;53811:6;:18;;;;:::i;:::-;53798:32;::::0;:9:::1;:32;:::i;:::-;53781:49:::0;-1:-1:-1;53845:10:0;;53841:79:::1;;53872:36;::::0;53880:10:::1;::::0;53872:36;::::1;;;::::0;53901:6;;53872:36:::1;::::0;;;53901:6;53880:10;53872:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53841:79;53930:29;53940:10;53952:6;53930:9;:29::i;:::-;53975:43;53984:13;:11;:13::i;:::-;53975:43;::::0;;19444:25:1;;;19500:2;19485:18;;19478:34;;;54007:10:0::1;19528:18:1::0;;;19521:60;19432:2;19417:18;53975:43:0::1;19399:188:1::0;54786:302:0;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;54853:12:::1;::::0;;;::::1;;;::::0;:34:::1;;-1:-1:-1::0;54870:11:0::1;::::0;:16;::::1;54853:34;54843:108;;;::::0;-1:-1:-1;;;54843:108:0;;14791:2:1;54843:108:0::1;::::0;::::1;14773:21:1::0;14830:2;14810:18;;;14803:30;14869:34;14849:18;;;14842:62;14940:28;14920:18;;;14913:56;14986:19;;54843:108:0::1;14763:248:1::0;54843:108:0::1;54979:12;::::0;;::::1;::::0;;;::::1;::::0;::::1;54978:13;54963:28:::0;::::1;-1:-1:-1::0;;54963:28:0;;::::1;::::0;;;::::1;::::0;;;;55006:12;::::1;;:28:::0;::::1;;;-1:-1:-1::0;55023:11:0::1;::::0;;;::::1;;;55022:12;55006:28;55002:79;;;55051:11;:18:::0;;-1:-1:-1;;55051:18:0::1;::::0;::::1;::::0;;54786:302::o;55537:106::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;55611:10:::1;:24:::0;55537:106::o;54175:254::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;51018:14:::1;::::0;::::1;;51017:15;51009:54;;;;-1:-1:-1::0;;;51009:54:0::1;;;;;;;:::i;:::-;54275:8:::2;54270:118;54293:3;:10;54289:1;:14;;;54270:118;;;54325:10;54338:3;54342:1;54338:6;;;;;;;;-1:-1:-1::0;;;54338:6:0::2;;;;;;;;;;;;;;;54325:19;;54359:17;54373:2;54359:13;:17::i;:::-;-1:-1:-1::0;54305:3:0;::::2;::::0;::::2;:::i;:::-;;;;54270:118;;;;54403:18;54417:3;54403:18;;;;;;:::i;54665:113::-:0;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;51144:16:::1;::::0;::::1;::::0;::::1;;;51143:17;51135:58;;;::::0;-1:-1:-1;;;51135:58:0;;18164:2:1;51135:58:0::1;::::0;::::1;18146:21:1::0;18203:2;18183:18;;;18176:30;18242;18222:18;;;18215:58;18290:18;;51135:58:0::1;18136:178:1::0;51135:58:0::1;54747:16:::2;:23:::0;;-1:-1:-1;;54747:23:0::2;;;::::0;;54665:113::o;53227:97::-;53271:13;53304:12;53297:19;;;;;:::i;49549:31::-;;;;;;;:::i;45759:201::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45848:22:0;::::1;45840:73;;;::::0;-1:-1:-1;;;45840:73:0;;13982:2:1;45840:73:0::1;::::0;::::1;13964:21:1::0;14021:2;14001:18;;;13994:30;14060:34;14040:18;;;14033:62;-1:-1:-1;;;14111:18:1;;;14104:36;14157:19;;45840:73:0::1;13954:228:1::0;45840:73:0::1;45924:28;45943:8;45924:18;:28::i;:::-;45759:201:::0;:::o;55651:102::-;44923:6;;-1:-1:-1;;;;;44923:6:0;17959:10;45070:23;45062:68;;;;-1:-1:-1;;;45062:68:0;;;;;;;:::i;:::-;55723:9:::1;:22:::0;55651:102::o;27328:372::-;27430:4;-1:-1:-1;;;;;;27467:40:0;;-1:-1:-1;;;27467:40:0;;:105;;-1:-1:-1;;;;;;;27524:48:0;;-1:-1:-1;;;27524:48:0;27467:105;:172;;;-1:-1:-1;;;;;;;27589:50:0;;-1:-1:-1;;;27589:50:0;27467:172;:225;;;-1:-1:-1;;;;;;;;;;21189:40:0;;;27656:36;21080:157;33392:144;33449:4;33483:13;;-1:-1:-1;;;;;33483:13:0;33473:23;;:55;;;;-1:-1:-1;;33501:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;33501:27:0;;;;33500:28;;33392:144::o;40608:196::-;40723:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40723:29:0;-1:-1:-1;;;;;40723:29:0;;;;;;;;;40768:28;;40723:24;;40768:28;;;;;;;40608:196;;;:::o;46980:423::-;47076:6;47071:282;47092:10;:17;47088:1;:21;47071:282;;;47172:3;-1:-1:-1;;;;;47139:37:0;:10;47150:1;47139:13;;;;;;-1:-1:-1;;;47139:13:0;;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;47139:37:0;;;47131:77;;;;-1:-1:-1;;;47131:77:0;;18521:2:1;47131:77:0;;;18503:21:1;18560:2;18540:18;;;18533:30;18599:29;18579:18;;;18572:57;18646:18;;47131:77:0;18493:177:1;47131:77:0;47231:10;47242:1;47231:13;;;;;;-1:-1:-1;;;47231:13:0;;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;;;47231:24:0;47254:1;47231:24;;47223:69;;;;-1:-1:-1;;;47223:69:0;;15626:2:1;47223:69:0;;;15608:21:1;;;15645:18;;;15638:30;15704:34;15684:18;;;15677:62;15756:18;;47223:69:0;15598:182:1;47223:69:0;47307:14;;;;:9;:14;;;;;47327:13;;:10;;47338:1;;47327:13;;;;-1:-1:-1;;;47327:13:0;;;;;;;;;;;;;;;;;;;;47307:34;;;;;;;-1:-1:-1;47307:34:0;;;;;;;;;;;;;;-1:-1:-1;;;;;47307:34:0;-1:-1:-1;;;47307:34:0;-1:-1:-1;;;;;47307:34:0;;;;;;;47111:3;;;;:::i;:::-;;;;47071:282;;;;47363:32;47379:3;47384:10;47363:15;:32::i;36109:2112::-;36224:35;36262:20;36274:7;36262:11;:20::i;:::-;36337:18;;36224:58;;-1:-1:-1;36295:22:0;;-1:-1:-1;;;;;36321:34:0;17959:10;-1:-1:-1;;;;;36321:34:0;;:101;;;-1:-1:-1;36389:18:0;;36372:50;;17959:10;32067:164;:::i;36372:50::-;36321:154;;;-1:-1:-1;17959:10:0;36439:20;36451:7;36439:11;:20::i;:::-;-1:-1:-1;;;;;36439:36:0;;36321:154;36295:181;;36494:17;36489:66;;36520:35;;-1:-1:-1;;;36520:35:0;;;;;;;;;;;36489:66;36592:4;-1:-1:-1;;;;;36570:26:0;:13;:18;;;-1:-1:-1;;;;;36570:26:0;;36566:67;;36605:28;;-1:-1:-1;;;36605:28:0;;;;;;;;;;;36566:67;-1:-1:-1;;;;;36648:16:0;;36644:52;;36673:23;;-1:-1:-1;;;36673:23:0;;;;;;;;;;;36644:52;36817:49;36834:1;36838:7;36847:13;:18;;;36817:8;:49::i;:::-;-1:-1:-1;;;;;37162:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37162:31:0;;;-1:-1:-1;;;;;37162:31:0;;;-1:-1:-1;;37162:31:0;;;;;;;37208:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37208:29:0;;;;;;;;;;;37254:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;37299:61:0;;;;-1:-1:-1;;;37344:15:0;37299:61;;;;;;;;;;;37634:11;;;37664:24;;;;;:29;37634:11;;37664:29;37660:445;;37889:13;;-1:-1:-1;;;;;37889:13:0;37875:27;;37871:219;;;37959:18;;;37927:24;;;:11;:24;;;;;;;;:50;;38042:28;;;;-1:-1:-1;;;;;38000:70:0;-1:-1:-1;;;38000:70:0;-1:-1:-1;;;;;;38000:70:0;;;-1:-1:-1;;;;;37927:50:0;;;38000:70;;;;;;;37871:219;36109:2112;38152:7;38148:2;-1:-1:-1;;;;;38133:27:0;38142:4;-1:-1:-1;;;;;38133:27:0;;;;;;;;;;;38171:42;36109:2112;;;;;:::o;38450:2040::-;38510:35;38548:20;38560:7;38548:11;:20::i;:::-;38510:58;-1:-1:-1;38711:49:0;38728:1;38732:7;38741:13;:18;;;38711:8;:49::i;:::-;39069:18;;-1:-1:-1;;;;;39056:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;39056:45:0;;-1:-1:-1;;;;;39056:45:0;;;-1:-1:-1;;39056:45:0;;;;;;;39129:18;;39116:32;;;;;;;:50;;-1:-1:-1;;;;39116:50:0;;-1:-1:-1;;;39116:50:0;;;;;;-1:-1:-1;39116:50:0;;;;;;;;;;;;39293:18;;39265:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;39265:46:0;;;-1:-1:-1;;;;;;39326:61:0;;;;-1:-1:-1;;;39371:15:0;39326:61;;;;;;;;;;;-1:-1:-1;;;;39402:34:0;;;;;;;39706:11;;;39736:24;;;;;:29;39706:11;;39736:29;39732:445;;39961:13;;-1:-1:-1;;;;;39961:13:0;39947:27;;39943:219;;;40031:18;;;39999:24;;;:11;:24;;;;;;;;:50;;40114:28;;;;-1:-1:-1;;;;;40072:70:0;-1:-1:-1;;;40072:70:0;-1:-1:-1;;;;;;40072:70:0;;;-1:-1:-1;;;;;39999:50:0;;;40072:70;;;;;;;39943:219;-1:-1:-1;40214:18:0;;40205:49;;40246:7;;40242:1;;-1:-1:-1;;;;;40205:49:0;;;;;;40242:1;;40205:49;-1:-1:-1;;40457:12:0;:14;;;-1:-1:-1;;;;;;;;40457:14:0;;;;;;;;;;;;;;;;;;;38450:2040::o;33544:104::-;33613:27;33623:2;33627:8;33613:27;;;;;;;;;;;;:9;:27::i;28602:1083::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;28768:13:0;;28712:7;;-1:-1:-1;;;;;28768:13:0;28761:20;;28757:861;;;28802:31;28836:17;;;:11;:17;;;;;;;;;28802:51;;;;;;;;;-1:-1:-1;;;;;28802:51:0;;;;-1:-1:-1;;;28802:51:0;;-1:-1:-1;;;;;28802:51:0;;;;;;;;-1:-1:-1;;;28802:51:0;;;;;;;;;;;;;;28872:731;;28922:14;;-1:-1:-1;;;;;28922:28:0;;28918:101;;28986:9;28602:1083;-1:-1:-1;;;28602:1083:0:o;28918:101::-;-1:-1:-1;;;29363:6:0;29408:17;;;;:11;:17;;;;;;;;;29396:29;;;;;;;;;-1:-1:-1;;;;;29396:29:0;;;;;-1:-1:-1;;;29396:29:0;;-1:-1:-1;;;;;29396:29:0;;;;;;;;-1:-1:-1;;;29396:29:0;;;;;;;;;;;;;29456:28;29452:109;;29524:9;28602:1083;-1:-1:-1;;;28602:1083:0:o;29452:109::-;29323:261;;;28757:861;;29646:31;;-1:-1:-1;;;29646:31:0;;;;;;;;;;;46120:191;46213:6;;;-1:-1:-1;;;;;46230:17:0;;;-1:-1:-1;;;;;;46230:17:0;;;;;;;46263:40;;46213:6;;;46230:17;46213:6;;46263:40;;46194:16;;46263:40;46120:191;;:::o;41369:790::-;41524:4;-1:-1:-1;;;;;41545:13:0;;10225:19;:23;41541:611;;41581:72;;-1:-1:-1;;;41581:72:0;;-1:-1:-1;;;;;41581:36:0;;;;;:72;;17959:10;;41632:4;;41638:7;;41647:5;;41581:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41581:72:0;;;;;;;;-1:-1:-1;;41581:72:0;;;;;;;;;;;;:::i;:::-;;;41577:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41827:13:0;;41823:259;;41877:40;;-1:-1:-1;;;41877:40:0;;;;;;;;;;;41823:259;42032:6;42026:13;42017:6;42013:2;42009:15;42002:38;41577:520;-1:-1:-1;;;;;;41704:55:0;-1:-1:-1;;;41704:55:0;;-1:-1:-1;41697:62:0;;41541:611;-1:-1:-1;42136:4:0;41541:611;41369:790;;;;;;:::o;56803:578::-;56856:27;56900:7;56896:50;;-1:-1:-1;;56924:10:0;;;;;;;;;;;;-1:-1:-1;;;56924:10:0;;;;;56803:578::o;56896:50::-;56965:2;56956:6;56997:69;57004:6;;56997:69;;57027:5;;;;:::i;:::-;;-1:-1:-1;57047:7:0;;-1:-1:-1;57052:2:0;57047:7;;:::i;:::-;;;56997:69;;;57076:17;57106:3;-1:-1:-1;;;;;57096:14:0;;;;;-1:-1:-1;;;57096:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57096:14:0;-1:-1:-1;57076:34:0;-1:-1:-1;57130:3:0;57144:200;57151:7;;57144:200;;57179:5;57183:1;57179;:5;:::i;:::-;57175:9;-1:-1:-1;57199:10:0;57229:7;57234:2;57229;:7;:::i;:::-;:12;;57239:2;57229:12;:::i;:::-;57224:17;;:2;:17;:::i;:::-;57213:29;;:2;:29;:::i;:::-;57199:44;;57258:9;57277:4;57270:12;;57258:24;;57307:2;57297:4;57302:1;57297:7;;;;;;-1:-1:-1;;;57297:7:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;57297:12:0;;;;;;;;-1:-1:-1;57324:8:0;57330:2;57324:8;;:::i;:::-;;;57144:200;;;;;-1:-1:-1;57368:4:0;56803:578;-1:-1:-1;;;;56803:578:0:o;48458:143::-;48564:29;48577:3;48582:10;48564:29;;;;;;;:::i;34011:163::-;34134:32;34140:2;34144:8;34154:5;34161:4;34572:20;34595:13;-1:-1:-1;;;;;34595:13:0;-1:-1:-1;;;;;34623:16:0;;34619:48;;34648:19;;-1:-1:-1;;;34648:19:0;;;;;;;;;;;34619:48;34682:13;34678:44;;34704:18;;-1:-1:-1;;;34704:18:0;;;;;;;;;;;34678:44;-1:-1:-1;;;;;35074:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;35133:49:0;;-1:-1:-1;;;;;35074:44:0;;;;;;;35133:49;;;;-1:-1:-1;;35074:44:0;;;;;;35133:49;;;;;;;;;;;;;;;;35199:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;35249:66:0;;;;-1:-1:-1;;;35299:15:0;35249:66;;;;;;;;;;;35199:25;;35384:328;35404:8;35400:1;:12;35384:328;;;35443:38;;35468:12;;-1:-1:-1;;;;;35443:38:0;;;35460:1;;35443:38;;35460:1;;35443:38;35504:4;:68;;;;;35513:59;35544:1;35548:2;35552:12;35566:5;35513:22;:59::i;:::-;35512:60;35504:68;35500:164;;;35604:40;;-1:-1:-1;;;35604:40:0;;;;;;;;;;;35500:164;35682:14;;;;;35414:3;35384:328;;;-1:-1:-1;35728:13:0;:37;;-1:-1:-1;;;;;;35728:37:0;-1:-1:-1;;;;;35728:37:0;;;;;;;;;;35787:60;57503:372;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:160::-;490:20;;546:13;;539:21;529:32;;519:2;;575:1;572;565:12;519:2;471:114;;;:::o;590:229::-;633:5;686:3;679:4;671:6;667:17;663:27;653:2;;708:5;701;694:20;653:2;734:79;809:3;800:6;787:20;780:4;772:6;768:17;734:79;:::i;824:257::-;883:6;936:2;924:9;915:7;911:23;907:32;904:2;;;957:6;949;942:22;904:2;1001:9;988:23;1020:31;1045:5;1020:31;:::i;1086:398::-;1154:6;1162;1215:2;1203:9;1194:7;1190:23;1186:32;1183:2;;;1236:6;1228;1221:22;1183:2;1280:9;1267:23;1299:31;1324:5;1299:31;:::i;:::-;1349:5;-1:-1:-1;1406:2:1;1391:18;;1378:32;1419:33;1378:32;1419:33;:::i;:::-;1471:7;1461:17;;;1173:311;;;;;:::o;1489:466::-;1566:6;1574;1582;1635:2;1623:9;1614:7;1610:23;1606:32;1603:2;;;1656:6;1648;1641:22;1603:2;1700:9;1687:23;1719:31;1744:5;1719:31;:::i;:::-;1769:5;-1:-1:-1;1826:2:1;1811:18;;1798:32;1839:33;1798:32;1839:33;:::i;:::-;1593:362;;1891:7;;-1:-1:-1;;;1945:2:1;1930:18;;;;1917:32;;1593:362::o;1960:824::-;2055:6;2063;2071;2079;2132:3;2120:9;2111:7;2107:23;2103:33;2100:2;;;2154:6;2146;2139:22;2100:2;2198:9;2185:23;2217:31;2242:5;2217:31;:::i;:::-;2267:5;-1:-1:-1;2324:2:1;2309:18;;2296:32;2337:33;2296:32;2337:33;:::i;:::-;2389:7;-1:-1:-1;2443:2:1;2428:18;;2415:32;;-1:-1:-1;2498:2:1;2483:18;;2470:32;-1:-1:-1;;;;;2514:30:1;;2511:2;;;2562:6;2554;2547:22;2511:2;2590:22;;2643:4;2635:13;;2631:27;-1:-1:-1;2621:2:1;;2677:6;2669;2662:22;2621:2;2705:73;2770:7;2765:2;2752:16;2747:2;2743;2739:11;2705:73;:::i;:::-;2695:83;;;2090:694;;;;;;;:::o;2789:325::-;2854:6;2862;2915:2;2903:9;2894:7;2890:23;2886:32;2883:2;;;2936:6;2928;2921:22;2883:2;2980:9;2967:23;2999:31;3024:5;2999:31;:::i;:::-;3049:5;-1:-1:-1;3073:35:1;3104:2;3089:18;;3073:35;:::i;:::-;3063:45;;2873:241;;;;;:::o;3119:325::-;3187:6;3195;3248:2;3236:9;3227:7;3223:23;3219:32;3216:2;;;3269:6;3261;3254:22;3216:2;3313:9;3300:23;3332:31;3357:5;3332:31;:::i;:::-;3382:5;3434:2;3419:18;;;;3406:32;;-1:-1:-1;;;3206:238:1:o;3449:1002::-;3533:6;3564:2;3607;3595:9;3586:7;3582:23;3578:32;3575:2;;;3628:6;3620;3613:22;3575:2;3673:9;3660:23;-1:-1:-1;;;;;3743:2:1;3735:6;3732:14;3729:2;;;3764:6;3756;3749:22;3729:2;3807:6;3796:9;3792:22;3782:32;;3852:7;3845:4;3841:2;3837:13;3833:27;3823:2;;3879:6;3871;3864:22;3823:2;3920;3907:16;3942:2;3938;3935:10;3932:2;;;3948:18;;:::i;:::-;3994:2;3991:1;3987:10;3977:20;;4017:28;4041:2;4037;4033:11;4017:28;:::i;:::-;4079:15;;;4110:12;;;;4142:11;;;4172;;;4168:20;;4165:33;-1:-1:-1;4162:2:1;;;4216:6;4208;4201:22;4162:2;4243:6;4234:15;;4258:163;4272:2;4269:1;4266:9;4258:163;;;4329:17;;4317:30;;4290:1;4283:9;;;;;4367:12;;;;4399;;4258:163;;;-1:-1:-1;4440:5:1;3544:907;-1:-1:-1;;;;;;;;3544:907:1:o;4456:255::-;4514:6;4567:2;4555:9;4546:7;4542:23;4538:32;4535:2;;;4588:6;4580;4573:22;4535:2;4632:9;4619:23;4651:30;4675:5;4651:30;:::i;4716:259::-;4785:6;4838:2;4826:9;4817:7;4813:23;4809:32;4806:2;;;4859:6;4851;4844:22;4806:2;4896:9;4890:16;4915:30;4939:5;4915:30;:::i;4980:342::-;5049:6;5102:2;5090:9;5081:7;5077:23;5073:32;5070:2;;;5123:6;5115;5108:22;5070:2;5168:9;5155:23;-1:-1:-1;;;;;5193:6:1;5190:30;5187:2;;;5238:6;5230;5223:22;5187:2;5266:50;5308:7;5299:6;5288:9;5284:22;5266:50;:::i;5327:190::-;5386:6;5439:2;5427:9;5418:7;5414:23;5410:32;5407:2;;;5460:6;5452;5445:22;5407:2;-1:-1:-1;5488:23:1;;5397:120;-1:-1:-1;5397:120:1:o;5522:531::-;5606:6;5614;5622;5675:2;5663:9;5654:7;5650:23;5646:32;5643:2;;;5696:6;5688;5681:22;5643:2;5737:9;5724:23;5714:33;;5797:2;5786:9;5782:18;5769:32;5810:31;5835:5;5810:31;:::i;:::-;5860:5;-1:-1:-1;5917:2:1;5902:18;;5889:32;-1:-1:-1;;;;;5952:40:1;;5940:53;;5930:2;;6012:6;6004;5997:22;5930:2;6040:7;6030:17;;;5633:420;;;;;:::o;6058:258::-;6123:6;6131;6184:2;6172:9;6163:7;6159:23;6155:32;6152:2;;;6205:6;6197;6190:22;6152:2;6246:9;6233:23;6223:33;;6275:35;6306:2;6295:9;6291:18;6275:35;:::i;6321:410::-;6399:6;6407;6460:2;6448:9;6439:7;6435:23;6431:32;6428:2;;;6481:6;6473;6466:22;6428:2;6522:9;6509:23;6499:33;;6583:2;6572:9;6568:18;6555:32;-1:-1:-1;;;;;6602:6:1;6599:30;6596:2;;;6647:6;6639;6632:22;6596:2;6675:50;6717:7;6708:6;6697:9;6693:22;6675:50;:::i;:::-;6665:60;;;6418:313;;;;;:::o;6736:258::-;6804:6;6812;6865:2;6853:9;6844:7;6840:23;6836:32;6833:2;;;6886:6;6878;6871:22;6833:2;-1:-1:-1;;6914:23:1;;;6984:2;6969:18;;;6956:32;;-1:-1:-1;6823:171:1:o;6999:587::-;7056:3;7094:5;7088:12;7121:6;7116:3;7109:19;7147:4;7176:2;7171:3;7167:12;7160:19;;7213:2;7206:5;7202:14;7234:3;7246:315;7260:6;7257:1;7254:13;7246:315;;;7319:13;;7361:9;;-1:-1:-1;;;;;7357:35:1;7345:48;;7437:11;;7431:18;-1:-1:-1;;;;;7427:51:1;7413:12;;;7406:73;7508:4;7499:14;;;;7536:15;;;;7389:1;7275:9;7246:315;;;-1:-1:-1;7577:3:1;;7064:522;-1:-1:-1;;;;;7064:522:1:o;7591:257::-;7632:3;7670:5;7664:12;7697:6;7692:3;7685:19;7713:63;7769:6;7762:4;7757:3;7753:14;7746:4;7739:5;7735:16;7713:63;:::i;:::-;7830:2;7809:15;-1:-1:-1;;7805:29:1;7796:39;;;;7837:4;7792:50;;7640:208;-1:-1:-1;;7640:208:1:o;8208:986::-;8384:3;8413;8448:6;8442:13;8478:36;8504:9;8478:36;:::i;:::-;8533:1;8550:18;;;8577:104;;;;8695:1;8690:362;;;;8543:509;;8577:104;-1:-1:-1;;8610:24:1;;8598:37;;8655:16;;;;-1:-1:-1;8577:104:1;;8690:362;8723:6;8718:3;8711:19;8753:4;8800:2;8795:3;8785:18;8825:3;8841:165;8855:6;8852:1;8849:13;8841:165;;;8933:14;;8920:11;;;8913:35;8976:16;;;;8870:10;;8841:165;;;8845:3;;;9035:6;9030:3;9026:16;9019:23;;8543:509;;;;;9083:6;9077:13;9099:55;9145:8;9140:3;9133:4;9125:6;9121:17;9099:55;:::i;:::-;9170:18;;8392:802;-1:-1:-1;;;;8392:802:1:o;9943:488::-;-1:-1:-1;;;;;10212:15:1;;;10194:34;;10264:15;;10259:2;10244:18;;10237:43;10311:2;10296:18;;10289:34;;;10359:3;10354:2;10339:18;;10332:31;;;10137:4;;10380:45;;10405:19;;10397:6;10380:45;:::i;:::-;10372:53;10146:285;-1:-1:-1;;;;;;10146:285:1:o;10715:309::-;10938:2;10927:9;10920:21;10901:4;10958:60;11014:2;11003:9;10999:18;10991:6;10958:60;:::i;11029:635::-;11200:2;11252:21;;;11322:13;;11225:18;;;11344:22;;;11171:4;;11200:2;11423:15;;;;11397:2;11382:18;;;11171:4;11469:169;11483:6;11480:1;11477:13;11469:169;;;11544:13;;11532:26;;11613:15;;;;11578:12;;;;11505:1;11498:9;11469:169;;;-1:-1:-1;11655:3:1;;11180:484;-1:-1:-1;;;;;;11180:484:1:o;11861:219::-;12010:2;11999:9;11992:21;11973:4;12030:44;12070:2;12059:9;12055:18;12047:6;12030:44;:::i;12085:938::-;12194:4;12223:2;12252;12241:9;12234:21;12275:4;12311:6;12305:13;12341:36;12367:9;12341:36;:::i;:::-;12413:6;12408:2;12397:9;12393:18;12386:34;12439:2;12460:1;12492:2;12481:9;12477:18;12509:1;12504:121;;;;12639:1;12634:363;;;;12470:527;;12504:121;-1:-1:-1;;12552:24:1;;12532:18;;;12525:52;12612:2;12597:18;;;-1:-1:-1;12504:121:1;;12634:363;12668:6;12662:4;12655:20;12719:2;12713:4;12703:19;12744:4;12761:180;12775:6;12772:1;12769:13;12761:180;;;12868:14;;12844:17;;;12840:26;;12833:50;12911:16;;;;12790:10;;12761:180;;;12965:17;;12961:26;;;-1:-1:-1;;12470:527:1;-1:-1:-1;13014:3:1;;12203:820;-1:-1:-1;;;;;;;;12203:820:1:o;16189:350::-;16391:2;16373:21;;;16430:2;16410:18;;;16403:30;16469:28;16464:2;16449:18;;16442:56;16530:2;16515:18;;16363:176::o;17246:356::-;17448:2;17430:21;;;17467:18;;;17460:30;17526:34;17521:2;17506:18;;17499:62;17593:2;17578:18;;17420:182::o;18857:380::-;19108:6;19097:9;19090:25;19151:2;19146;19135:9;19131:18;19124:30;19071:4;19171:60;19227:2;19216:9;19212:18;19204:6;19171:60;:::i;19592:275::-;19663:2;19657:9;19728:2;19709:13;;-1:-1:-1;;19705:27:1;19693:40;;-1:-1:-1;;;;;19748:34:1;;19784:22;;;19745:62;19742:2;;;19810:18;;:::i;:::-;19846:2;19839:22;19637:230;;-1:-1:-1;19637:230:1:o;19872:128::-;19912:3;19943:1;19939:6;19936:1;19933:13;19930:2;;;19949:18;;:::i;:::-;-1:-1:-1;19985:9:1;;19920:80::o;20005:204::-;20043:3;20079:4;20076:1;20072:12;20111:4;20108:1;20104:12;20146:3;20140:4;20136:14;20131:3;20128:23;20125:2;;;20154:18;;:::i;:::-;20190:13;;20051:158;-1:-1:-1;;;20051:158:1:o;20214:120::-;20254:1;20280;20270:2;;20285:18;;:::i;:::-;-1:-1:-1;20319:9:1;;20260:74::o;20339:168::-;20379:7;20445:1;20441;20437:6;20433:14;20430:1;20427:21;20422:1;20415:9;20408:17;20404:45;20401:2;;;20452:18;;:::i;:::-;-1:-1:-1;20492:9:1;;20391:116::o;20512:125::-;20552:4;20580:1;20577;20574:8;20571:2;;;20585:18;;:::i;:::-;-1:-1:-1;20622:9:1;;20561:76::o;20642:258::-;20714:1;20724:113;20738:6;20735:1;20732:13;20724:113;;;20814:11;;;20808:18;20795:11;;;20788:39;20760:2;20753:10;20724:113;;;20855:6;20852:1;20849:13;20846:2;;;-1:-1:-1;;20890:1:1;20872:16;;20865:27;20695:205::o;20905:380::-;20984:1;20980:12;;;;21027;;;21048:2;;21102:4;21094:6;21090:17;21080:27;;21048:2;21155;21147:6;21144:14;21124:18;21121:38;21118:2;;;21201:10;21196:3;21192:20;21189:1;21182:31;21236:4;21233:1;21226:15;21264:4;21261:1;21254:15;21290:135;21329:3;-1:-1:-1;;21350:17:1;;21347:2;;;21370:18;;:::i;:::-;-1:-1:-1;21417:1:1;21406:13;;21337:88::o;21430:201::-;21468:3;21496:10;21541:2;21534:5;21530:14;21568:2;21559:7;21556:15;21553:2;;;21574:18;;:::i;:::-;21623:1;21610:15;;21476:155;-1:-1:-1;;;21476:155:1:o;21636:112::-;21668:1;21694;21684:2;;21699:18;;:::i;:::-;-1:-1:-1;21733:9:1;;21674:74::o;21753:127::-;21814:10;21809:3;21805:20;21802:1;21795:31;21845:4;21842:1;21835:15;21869:4;21866:1;21859:15;21885:127;21946:10;21941:3;21937:20;21934:1;21927:31;21977:4;21974:1;21967:15;22001:4;21998:1;21991:15;22017:127;22078:10;22073:3;22069:20;22066:1;22059:31;22109:4;22106:1;22099:15;22133:4;22130:1;22123:15;22149:131;-1:-1:-1;;;;;22224:31:1;;22214:42;;22204:2;;22270:1;22267;22260:12;22285:131;-1:-1:-1;;;;;;22359:32:1;;22349:43;;22339:2;;22406:1;22403;22396:12

Swarm Source

ipfs://2c2dc6c5a3b839e7cc89809ff8f371e193710d2f45818cc290833072376d6237
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.