ETH Price: $2,345.76 (+0.12%)

Token

Bread Heads (BH)
 

Overview

Max Total Supply

1,035 BH

Holders

253

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 BH
0x4c883461868be70abb0cf3be614d5f05a87476bd
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BreadHeads

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-12-17
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File @openzeppelin/contracts/utils/introspection/[email protected]
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/[email protected]



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/[email protected]



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);
}

// 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/token/ERC721/extensions/[email protected]



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/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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/[email protected]



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/introspection/[email protected]



pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/utils/[email protected]

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/access/[email protected]



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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.12;

error AllOwnershipsHaveBeenSet();
error QuantityMustBeNonZero();
error NoTokensMintedYet();

/**
 * @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..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721BH is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // 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_;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721BH: global index out of bounds');
        return index;
    }

    /**
     * @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) {
        require(index < balanceOf(owner), 'ERC721BH: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721BH: unable to get token of owner by index');
    }

    /**
     * @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) {
        require(owner != address(0), 'ERC721BH: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721BH: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721BH: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721BH: unable to determine the owner of token');
    }

    /**
     * @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) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        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 = ERC721BH.ownerOf(tokenId);
        require(to != owner, 'ERC721BH: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721BH: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721BH: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721BH: approve to caller');

        _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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721BH: transfer to non ERC721Receiver implementer'
        );
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721BH: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721BH: token already minted');
        require(quantity > 0, 'ERC721BH: quantity must be greater 0');

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

        _addressData[to].balance += uint128(quantity);
        _addressData[to].numberMinted += uint128(quantity);

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

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721BH: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

        currentIndex = 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 ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721BH: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721BH: transfer from incorrect owner');
        require(to != address(0), 'ERC721BH: transfer to the zero address');

        _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.
        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)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }

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

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

    uint256 public nextOwnerToExplicitlySet;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        require(quantity > 0, 'quantity must be greater than zero');
        require(currentIndex > 0, 'no tokens minted yet');
        require(nextOwnerToExplicitlySet < currentIndex, 'all ownerships have been set');

        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        // Set the end index to be the last token index
        if (endIndex > currentIndex - 1) {
            endIndex = currentIndex - 1;
        }

        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i].addr = ownership.addr;
                _ownerships[i].startTimestamp = ownership.startTimestamp;
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }   

    /**
     * @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('ERC721BH: transfer to non ERC721Receiver implementer');
                } 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.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    address public signerAddress;

  /*
   * @dev Requires msg.sender to have valid access message.
   * @param _v ECDSA signature parameter v.
   * @param _r ECDSA signature parameters r.
   * @param _s ECDSA signature parameters s.
   */
  modifier onlyValidAccess(
      bytes32 _r,
      bytes32 _s,
      uint8 _v
  ) {
      require(isValidAccessMessage(msg.sender, _r, _s, _v));
      _;
  }

  function setSignerAddress(address newAddress) external onlyOwner {
      signerAddress = newAddress;
  }

  /*
   * @dev Verifies if message was signed by owner to give access to _add for this contract.
   *      Assumes Geth signature prefix.
   * @param _add Address of agent with access
   * @param _v ECDSA signature parameter v.
   * @param _r ECDSA signature parameters r.
   * @param _s ECDSA signature parameters s.
   * @return Validity of access message for a given address.
   */
  function isValidAccessMessage(
      address _add,
      bytes32 _r,
      bytes32 _s,
      uint8 _v
  ) public view returns (bool) {
      bytes32 digest = keccak256(abi.encode(owner(), _add));
      address signer = ecrecover(digest, _v, _r, _s);
      require(signer != address(0), 'ECDSA: invalid signature'); // Added check for zero address
      require(signerAddress == signer, "Signature does not match");
      return signer == signerAddress;
  }
}

//***************************************
//Developed by Mercurial (@mercurial__me)
//***************************************

pragma solidity ^0.8.12;

contract BreadHeads is ERC721BH, ReentrancyGuard {

  using Strings for uint256;
  string public provenanceHash;
  string private _baseTokenURI;

  // Sale Params
  uint256 public cost = 0.06 ether;
  uint256 public tokensMaxPerWallet = 5; // Presale
  uint256 public tokensMaxPerTx = 15; // Public sale
  uint256 public tokensReserved = 500;
  uint256 public tokensMaxSupply = 10000;
  bool public isPublicSaleActive = false;
  bool public isPresaleActive = false;

  constructor() ERC721BH("Bread Heads", "BH") {}

  function presaleMint(uint256 quantity, bytes32 _r, bytes32 _s, uint8 _v) external payable nonReentrant onlyValidAccess(_r, _s, _v) {
    require(isPresaleActive, "PRESALE NOT ACTIVE");
    require(quantity + numberMinted(msg.sender) <= tokensMaxPerWallet, "EXCEEDING MAX TOKENS PER WALLET");
    require(totalSupply() + quantity + tokensReserved <= tokensMaxSupply, "EXCEEDING MAX SUPPLY");
    require(msg.value >= cost * quantity, "INSUFFICIENT ETH");
    _safeMint(msg.sender, quantity, "");
  }

  function publicSaleMint(uint256 quantity) external payable callerIsUser nonReentrant {
    require(isPublicSaleActive, "PUBLIC SALE NOT ACTIVE");
    require(quantity <= tokensMaxPerTx, "EXCEEDING MINT LIMIT OF 15/TXN");
    require(totalSupply() + quantity + tokensReserved <= tokensMaxSupply, "EXCEEDING MAX SUPPLY");
    require(msg.value >= cost * quantity, "INSUFFICIENT ETH");
    _safeMint(msg.sender, quantity, "");
  }

  function giftBreadhead(address[] calldata recipient, uint[] calldata quantity) external onlyOwner{
    require(recipient.length == quantity.length, "RECIPIENT AND QUANTITY NOT EQUAL LENGTH");
    uint256 totalQuantity = 0;
    for(uint256 i; i < quantity.length; i++){
      totalQuantity += quantity[i];
    }
    require(totalQuantity <= tokensReserved, "EXCEEDING REMAINING RESERVED SUPPLY");
    require(totalQuantity + totalSupply()  <= tokensMaxSupply, "EXCEEDING MAX SUPPLY");
    for(uint256 i; i < recipient.length; i++){
      tokensReserved -= quantity[i];
      _safeMint(recipient[i], quantity[i], "");
    }
  }

  // Withdrawal functions
  function withdraw() external onlyOwner {
    uint256 sendAmount = address(this).balance;
    bool success;

    address w1 = payable(0x1e16870873b28d956f8EBCb5179E518f8A9f89B5);
    address w2 = payable(0x1435Db7390300EB252C806df378ecC882c041641);
    address w3 = payable(0x096a9d16AFFD7fB6b881dA383723bB10180Cc333);
    address dao = payable(0x14967Af4019989557489E2621b22C76d6404D2Cd);
    address treasury = payable(0x948181FA14E1a8D47e79e8b09632c274D3bD9386);

    (success, ) = w1.call{value: (sendAmount * 200/1000)}("");
    require(success, "Transaction Unsuccessful");

    (success, ) = w2.call{value: (sendAmount * 100/1000)}("");
    require(success, "Transaction Unsuccessful");

    (success, ) = w3.call{value: (sendAmount * 100/1000)}("");
    require(success, "Transaction Unsuccessful");

    (success, ) = dao.call{value: (sendAmount * 438/1000)}("");
    require(success, "Transaction Unsuccessful");

    (success, ) = treasury.call{value: (sendAmount * 162/1000)}("");
    require(success, "Transaction Unsuccessful");
  }

  function emergencyWithdraw() external onlyOwner {
    address w1 = payable(0x096a9d16AFFD7fB6b881dA383723bB10180Cc333);
    (bool success, ) = w1.call{value: address(this).balance}("");
    require(success, "Transaction Unsuccessful");
  }

  // Token URI
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

  // Getters
  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  
  function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
    return ownershipOf(tokenId);
  }

  // Setters
  function setprovenanceHash(string calldata _newHash) external onlyOwner {
    provenanceHash = _newHash;
  }
  
  function settokensReserved(uint256 _newMax) external onlyOwner {
    tokensReserved = _newMax;
  }

  function settokensMaxSupply(uint256 _newMax) external onlyOwner {
    tokensMaxSupply = _newMax;
  }

  function settokensMaxPerWallet(uint256 _newMax) external onlyOwner {
    tokensMaxPerWallet = _newMax;
  }

  function setPreSaleState(bool _newState) public onlyOwner {
    isPresaleActive = _newState;
  }

  function setPublicSaleStatus(bool _newState) public onlyOwner {
    isPublicSaleActive = _newState;
  }

  function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
  _setOwnersExplicit(quantity);
  }

  receive() external payable {}
  fallback() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"stateMutability":"payable","type":"fallback"},{"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":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","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":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721BH.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipient","type":"address[]"},{"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"giftBreadhead","outputs":[],"stateMutability":"nonpayable","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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","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":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[{"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":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newHash","type":"string"}],"name":"setprovenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"settokensMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"settokensMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"settokensReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"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":[],"name":"tokensMaxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensReserved","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405266d529ae9e860000600d556005600e55600f80556101f46010556127106011556012805461ffff191690553480156200003c57600080fd5b506040518060400160405280600b81526020016a427265616420486561647360a81b81525060405180604001604052806002815260200161084960f31b8152506200009662000090620000cf60201b60201c565b620000d3565b8151620000ab90600290602085019062000123565b508051620000c190600390602084019062000123565b50506001600a555062000206565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200013190620001c9565b90600052602060002090601f016020900481019282620001555760008555620001a0565b82601f106200017057805160ff1916838001178555620001a0565b82800160010185558215620001a0579182015b82811115620001a057825182559160200191906001019062000183565b50620001ae929150620001b2565b5090565b5b80821115620001ae5760008155600101620001b3565b600181811c90821680620001de57607f821691505b602082108114156200020057634e487b7160e01b600052602260045260246000fd5b50919050565b6131bb80620002166000396000f3fe6080604052600436106102695760003560e01c806360d938dc11610143578063b88d4fde116100bb578063db2e21bc11610077578063db2e21bc14610747578063dc33e6811461075c578063e22738661461077c578063e985e9c51461079c578063f2fde38b146107e5578063f5d2a6581461080557005b8063b88d4fde1461069c578063c1dd27dc146106bc578063c6ab67a3146106dc578063c87b56dd146106f1578063cf08603014610711578063d7224ba01461073157005b80638da5cb5b1161010a5780638da5cb5b146105c85780639231ab2a146105e657806395d89b4114610634578063a22cb46514610649578063b3ab66b014610669578063b423fe671461067c57005b806360d938dc1461053e5780636352211e1461055d57806370a082311461057d578063711e9c0d1461059d578063715018a6146105b357005b8063208da780116101e15780633ccfd60b1161019d5780633ccfd60b1461049357806342842e0e146104a8578063433adb05146104c85780634f6ccce7146104de57806355f804b3146104fe5780635b7633d01461051e57005b8063208da780146103dd57806323b872dd146103f35780632a9a6e1d146104135780632d20fb60146104335780632f745c59146104535780633ca6fb8c1461047357005b8063095ea7b311610230578063095ea7b3146103415780630d920bfa1461036157806313faede6146103855780631749dc261461039b57806318160ddd146103ae5780631e84c413146103c357005b806301ffc9a714610272578063046dc166146102a75780630490ffb3146102c757806306fdde03146102e7578063081812fc1461030957005b3661027057005b005b34801561027e57600080fd5b5061029261028d366004612a23565b610825565b60405190151581526020015b60405180910390f35b3480156102b357600080fd5b506102706102c2366004612a5c565b610892565b3480156102d357600080fd5b506102706102e2366004612a77565b6108e7565b3480156102f357600080fd5b506102fc610916565b60405161029e9190612ae8565b34801561031557600080fd5b50610329610324366004612a77565b6109a8565b6040516001600160a01b03909116815260200161029e565b34801561034d57600080fd5b5061027061035c366004612afb565b610a34565b34801561036d57600080fd5b50610377600f5481565b60405190815260200161029e565b34801561039157600080fd5b50610377600d5481565b6102706103a9366004612b36565b610b4d565b3480156103ba57600080fd5b50600154610377565b3480156103cf57600080fd5b506012546102929060ff1681565b3480156103e957600080fd5b5061037760115481565b3480156103ff57600080fd5b5061027061040e366004612b75565b610cf7565b34801561041f57600080fd5b5061027061042e366004612bfd565b610d02565b34801561043f57600080fd5b5061027061044e366004612a77565b610f09565b34801561045f57600080fd5b5061037761046e366004612afb565b610f6c565b34801561047f57600080fd5b5061027061048e366004612c79565b6110e6565b34801561049f57600080fd5b5061027061112a565b3480156104b457600080fd5b506102706104c3366004612b75565b61145f565b3480156104d457600080fd5b5061037760105481565b3480156104ea57600080fd5b506103776104f9366004612a77565b61147a565b34801561050a57600080fd5b50610270610519366004612c94565b6114e3565b34801561052a57600080fd5b50600954610329906001600160a01b031681565b34801561054a57600080fd5b5060125461029290610100900460ff1681565b34801561056957600080fd5b50610329610578366004612a77565b611519565b34801561058957600080fd5b50610377610598366004612a5c565b61152b565b3480156105a957600080fd5b50610377600e5481565b3480156105bf57600080fd5b506102706115bd565b3480156105d457600080fd5b506000546001600160a01b0316610329565b3480156105f257600080fd5b50610606610601366004612a77565b6115f3565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff16928101929092520161029e565b34801561064057600080fd5b506102fc611610565b34801561065557600080fd5b50610270610664366004612d06565b61161f565b610270610677366004612a77565b6116e4565b34801561068857600080fd5b50610270610697366004612c79565b6118a4565b3480156106a857600080fd5b506102706106b7366004612d4f565b6118e1565b3480156106c857600080fd5b506102926106d7366004612e2b565b61191a565b3480156106e857600080fd5b506102fc611a95565b3480156106fd57600080fd5b506102fc61070c366004612a77565b611b23565b34801561071d57600080fd5b5061027061072c366004612c94565b611bf0565b34801561073d57600080fd5b5061037760085481565b34801561075357600080fd5b50610270611c26565b34801561076857600080fd5b50610377610777366004612a5c565b611cd2565b34801561078857600080fd5b50610270610797366004612a77565b611cdd565b3480156107a857600080fd5b506102926107b7366004612e66565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107f157600080fd5b50610270610800366004612a5c565b611d0c565b34801561081157600080fd5b50610270610820366004612a77565b611da7565b60006001600160e01b031982166380ac58cd60e01b148061085657506001600160e01b03198216635b5e139f60e01b145b8061087157506001600160e01b0319821663780e9d6360e01b145b8061088c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108c55760405162461bcd60e51b81526004016108bc90612e90565b60405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109115760405162461bcd60e51b81526004016108bc90612e90565b601055565b60606002805461092590612ec5565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612ec5565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b5050505050905090565b60006109b5826001541190565b610a185760405162461bcd60e51b815260206004820152602e60248201527f45524337323142483a20617070726f76656420717565727920666f72206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016108bc565b506000908152600660205260409020546001600160a01b031690565b6000610a3f82611519565b9050806001600160a01b0316836001600160a01b03161415610aaf5760405162461bcd60e51b815260206004820152602360248201527f45524337323142483a20617070726f76616c20746f2063757272656e74206f776044820152623732b960e91b60648201526084016108bc565b336001600160a01b0382161480610acb5750610acb81336107b7565b610b3d5760405162461bcd60e51b815260206004820152603a60248201527f45524337323142483a20617070726f76652063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000060648201526084016108bc565b610b48838383611dd6565b505050565b6002600a541415610b705760405162461bcd60e51b81526004016108bc90612f00565b6002600a55828282610b843384848461191a565b610b8d57600080fd5b601254610100900460ff16610bd95760405162461bcd60e51b815260206004820152601260248201527150524553414c45204e4f542041435449564560701b60448201526064016108bc565b600e54610be533611cd2565b610bef9089612f4d565b1115610c3d5760405162461bcd60e51b815260206004820152601f60248201527f455843454544494e47204d415820544f4b454e53205045522057414c4c45540060448201526064016108bc565b60115460105488610c4d60015490565b610c579190612f4d565b610c619190612f4d565b1115610c7f5760405162461bcd60e51b81526004016108bc90612f65565b86600d54610c8d9190612f93565b341015610ccf5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8408aa8960831b60448201526064016108bc565b610ce9338860405180602001604052806000815250611e32565b50506001600a555050505050565b610b488383836120c4565b6000546001600160a01b03163314610d2c5760405162461bcd60e51b81526004016108bc90612e90565b828114610d8b5760405162461bcd60e51b815260206004820152602760248201527f524543495049454e5420414e44205155414e54495459204e4f5420455155414c604482015266040988a9c8ea8960cb1b60648201526084016108bc565b6000805b82811015610dcf57838382818110610da957610da9612fb2565b9050602002013582610dbb9190612f4d565b915080610dc781612fc8565b915050610d8f565b50601054811115610e2e5760405162461bcd60e51b815260206004820152602360248201527f455843454544494e472052454d41494e494e4720524553455256454420535550604482015262504c5960e81b60648201526084016108bc565b601154600154610e3e9083612f4d565b1115610e5c5760405162461bcd60e51b81526004016108bc90612f65565b60005b84811015610f0157838382818110610e7957610e79612fb2565b9050602002013560106000828254610e919190612fe3565b90915550610eef9050868683818110610eac57610eac612fb2565b9050602002016020810190610ec19190612a5c565b858584818110610ed357610ed3612fb2565b9050602002013560405180602001604052806000815250611e32565b80610ef981612fc8565b915050610e5f565b505050505050565b6000546001600160a01b03163314610f335760405162461bcd60e51b81526004016108bc90612e90565b6002600a541415610f565760405162461bcd60e51b81526004016108bc90612f00565b6002600a55610f64816123cb565b506001600a55565b6000610f778361152b565b8210610fd15760405162461bcd60e51b815260206004820152602360248201527f45524337323142483a206f776e657220696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108bc565b6000610fdc60015490565b9050600080805b83811015611085576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561103657805192505b876001600160a01b0316836001600160a01b0316141561107257868414156110645750935061088c92505050565b8361106e81612fc8565b9450505b508061107d81612fc8565b915050610fe3565b5060405162461bcd60e51b815260206004820152602f60248201527f45524337323142483a20756e61626c6520746f2067657420746f6b656e206f6660448201526e040deeedccae440c4f240d2dcc8caf608b1b60648201526084016108bc565b6000546001600160a01b031633146111105760405162461bcd60e51b81526004016108bc90612e90565b601280549115156101000261ff0019909216919091179055565b6000546001600160a01b031633146111545760405162461bcd60e51b81526004016108bc90612e90565b476000731e16870873b28d956f8ebcb5179e518f8a9f89b5731435db7390300eb252c806df378ecc882c04164173096a9d16affd7fb6b881da383723bb10180cc3337314967af4019989557489e2621b22c76d6404d2cd73948181fa14e1a8d47e79e8b09632c274d3bd9386846103e86111cf8960c8612f93565b6111d99190613010565b604051600081818185875af1925050503d8060008114611215576040519150601f19603f3d011682016040523d82523d6000602084013e61121a565b606091505b5050809650508561123d5760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0384166103e8611255896064612f93565b61125f9190613010565b604051600081818185875af1925050503d806000811461129b576040519150601f19603f3d011682016040523d82523d6000602084013e6112a0565b606091505b505080965050856112c35760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0383166103e86112db896064612f93565b6112e59190613010565b604051600081818185875af1925050503d8060008114611321576040519150601f19603f3d011682016040523d82523d6000602084013e611326565b606091505b505080965050856113495760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0382166103e8611362896101b6612f93565b61136c9190613010565b604051600081818185875af1925050503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b505080965050856113d05760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0381166103e86113e88960a2612f93565b6113f29190613010565b604051600081818185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b505080965050856114565760405162461bcd60e51b81526004016108bc90613024565b50505050505050565b610b48838383604051806020016040528060008152506118e1565b600061148560015490565b82106114df5760405162461bcd60e51b8152602060048201526024808201527f45524337323142483a20676c6f62616c20696e646578206f7574206f6620626f604482015263756e647360e01b60648201526084016108bc565b5090565b6000546001600160a01b0316331461150d5760405162461bcd60e51b81526004016108bc90612e90565b610b48600c838361297d565b6000611524826125a5565b5192915050565b60006001600160a01b0382166115985760405162461bcd60e51b815260206004820152602c60248201527f45524337323142483a2062616c616e636520717565727920666f72207468652060448201526b7a65726f206164647265737360a01b60648201526084016108bc565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146115e75760405162461bcd60e51b81526004016108bc90612e90565b6115f16000612686565b565b604080518082019091526000808252602082015261088c826125a5565b60606003805461092590612ec5565b6001600160a01b0382163314156116785760405162461bcd60e51b815260206004820152601b60248201527f45524337323142483a20617070726f766520746f2063616c6c6572000000000060448201526064016108bc565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3233146117335760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064016108bc565b6002600a5414156117565760405162461bcd60e51b81526004016108bc90612f00565b6002600a5560125460ff166117a65760405162461bcd60e51b81526020600482015260166024820152755055424c49432053414c45204e4f542041435449564560501b60448201526064016108bc565b600f548111156117f85760405162461bcd60e51b815260206004820152601e60248201527f455843454544494e47204d494e54204c494d4954204f462031352f54584e000060448201526064016108bc565b6011546010548261180860015490565b6118129190612f4d565b61181c9190612f4d565b111561183a5760405162461bcd60e51b81526004016108bc90612f65565b80600d546118489190612f93565b34101561188a5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8408aa8960831b60448201526064016108bc565b610f64338260405180602001604052806000815250611e32565b6000546001600160a01b031633146118ce5760405162461bcd60e51b81526004016108bc90612e90565b6012805460ff1916911515919091179055565b6118ec8484846120c4565b6118f8848484846126d6565b6119145760405162461bcd60e51b81526004016108bc9061305b565b50505050565b60008061192f6000546001600160a01b031690565b604080516001600160a01b0392831660208201529188169082015260600160408051601f198184030181528282528051602091820120600080855291840180845281905260ff87169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156119b8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a1b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108bc565b6009546001600160a01b03828116911614611a785760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206d61746368000000000000000060448201526064016108bc565b6009546001600160a01b039182169116149150505b949350505050565b600b8054611aa290612ec5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ace90612ec5565b8015611b1b5780601f10611af057610100808354040283529160200191611b1b565b820191906000526020600020905b815481529060010190602001808311611afe57829003601f168201915b505050505081565b6060611b30826001541190565b611b945760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108bc565b6000611b9e6127d1565b90506000815111611bbe5760405180602001604052806000815250611be9565b80611bc8846127e0565b604051602001611bd99291906130af565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611c1a5760405162461bcd60e51b81526004016108bc90612e90565b610b48600b838361297d565b6000546001600160a01b03163314611c505760405162461bcd60e51b81526004016108bc90612e90565b60405173096a9d16affd7fb6b881da383723bb10180cc33390600090829047908381818185875af1925050503d8060008114611ca8576040519150601f19603f3d011682016040523d82523d6000602084013e611cad565b606091505b5050905080611cce5760405162461bcd60e51b81526004016108bc90613024565b5050565b600061088c826128de565b6000546001600160a01b03163314611d075760405162461bcd60e51b81526004016108bc90612e90565b601155565b6000546001600160a01b03163314611d365760405162461bcd60e51b81526004016108bc90612e90565b6001600160a01b038116611d9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108bc565b611da481612686565b50565b6000546001600160a01b03163314611dd15760405162461bcd60e51b81526004016108bc90612e90565b600e55565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b038416611e965760405162461bcd60e51b815260206004820152602260248201527f45524337323142483a206d696e7420746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108bc565b611ea1816001541190565b15611eee5760405162461bcd60e51b815260206004820152601e60248201527f45524337323142483a20746f6b656e20616c7265616479206d696e746564000060448201526064016108bc565b60008311611f4a5760405162461bcd60e51b8152602060048201526024808201527f45524337323142483a207175616e74697479206d7573742062652067726561746044820152630657220360e41b60648201526084016108bc565b6001600160a01b03841660009081526005602052604081208054859290611f7b9084906001600160801b03166130de565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260056020526040902080548693509091601091611fd0918591600160801b9004166130de565b82546001600160801b039182166101009390930a9283029190920219909116179055506000818152600460205260408120805467ffffffffffffffff4216600160a01b026001600160e01b03199091166001600160a01b0388161717905581905b848110156120ba5760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461207e60008784876126d6565b61209a5760405162461bcd60e51b81526004016108bc9061305b565b816120a481612fc8565b92505080806120b290612fc8565b915050612031565b5060015550505050565b60006120cf826125a5565b80519091506000906001600160a01b0316336001600160a01b031614806121065750336120fb846109a8565b6001600160a01b0316145b806121185750815161211890336107b7565b9050806121835760405162461bcd60e51b815260206004820152603360248201527f45524337323142483a207472616e736665722063616c6c6572206973206e6f74604482015272081bdddb995c881b9bdc88185c1c1c9bdd9959606a1b60648201526084016108bc565b846001600160a01b031682600001516001600160a01b0316146121f85760405162461bcd60e51b815260206004820152602760248201527f45524337323142483a207472616e736665722066726f6d20696e636f727265636044820152663a1037bbb732b960c91b60648201526084016108bc565b6001600160a01b03841661225d5760405162461bcd60e51b815260206004820152602660248201527f45524337323142483a207472616e7366657220746f20746865207a65726f206160448201526564647265737360d01b60648201526084016108bc565b61226d6000848460000151611dd6565b6001600160a01b03858116600090815260056020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b039283166000190183161790925594891680855282852080549283169287166001908101909716929092179091558784526004909252822080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559061230e908590612f4d565b6000818152600460205260409020549091506001600160a01b031661238557612338816001541190565b15612385578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f01565b600081116124265760405162461bcd60e51b815260206004820152602260248201527f7175616e74697479206d7573742062652067726561746572207468616e207a65604482015261726f60f01b60648201526084016108bc565b60006001541161246f5760405162461bcd60e51b81526020600482015260146024820152731b9bc81d1bdad95b9cc81b5a5b9d1959081e595d60621b60448201526064016108bc565b600154600854106124c25760405162461bcd60e51b815260206004820152601c60248201527f616c6c206f776e657273686970732068617665206265656e207365740000000060448201526064016108bc565b600854600060016124d38484612f4d565b6124dd9190612fe3565b9050600180546124ed9190612fe3565b81111561250557600180546125029190612fe3565b90505b815b818111612591576000818152600460205260409020546001600160a01b031661257f576000612535826125a5565b805160008481526004602090815260409091208054919093015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b0390921691909117179055505b8061258981612fc8565b915050612507565b5061259d816001612f4d565b600855505050565b60408051808201909152600080825260208201526125c4826001541190565b6126245760405162461bcd60e51b815260206004820152602b60248201527f45524337323142483a206f776e657220717565727920666f72206e6f6e65786960448201526a39ba32b73a103a37b5b2b760a91b60648201526084016108bc565b815b6000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612673579392505050565b508061267e81613100565b915050612626565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156127c957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061271a903390899088908890600401613117565b6020604051808303816000875af1925050508015612755575060408051601f3d908101601f1916820190925261275291810190613154565b60015b6127af573d808015612783576040519150601f19603f3d011682016040523d82523d6000602084013e612788565b606091505b5080516127a75760405162461bcd60e51b81526004016108bc9061305b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a8d565b506001611a8d565b6060600c805461092590612ec5565b6060816128045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561282e578061281881612fc8565b91506128279050600a83613010565b9150612808565b60008167ffffffffffffffff81111561284957612849612d39565b6040519080825280601f01601f191660200182016040528015612873576020820181803683370190505b5090505b8415611a8d57612888600183612fe3565b9150612895600a86613171565b6128a0906030612f4d565b60f81b8183815181106128b5576128b5612fb2565b60200101906001600160f81b031916908160001a9053506128d7600a86613010565b9450612877565b60006001600160a01b0382166129515760405162461bcd60e51b815260206004820152603260248201527f45524337323142483a206e756d626572206d696e74656420717565727920666f6044820152717220746865207a65726f206164647265737360701b60648201526084016108bc565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b82805461298990612ec5565b90600052602060002090601f0160209004810192826129ab57600085556129f1565b82601f106129c45782800160ff198235161785556129f1565b828001600101855582156129f1579182015b828111156129f15782358255916020019190600101906129d6565b506114df9291505b808211156114df57600081556001016129f9565b6001600160e01b031981168114611da457600080fd5b600060208284031215612a3557600080fd5b8135611be981612a0d565b80356001600160a01b0381168114612a5757600080fd5b919050565b600060208284031215612a6e57600080fd5b611be982612a40565b600060208284031215612a8957600080fd5b5035919050565b60005b83811015612aab578181015183820152602001612a93565b838111156119145750506000910152565b60008151808452612ad4816020860160208601612a90565b601f01601f19169290920160200192915050565b602081526000611be96020830184612abc565b60008060408385031215612b0e57600080fd5b612b1783612a40565b946020939093013593505050565b803560ff81168114612a5757600080fd5b60008060008060808587031215612b4c57600080fd5b843593506020850135925060408501359150612b6a60608601612b25565b905092959194509250565b600080600060608486031215612b8a57600080fd5b612b9384612a40565b9250612ba160208501612a40565b9150604084013590509250925092565b60008083601f840112612bc357600080fd5b50813567ffffffffffffffff811115612bdb57600080fd5b6020830191508360208260051b8501011115612bf657600080fd5b9250929050565b60008060008060408587031215612c1357600080fd5b843567ffffffffffffffff80821115612c2b57600080fd5b612c3788838901612bb1565b90965094506020870135915080821115612c5057600080fd5b50612c5d87828801612bb1565b95989497509550505050565b80358015158114612a5757600080fd5b600060208284031215612c8b57600080fd5b611be982612c69565b60008060208385031215612ca757600080fd5b823567ffffffffffffffff80821115612cbf57600080fd5b818501915085601f830112612cd357600080fd5b813581811115612ce257600080fd5b866020828501011115612cf457600080fd5b60209290920196919550909350505050565b60008060408385031215612d1957600080fd5b612d2283612a40565b9150612d3060208401612c69565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d6557600080fd5b612d6e85612a40565b9350612d7c60208601612a40565b925060408501359150606085013567ffffffffffffffff80821115612da057600080fd5b818701915087601f830112612db457600080fd5b813581811115612dc657612dc6612d39565b604051601f8201601f19908116603f01168101908382118183101715612dee57612dee612d39565b816040528281528a6020848701011115612e0757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060808587031215612e4157600080fd5b612e4a85612a40565b93506020850135925060408501359150612b6a60608601612b25565b60008060408385031215612e7957600080fd5b612e8283612a40565b9150612d3060208401612a40565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ed957607f821691505b60208210811415612efa57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612f6057612f60612f37565b500190565b602080825260149082015273455843454544494e47204d415820535550504c5960601b604082015260600190565b6000816000190483118215151615612fad57612fad612f37565b500290565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612fdc57612fdc612f37565b5060010190565b600082821015612ff557612ff5612f37565b500390565b634e487b7160e01b600052601260045260246000fd5b60008261301f5761301f612ffa565b500490565b60208082526018908201527f5472616e73616374696f6e20556e7375636365737366756c0000000000000000604082015260600190565b60208082526034908201527f45524337323142483a207472616e7366657220746f206e6f6e204552433732316040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b600083516130c1818460208801612a90565b8351908301906130d5818360208801612a90565b01949350505050565b60006001600160801b038083168185168083038211156130d5576130d5612f37565b60008161310f5761310f612f37565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061314a90830184612abc565b9695505050505050565b60006020828403121561316657600080fd5b8151611be981612a0d565b60008261318057613180612ffa565b50069056fea2646970667358221220c4c177af4844e4ce425b587470d96e1e4dade2d77e69a8e31ba3cf81062964c364736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106102695760003560e01c806360d938dc11610143578063b88d4fde116100bb578063db2e21bc11610077578063db2e21bc14610747578063dc33e6811461075c578063e22738661461077c578063e985e9c51461079c578063f2fde38b146107e5578063f5d2a6581461080557005b8063b88d4fde1461069c578063c1dd27dc146106bc578063c6ab67a3146106dc578063c87b56dd146106f1578063cf08603014610711578063d7224ba01461073157005b80638da5cb5b1161010a5780638da5cb5b146105c85780639231ab2a146105e657806395d89b4114610634578063a22cb46514610649578063b3ab66b014610669578063b423fe671461067c57005b806360d938dc1461053e5780636352211e1461055d57806370a082311461057d578063711e9c0d1461059d578063715018a6146105b357005b8063208da780116101e15780633ccfd60b1161019d5780633ccfd60b1461049357806342842e0e146104a8578063433adb05146104c85780634f6ccce7146104de57806355f804b3146104fe5780635b7633d01461051e57005b8063208da780146103dd57806323b872dd146103f35780632a9a6e1d146104135780632d20fb60146104335780632f745c59146104535780633ca6fb8c1461047357005b8063095ea7b311610230578063095ea7b3146103415780630d920bfa1461036157806313faede6146103855780631749dc261461039b57806318160ddd146103ae5780631e84c413146103c357005b806301ffc9a714610272578063046dc166146102a75780630490ffb3146102c757806306fdde03146102e7578063081812fc1461030957005b3661027057005b005b34801561027e57600080fd5b5061029261028d366004612a23565b610825565b60405190151581526020015b60405180910390f35b3480156102b357600080fd5b506102706102c2366004612a5c565b610892565b3480156102d357600080fd5b506102706102e2366004612a77565b6108e7565b3480156102f357600080fd5b506102fc610916565b60405161029e9190612ae8565b34801561031557600080fd5b50610329610324366004612a77565b6109a8565b6040516001600160a01b03909116815260200161029e565b34801561034d57600080fd5b5061027061035c366004612afb565b610a34565b34801561036d57600080fd5b50610377600f5481565b60405190815260200161029e565b34801561039157600080fd5b50610377600d5481565b6102706103a9366004612b36565b610b4d565b3480156103ba57600080fd5b50600154610377565b3480156103cf57600080fd5b506012546102929060ff1681565b3480156103e957600080fd5b5061037760115481565b3480156103ff57600080fd5b5061027061040e366004612b75565b610cf7565b34801561041f57600080fd5b5061027061042e366004612bfd565b610d02565b34801561043f57600080fd5b5061027061044e366004612a77565b610f09565b34801561045f57600080fd5b5061037761046e366004612afb565b610f6c565b34801561047f57600080fd5b5061027061048e366004612c79565b6110e6565b34801561049f57600080fd5b5061027061112a565b3480156104b457600080fd5b506102706104c3366004612b75565b61145f565b3480156104d457600080fd5b5061037760105481565b3480156104ea57600080fd5b506103776104f9366004612a77565b61147a565b34801561050a57600080fd5b50610270610519366004612c94565b6114e3565b34801561052a57600080fd5b50600954610329906001600160a01b031681565b34801561054a57600080fd5b5060125461029290610100900460ff1681565b34801561056957600080fd5b50610329610578366004612a77565b611519565b34801561058957600080fd5b50610377610598366004612a5c565b61152b565b3480156105a957600080fd5b50610377600e5481565b3480156105bf57600080fd5b506102706115bd565b3480156105d457600080fd5b506000546001600160a01b0316610329565b3480156105f257600080fd5b50610606610601366004612a77565b6115f3565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff16928101929092520161029e565b34801561064057600080fd5b506102fc611610565b34801561065557600080fd5b50610270610664366004612d06565b61161f565b610270610677366004612a77565b6116e4565b34801561068857600080fd5b50610270610697366004612c79565b6118a4565b3480156106a857600080fd5b506102706106b7366004612d4f565b6118e1565b3480156106c857600080fd5b506102926106d7366004612e2b565b61191a565b3480156106e857600080fd5b506102fc611a95565b3480156106fd57600080fd5b506102fc61070c366004612a77565b611b23565b34801561071d57600080fd5b5061027061072c366004612c94565b611bf0565b34801561073d57600080fd5b5061037760085481565b34801561075357600080fd5b50610270611c26565b34801561076857600080fd5b50610377610777366004612a5c565b611cd2565b34801561078857600080fd5b50610270610797366004612a77565b611cdd565b3480156107a857600080fd5b506102926107b7366004612e66565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107f157600080fd5b50610270610800366004612a5c565b611d0c565b34801561081157600080fd5b50610270610820366004612a77565b611da7565b60006001600160e01b031982166380ac58cd60e01b148061085657506001600160e01b03198216635b5e139f60e01b145b8061087157506001600160e01b0319821663780e9d6360e01b145b8061088c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108c55760405162461bcd60e51b81526004016108bc90612e90565b60405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109115760405162461bcd60e51b81526004016108bc90612e90565b601055565b60606002805461092590612ec5565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612ec5565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b5050505050905090565b60006109b5826001541190565b610a185760405162461bcd60e51b815260206004820152602e60248201527f45524337323142483a20617070726f76656420717565727920666f72206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016108bc565b506000908152600660205260409020546001600160a01b031690565b6000610a3f82611519565b9050806001600160a01b0316836001600160a01b03161415610aaf5760405162461bcd60e51b815260206004820152602360248201527f45524337323142483a20617070726f76616c20746f2063757272656e74206f776044820152623732b960e91b60648201526084016108bc565b336001600160a01b0382161480610acb5750610acb81336107b7565b610b3d5760405162461bcd60e51b815260206004820152603a60248201527f45524337323142483a20617070726f76652063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000060648201526084016108bc565b610b48838383611dd6565b505050565b6002600a541415610b705760405162461bcd60e51b81526004016108bc90612f00565b6002600a55828282610b843384848461191a565b610b8d57600080fd5b601254610100900460ff16610bd95760405162461bcd60e51b815260206004820152601260248201527150524553414c45204e4f542041435449564560701b60448201526064016108bc565b600e54610be533611cd2565b610bef9089612f4d565b1115610c3d5760405162461bcd60e51b815260206004820152601f60248201527f455843454544494e47204d415820544f4b454e53205045522057414c4c45540060448201526064016108bc565b60115460105488610c4d60015490565b610c579190612f4d565b610c619190612f4d565b1115610c7f5760405162461bcd60e51b81526004016108bc90612f65565b86600d54610c8d9190612f93565b341015610ccf5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8408aa8960831b60448201526064016108bc565b610ce9338860405180602001604052806000815250611e32565b50506001600a555050505050565b610b488383836120c4565b6000546001600160a01b03163314610d2c5760405162461bcd60e51b81526004016108bc90612e90565b828114610d8b5760405162461bcd60e51b815260206004820152602760248201527f524543495049454e5420414e44205155414e54495459204e4f5420455155414c604482015266040988a9c8ea8960cb1b60648201526084016108bc565b6000805b82811015610dcf57838382818110610da957610da9612fb2565b9050602002013582610dbb9190612f4d565b915080610dc781612fc8565b915050610d8f565b50601054811115610e2e5760405162461bcd60e51b815260206004820152602360248201527f455843454544494e472052454d41494e494e4720524553455256454420535550604482015262504c5960e81b60648201526084016108bc565b601154600154610e3e9083612f4d565b1115610e5c5760405162461bcd60e51b81526004016108bc90612f65565b60005b84811015610f0157838382818110610e7957610e79612fb2565b9050602002013560106000828254610e919190612fe3565b90915550610eef9050868683818110610eac57610eac612fb2565b9050602002016020810190610ec19190612a5c565b858584818110610ed357610ed3612fb2565b9050602002013560405180602001604052806000815250611e32565b80610ef981612fc8565b915050610e5f565b505050505050565b6000546001600160a01b03163314610f335760405162461bcd60e51b81526004016108bc90612e90565b6002600a541415610f565760405162461bcd60e51b81526004016108bc90612f00565b6002600a55610f64816123cb565b506001600a55565b6000610f778361152b565b8210610fd15760405162461bcd60e51b815260206004820152602360248201527f45524337323142483a206f776e657220696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108bc565b6000610fdc60015490565b9050600080805b83811015611085576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561103657805192505b876001600160a01b0316836001600160a01b0316141561107257868414156110645750935061088c92505050565b8361106e81612fc8565b9450505b508061107d81612fc8565b915050610fe3565b5060405162461bcd60e51b815260206004820152602f60248201527f45524337323142483a20756e61626c6520746f2067657420746f6b656e206f6660448201526e040deeedccae440c4f240d2dcc8caf608b1b60648201526084016108bc565b6000546001600160a01b031633146111105760405162461bcd60e51b81526004016108bc90612e90565b601280549115156101000261ff0019909216919091179055565b6000546001600160a01b031633146111545760405162461bcd60e51b81526004016108bc90612e90565b476000731e16870873b28d956f8ebcb5179e518f8a9f89b5731435db7390300eb252c806df378ecc882c04164173096a9d16affd7fb6b881da383723bb10180cc3337314967af4019989557489e2621b22c76d6404d2cd73948181fa14e1a8d47e79e8b09632c274d3bd9386846103e86111cf8960c8612f93565b6111d99190613010565b604051600081818185875af1925050503d8060008114611215576040519150601f19603f3d011682016040523d82523d6000602084013e61121a565b606091505b5050809650508561123d5760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0384166103e8611255896064612f93565b61125f9190613010565b604051600081818185875af1925050503d806000811461129b576040519150601f19603f3d011682016040523d82523d6000602084013e6112a0565b606091505b505080965050856112c35760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0383166103e86112db896064612f93565b6112e59190613010565b604051600081818185875af1925050503d8060008114611321576040519150601f19603f3d011682016040523d82523d6000602084013e611326565b606091505b505080965050856113495760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0382166103e8611362896101b6612f93565b61136c9190613010565b604051600081818185875af1925050503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b505080965050856113d05760405162461bcd60e51b81526004016108bc90613024565b6001600160a01b0381166103e86113e88960a2612f93565b6113f29190613010565b604051600081818185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b505080965050856114565760405162461bcd60e51b81526004016108bc90613024565b50505050505050565b610b48838383604051806020016040528060008152506118e1565b600061148560015490565b82106114df5760405162461bcd60e51b8152602060048201526024808201527f45524337323142483a20676c6f62616c20696e646578206f7574206f6620626f604482015263756e647360e01b60648201526084016108bc565b5090565b6000546001600160a01b0316331461150d5760405162461bcd60e51b81526004016108bc90612e90565b610b48600c838361297d565b6000611524826125a5565b5192915050565b60006001600160a01b0382166115985760405162461bcd60e51b815260206004820152602c60248201527f45524337323142483a2062616c616e636520717565727920666f72207468652060448201526b7a65726f206164647265737360a01b60648201526084016108bc565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146115e75760405162461bcd60e51b81526004016108bc90612e90565b6115f16000612686565b565b604080518082019091526000808252602082015261088c826125a5565b60606003805461092590612ec5565b6001600160a01b0382163314156116785760405162461bcd60e51b815260206004820152601b60248201527f45524337323142483a20617070726f766520746f2063616c6c6572000000000060448201526064016108bc565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3233146117335760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064016108bc565b6002600a5414156117565760405162461bcd60e51b81526004016108bc90612f00565b6002600a5560125460ff166117a65760405162461bcd60e51b81526020600482015260166024820152755055424c49432053414c45204e4f542041435449564560501b60448201526064016108bc565b600f548111156117f85760405162461bcd60e51b815260206004820152601e60248201527f455843454544494e47204d494e54204c494d4954204f462031352f54584e000060448201526064016108bc565b6011546010548261180860015490565b6118129190612f4d565b61181c9190612f4d565b111561183a5760405162461bcd60e51b81526004016108bc90612f65565b80600d546118489190612f93565b34101561188a5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8408aa8960831b60448201526064016108bc565b610f64338260405180602001604052806000815250611e32565b6000546001600160a01b031633146118ce5760405162461bcd60e51b81526004016108bc90612e90565b6012805460ff1916911515919091179055565b6118ec8484846120c4565b6118f8848484846126d6565b6119145760405162461bcd60e51b81526004016108bc9061305b565b50505050565b60008061192f6000546001600160a01b031690565b604080516001600160a01b0392831660208201529188169082015260600160408051601f198184030181528282528051602091820120600080855291840180845281905260ff87169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156119b8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a1b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108bc565b6009546001600160a01b03828116911614611a785760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206d61746368000000000000000060448201526064016108bc565b6009546001600160a01b039182169116149150505b949350505050565b600b8054611aa290612ec5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ace90612ec5565b8015611b1b5780601f10611af057610100808354040283529160200191611b1b565b820191906000526020600020905b815481529060010190602001808311611afe57829003601f168201915b505050505081565b6060611b30826001541190565b611b945760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108bc565b6000611b9e6127d1565b90506000815111611bbe5760405180602001604052806000815250611be9565b80611bc8846127e0565b604051602001611bd99291906130af565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611c1a5760405162461bcd60e51b81526004016108bc90612e90565b610b48600b838361297d565b6000546001600160a01b03163314611c505760405162461bcd60e51b81526004016108bc90612e90565b60405173096a9d16affd7fb6b881da383723bb10180cc33390600090829047908381818185875af1925050503d8060008114611ca8576040519150601f19603f3d011682016040523d82523d6000602084013e611cad565b606091505b5050905080611cce5760405162461bcd60e51b81526004016108bc90613024565b5050565b600061088c826128de565b6000546001600160a01b03163314611d075760405162461bcd60e51b81526004016108bc90612e90565b601155565b6000546001600160a01b03163314611d365760405162461bcd60e51b81526004016108bc90612e90565b6001600160a01b038116611d9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108bc565b611da481612686565b50565b6000546001600160a01b03163314611dd15760405162461bcd60e51b81526004016108bc90612e90565b600e55565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b038416611e965760405162461bcd60e51b815260206004820152602260248201527f45524337323142483a206d696e7420746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108bc565b611ea1816001541190565b15611eee5760405162461bcd60e51b815260206004820152601e60248201527f45524337323142483a20746f6b656e20616c7265616479206d696e746564000060448201526064016108bc565b60008311611f4a5760405162461bcd60e51b8152602060048201526024808201527f45524337323142483a207175616e74697479206d7573742062652067726561746044820152630657220360e41b60648201526084016108bc565b6001600160a01b03841660009081526005602052604081208054859290611f7b9084906001600160801b03166130de565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260056020526040902080548693509091601091611fd0918591600160801b9004166130de565b82546001600160801b039182166101009390930a9283029190920219909116179055506000818152600460205260408120805467ffffffffffffffff4216600160a01b026001600160e01b03199091166001600160a01b0388161717905581905b848110156120ba5760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461207e60008784876126d6565b61209a5760405162461bcd60e51b81526004016108bc9061305b565b816120a481612fc8565b92505080806120b290612fc8565b915050612031565b5060015550505050565b60006120cf826125a5565b80519091506000906001600160a01b0316336001600160a01b031614806121065750336120fb846109a8565b6001600160a01b0316145b806121185750815161211890336107b7565b9050806121835760405162461bcd60e51b815260206004820152603360248201527f45524337323142483a207472616e736665722063616c6c6572206973206e6f74604482015272081bdddb995c881b9bdc88185c1c1c9bdd9959606a1b60648201526084016108bc565b846001600160a01b031682600001516001600160a01b0316146121f85760405162461bcd60e51b815260206004820152602760248201527f45524337323142483a207472616e736665722066726f6d20696e636f727265636044820152663a1037bbb732b960c91b60648201526084016108bc565b6001600160a01b03841661225d5760405162461bcd60e51b815260206004820152602660248201527f45524337323142483a207472616e7366657220746f20746865207a65726f206160448201526564647265737360d01b60648201526084016108bc565b61226d6000848460000151611dd6565b6001600160a01b03858116600090815260056020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b039283166000190183161790925594891680855282852080549283169287166001908101909716929092179091558784526004909252822080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559061230e908590612f4d565b6000818152600460205260409020549091506001600160a01b031661238557612338816001541190565b15612385578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f01565b600081116124265760405162461bcd60e51b815260206004820152602260248201527f7175616e74697479206d7573742062652067726561746572207468616e207a65604482015261726f60f01b60648201526084016108bc565b60006001541161246f5760405162461bcd60e51b81526020600482015260146024820152731b9bc81d1bdad95b9cc81b5a5b9d1959081e595d60621b60448201526064016108bc565b600154600854106124c25760405162461bcd60e51b815260206004820152601c60248201527f616c6c206f776e657273686970732068617665206265656e207365740000000060448201526064016108bc565b600854600060016124d38484612f4d565b6124dd9190612fe3565b9050600180546124ed9190612fe3565b81111561250557600180546125029190612fe3565b90505b815b818111612591576000818152600460205260409020546001600160a01b031661257f576000612535826125a5565b805160008481526004602090815260409091208054919093015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b0390921691909117179055505b8061258981612fc8565b915050612507565b5061259d816001612f4d565b600855505050565b60408051808201909152600080825260208201526125c4826001541190565b6126245760405162461bcd60e51b815260206004820152602b60248201527f45524337323142483a206f776e657220717565727920666f72206e6f6e65786960448201526a39ba32b73a103a37b5b2b760a91b60648201526084016108bc565b815b6000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612673579392505050565b508061267e81613100565b915050612626565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156127c957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061271a903390899088908890600401613117565b6020604051808303816000875af1925050508015612755575060408051601f3d908101601f1916820190925261275291810190613154565b60015b6127af573d808015612783576040519150601f19603f3d011682016040523d82523d6000602084013e612788565b606091505b5080516127a75760405162461bcd60e51b81526004016108bc9061305b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a8d565b506001611a8d565b6060600c805461092590612ec5565b6060816128045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561282e578061281881612fc8565b91506128279050600a83613010565b9150612808565b60008167ffffffffffffffff81111561284957612849612d39565b6040519080825280601f01601f191660200182016040528015612873576020820181803683370190505b5090505b8415611a8d57612888600183612fe3565b9150612895600a86613171565b6128a0906030612f4d565b60f81b8183815181106128b5576128b5612fb2565b60200101906001600160f81b031916908160001a9053506128d7600a86613010565b9450612877565b60006001600160a01b0382166129515760405162461bcd60e51b815260206004820152603260248201527f45524337323142483a206e756d626572206d696e74656420717565727920666f6044820152717220746865207a65726f206164647265737360701b60648201526084016108bc565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b82805461298990612ec5565b90600052602060002090601f0160209004810192826129ab57600085556129f1565b82601f106129c45782800160ff198235161785556129f1565b828001600101855582156129f1579182015b828111156129f15782358255916020019190600101906129d6565b506114df9291505b808211156114df57600081556001016129f9565b6001600160e01b031981168114611da457600080fd5b600060208284031215612a3557600080fd5b8135611be981612a0d565b80356001600160a01b0381168114612a5757600080fd5b919050565b600060208284031215612a6e57600080fd5b611be982612a40565b600060208284031215612a8957600080fd5b5035919050565b60005b83811015612aab578181015183820152602001612a93565b838111156119145750506000910152565b60008151808452612ad4816020860160208601612a90565b601f01601f19169290920160200192915050565b602081526000611be96020830184612abc565b60008060408385031215612b0e57600080fd5b612b1783612a40565b946020939093013593505050565b803560ff81168114612a5757600080fd5b60008060008060808587031215612b4c57600080fd5b843593506020850135925060408501359150612b6a60608601612b25565b905092959194509250565b600080600060608486031215612b8a57600080fd5b612b9384612a40565b9250612ba160208501612a40565b9150604084013590509250925092565b60008083601f840112612bc357600080fd5b50813567ffffffffffffffff811115612bdb57600080fd5b6020830191508360208260051b8501011115612bf657600080fd5b9250929050565b60008060008060408587031215612c1357600080fd5b843567ffffffffffffffff80821115612c2b57600080fd5b612c3788838901612bb1565b90965094506020870135915080821115612c5057600080fd5b50612c5d87828801612bb1565b95989497509550505050565b80358015158114612a5757600080fd5b600060208284031215612c8b57600080fd5b611be982612c69565b60008060208385031215612ca757600080fd5b823567ffffffffffffffff80821115612cbf57600080fd5b818501915085601f830112612cd357600080fd5b813581811115612ce257600080fd5b866020828501011115612cf457600080fd5b60209290920196919550909350505050565b60008060408385031215612d1957600080fd5b612d2283612a40565b9150612d3060208401612c69565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d6557600080fd5b612d6e85612a40565b9350612d7c60208601612a40565b925060408501359150606085013567ffffffffffffffff80821115612da057600080fd5b818701915087601f830112612db457600080fd5b813581811115612dc657612dc6612d39565b604051601f8201601f19908116603f01168101908382118183101715612dee57612dee612d39565b816040528281528a6020848701011115612e0757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060808587031215612e4157600080fd5b612e4a85612a40565b93506020850135925060408501359150612b6a60608601612b25565b60008060408385031215612e7957600080fd5b612e8283612a40565b9150612d3060208401612a40565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ed957607f821691505b60208210811415612efa57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612f6057612f60612f37565b500190565b602080825260149082015273455843454544494e47204d415820535550504c5960601b604082015260600190565b6000816000190483118215151615612fad57612fad612f37565b500290565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612fdc57612fdc612f37565b5060010190565b600082821015612ff557612ff5612f37565b500390565b634e487b7160e01b600052601260045260246000fd5b60008261301f5761301f612ffa565b500490565b60208082526018908201527f5472616e73616374696f6e20556e7375636365737366756c0000000000000000604082015260600190565b60208082526034908201527f45524337323142483a207472616e7366657220746f206e6f6e204552433732316040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b600083516130c1818460208801612a90565b8351908301906130d5818360208801612a90565b01949350505050565b60006001600160801b038083168185168083038211156130d5576130d5612f37565b60008161310f5761310f612f37565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061314a90830184612abc565b9695505050505050565b60006020828403121561316657600080fd5b8151611be981612a0d565b60008261318057613180612ffa565b50069056fea2646970667358221220c4c177af4844e4ce425b587470d96e1e4dade2d77e69a8e31ba3cf81062964c364736f6c634300080c0033

Deployed Bytecode Sourcemap

43592:4842:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28888:372;;;;;;;;;;-1:-1:-1;28888:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;28888:372:0;;;;;;;;42453:106;;;;;;;;;;-1:-1:-1;42453:106:0;;;;;:::i;:::-;;:::i;47703:100::-;;;;;;;;;;-1:-1:-1;47703:100:0;;;;;:::i;:::-;;:::i;30519:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32083:215::-;;;;;;;;;;-1:-1:-1;32083:215:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;32083:215:0;1897:203:1;31601:416:0;;;;;;;;;;-1:-1:-1;31601:416:0;;;;;:::i;:::-;;:::i;43854:34::-;;;;;;;;;;;;;;;;;;;2510:25:1;;;2498:2;2483:18;43854:34:0;2364:177:1;43764:32:0;;;;;;;;;;;;;;;;44128:504;;;;;;:::i;:::-;;:::i;27330:100::-;;;;;;;;;;-1:-1:-1;27410:12:0;;27330:100;;43991:38;;;;;;;;;;-1:-1:-1;43991:38:0;;;;;;;;43948;;;;;;;;;;;;;;;;32961:162;;;;;;;;;;-1:-1:-1;32961:162:0;;;;;:::i;:::-;;:::i;45077:637::-;;;;;;;;;;-1:-1:-1;45077:637:0;;;;;:::i;:::-;;:::i;48246:116::-;;;;;;;;;;-1:-1:-1;48246:116:0;;;;;:::i;:::-;;:::i;27995:821::-;;;;;;;;;;-1:-1:-1;27995:821:0;;;;;:::i;:::-;;:::i;48031:98::-;;;;;;;;;;-1:-1:-1;48031:98:0;;;;;:::i;:::-;;:::i;45747:1069::-;;;;;;;;;;;;;:::i;33194:177::-;;;;;;;;;;-1:-1:-1;33194:177:0;;;;;:::i;:::-;;:::i;43908:35::-;;;;;;;;;;;;;;;;27507:188;;;;;;;;;;-1:-1:-1;27507:188:0;;;;;:::i;:::-;;:::i;47201:100::-;;;;;;;;;;-1:-1:-1;47201:100:0;;;;;:::i;:::-;;:::i;42038:28::-;;;;;;;;;;-1:-1:-1;42038:28:0;;;;-1:-1:-1;;;;;42038:28:0;;;44034:35;;;;;;;;;;-1:-1:-1;44034:35:0;;;;;;;;;;;30328:124;;;;;;;;;;-1:-1:-1;30328:124:0;;;;;:::i;:::-;;:::i;29324:222::-;;;;;;;;;;-1:-1:-1;29324:222:0;;;;;:::i;:::-;;:::i;43801:37::-;;;;;;;;;;;;;;;;24733:94;;;;;;;;;;;;;:::i;24082:87::-;;;;;;;;;;-1:-1:-1;24128:7:0;24155:6;-1:-1:-1;;;;;24155:6:0;24082:87;;47436:129;;;;;;;;;;-1:-1:-1;47436:129:0;;;;;:::i;:::-;;:::i;:::-;;;;5759:13:1;;-1:-1:-1;;;;;5755:39:1;5737:58;;5855:4;5843:17;;;5837:24;5863:18;5833:49;5811:20;;;5804:79;;;;5710:18;47436:129:0;5529:360:1;30688:104:0;;;;;;;;;;;;;:::i;32370:289::-;;;;;;;;;;-1:-1:-1;32370:289:0;;;;;:::i;:::-;;:::i;44638:433::-;;;;;;:::i;:::-;;:::i;48135:105::-;;;;;;;;;;-1:-1:-1;48135:105:0;;;;;:::i;:::-;;:::i;33442:356::-;;;;;;;;;;-1:-1:-1;33442:356:0;;;;;:::i;:::-;;:::i;42959:467::-;;;;;;;;;;-1:-1:-1;42959:467:0;;;;;:::i;:::-;;:::i;43678:28::-;;;;;;;;;;;;;:::i;30863:334::-;;;;;;;;;;-1:-1:-1;30863:334:0;;;;;:::i;:::-;;:::i;47585:110::-;;;;;;;;;;-1:-1:-1;47585:110:0;;;;;:::i;:::-;;:::i;38327:39::-;;;;;;;;;;;;;;;;46822:243;;;;;;;;;;;;;:::i;47321:107::-;;;;;;;;;;-1:-1:-1;47321:107:0;;;;;:::i;:::-;;:::i;47809:102::-;;;;;;;;;;-1:-1:-1;47809:102:0;;;;;:::i;:::-;;:::i;32730:164::-;;;;;;;;;;-1:-1:-1;32730:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32851:25:0;;;32827:4;32851:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32730:164;24982:192;;;;;;;;;;-1:-1:-1;24982:192:0;;;;;:::i;:::-;;:::i;47917:108::-;;;;;;;;;;-1:-1:-1;47917:108:0;;;;;:::i;:::-;;:::i;28888:372::-;28990:4;-1:-1:-1;;;;;;29027:40:0;;-1:-1:-1;;;29027:40:0;;:105;;-1:-1:-1;;;;;;;29084:48:0;;-1:-1:-1;;;29084:48:0;29027:105;:172;;;-1:-1:-1;;;;;;;29149:50:0;;-1:-1:-1;;;29149:50:0;29027:172;:225;;;-1:-1:-1;;;;;;;;;;20951:40:0;;;29216:36;29007:245;28888:372;-1:-1:-1;;28888:372:0:o;42453:106::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;;;;;;;;;42527:13:::1;:26:::0;;-1:-1:-1;;;;;;42527:26:0::1;-1:-1:-1::0;;;;;42527:26:0;;;::::1;::::0;;;::::1;::::0;;42453:106::o;47703:100::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;47773:14:::1;:24:::0;47703:100::o;30519:::-;30573:13;30606:5;30599:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30519:100;:::o;32083:215::-;32151:7;32179:16;32187:7;34144:12;;-1:-1:-1;34134:22:0;34053:111;32179:16;32171:75;;;;-1:-1:-1;;;32171:75:0;;9039:2:1;32171:75:0;;;9021:21:1;9078:2;9058:18;;;9051:30;9117:34;9097:18;;;9090:62;-1:-1:-1;;;9168:18:1;;;9161:44;9222:19;;32171:75:0;8837:410:1;32171:75:0;-1:-1:-1;32266:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32266:24:0;;32083:215::o;31601:416::-;31674:13;31690:25;31707:7;31690:16;:25::i;:::-;31674:41;;31740:5;-1:-1:-1;;;;;31734:11:0;:2;-1:-1:-1;;;;;31734:11:0;;;31726:59;;;;-1:-1:-1;;;31726:59:0;;9454:2:1;31726:59:0;;;9436:21:1;9493:2;9473:18;;;9466:30;9532:34;9512:18;;;9505:62;-1:-1:-1;;;9583:18:1;;;9576:33;9626:19;;31726:59:0;9252:399:1;31726:59:0;19904:10;-1:-1:-1;;;;;31820:21:0;;;;:62;;-1:-1:-1;31845:37:0;31862:5;19904:10;32730:164;:::i;31845:37::-;31798:170;;;;-1:-1:-1;;;31798:170:0;;9858:2:1;31798:170:0;;;9840:21:1;9897:2;9877:18;;;9870:30;9936:34;9916:18;;;9909:62;10007:28;9987:18;;;9980:56;10053:19;;31798:170:0;9656:422:1;31798:170:0;31981:28;31990:2;31994:7;32003:5;31981:8;:28::i;:::-;31663:354;31601:416;;:::o;44128:504::-;1784:1;2380:7;;:19;;2372:63;;;;-1:-1:-1;;;2372:63:0;;;;;;;:::i;:::-;1784:1;2513:7;:18;44247:2;44251;44255;42386:44:::1;42407:10;44247:2:::0;44251;44255;42386:20:::1;:44::i;:::-;42378:53;;;::::0;::::1;;44274:15:::2;::::0;::::2;::::0;::::2;;;44266:46;;;::::0;-1:-1:-1;;;44266:46:0;;10645:2:1;44266:46:0::2;::::0;::::2;10627:21:1::0;10684:2;10664:18;;;10657:30;-1:-1:-1;;;10703:18:1;;;10696:48;10761:18;;44266:46:0::2;10443:342:1::0;44266:46:0::2;44366:18;;44338:24;44351:10;44338:12;:24::i;:::-;44327:35;::::0;:8;:35:::2;:::i;:::-;:57;;44319:101;;;::::0;-1:-1:-1;;;44319:101:0;;11257:2:1;44319:101:0::2;::::0;::::2;11239:21:1::0;11296:2;11276:18;;;11269:30;11335:33;11315:18;;;11308:61;11386:18;;44319:101:0::2;11055:355:1::0;44319:101:0::2;44480:15;;44462:14;;44451:8;44435:13;27410:12:::0;;;27330:100;44435:13:::2;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:60;;44427:93;;;;-1:-1:-1::0;;;44427:93:0::2;;;;;;;:::i;:::-;44555:8;44548:4;;:15;;;;:::i;:::-;44535:9;:28;;44527:57;;;::::0;-1:-1:-1;;;44527:57:0;;12139:2:1;44527:57:0::2;::::0;::::2;12121:21:1::0;12178:2;12158:18;;;12151:30;-1:-1:-1;;;12197:18:1;;;12190:46;12253:18;;44527:57:0::2;11937:340:1::0;44527:57:0::2;44591:35;44601:10;44613:8;44591:35;;;;;;;;;;;::::0;:9:::2;:35::i;:::-;-1:-1:-1::0;;1740:1:0;2692:7;:22;-1:-1:-1;;;;;44128:504:0:o;32961:162::-;33087:28;33097:4;33103:2;33107:7;33087:9;:28::i;45077:637::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;45189:35;;::::1;45181:87;;;::::0;-1:-1:-1;;;45181:87:0;;12484:2:1;45181:87:0::1;::::0;::::1;12466:21:1::0;12523:2;12503:18;;;12496:30;12562:34;12542:18;;;12535:62;-1:-1:-1;;;12613:18:1;;;12606:37;12660:19;;45181:87:0::1;12282:403:1::0;45181:87:0::1;45275:21;45311:9:::0;45307:85:::1;45322:19:::0;;::::1;45307:85;;;45373:8;;45382:1;45373:11;;;;;;;:::i;:::-;;;;;;;45356:28;;;;;:::i;:::-;::::0;-1:-1:-1;45343:3:0;::::1;::::0;::::1;:::i;:::-;;;;45307:85;;;;45423:14;;45406:13;:31;;45398:79;;;::::0;-1:-1:-1;;;45398:79:0;;13164:2:1;45398:79:0::1;::::0;::::1;13146:21:1::0;13203:2;13183:18;;;13176:30;13242:34;13222:18;;;13215:62;-1:-1:-1;;;13293:18:1;;;13286:33;13336:19;;45398:79:0::1;12962:399:1::0;45398:79:0::1;45526:15;::::0;27410:12;;45492:29:::1;::::0;:13;:29:::1;:::i;:::-;:49;;45484:82;;;;-1:-1:-1::0;;;45484:82:0::1;;;;;;;:::i;:::-;45577:9;45573:136;45588:20:::0;;::::1;45573:136;;;45641:8;;45650:1;45641:11;;;;;;;:::i;:::-;;;;;;;45623:14;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;45661:40:0::1;::::0;-1:-1:-1;45671:9:0;;45681:1;45671:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;45685:8;;45694:1;45685:11;;;;;;;:::i;:::-;;;;;;;45661:40;;;;;;;;;;;::::0;:9:::1;:40::i;:::-;45610:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45573:136;;;;45174:540;45077:637:::0;;;;:::o;48246:116::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;1784:1:::1;2380:7;;:19;;2372:63;;;;-1:-1:-1::0;;;2372:63:0::1;;;;;;;:::i;:::-;1784:1;2513:7;:18:::0;48328:28:::2;48347:8:::0;48328:18:::2;:28::i;:::-;-1:-1:-1::0;1740:1:0::1;2692:7;:22:::0;48246:116::o;27995:821::-;28084:7;28120:16;28130:5;28120:9;:16::i;:::-;28112:5;:24;28104:72;;;;-1:-1:-1;;;28104:72:0;;13698:2:1;28104:72:0;;;13680:21:1;13737:2;13717:18;;;13710:30;13776:34;13756:18;;;13749:62;-1:-1:-1;;;13827:18:1;;;13820:33;13870:19;;28104:72:0;13496:399:1;28104:72:0;28187:22;28212:13;27410:12;;;27330:100;28212:13;28187:38;-1:-1:-1;28236:19:0;;;28315:426;28339:14;28335:1;:18;28315:426;;;28375:31;28409:14;;;:11;:14;;;;;;;;;28375:48;;;;;;;;;-1:-1:-1;;;;;28375:48:0;;;;;-1:-1:-1;;;28375:48:0;;;;;;;;;;;;28442:28;28438:103;;28511:14;;;-1:-1:-1;28438:103:0;28580:5;-1:-1:-1;;;;;28559:26:0;:17;-1:-1:-1;;;;;28559:26:0;;28555:175;;;28625:5;28610:11;:20;28606:77;;;-1:-1:-1;28662:1:0;-1:-1:-1;28655:8:0;;-1:-1:-1;;;28655:8:0;28606:77;28701:13;;;;:::i;:::-;;;;28555:175;-1:-1:-1;28355:3:0;;;;:::i;:::-;;;;28315:426;;;-1:-1:-1;28751:57:0;;-1:-1:-1;;;28751:57:0;;14102:2:1;28751:57:0;;;14084:21:1;14141:2;14121:18;;;14114:30;14180:34;14160:18;;;14153:62;-1:-1:-1;;;14231:18:1;;;14224:45;14286:19;;28751:57:0;13900:411:1;48031:98:0;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;48096:15:::1;:27:::0;;;::::1;;;;-1:-1:-1::0;;48096:27:0;;::::1;::::0;;;::::1;::::0;;48031:98::o;45747:1069::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;45814:21:::1;45793:18;45884:42;45955;46026;46098;46175;45884::::0;46274:4:::1;46257:16;45814:21:::0;46270:3:::1;46257:16;:::i;:::-;:21;;;;:::i;:::-;46241:43;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46227:57;;;;;46299:7;46291:44;;;;-1:-1:-1::0;;;46291:44:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46358:7:0;::::1;46391:4;46374:16;:10:::0;46387:3:::1;46374:16;:::i;:::-;:21;;;;:::i;:::-;46358:43;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46344:57;;;;;46416:7;46408:44;;;;-1:-1:-1::0;;;46408:44:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46475:7:0;::::1;46508:4;46491:16;:10:::0;46504:3:::1;46491:16;:::i;:::-;:21;;;;:::i;:::-;46475:43;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:57;;;;;46533:7;46525:44;;;;-1:-1:-1::0;;;46525:44:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46592:8:0;::::1;46626:4;46609:16;:10:::0;46622:3:::1;46609:16;:::i;:::-;:21;;;;:::i;:::-;46592:44;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46578:58;;;;;46651:7;46643:44;;;;-1:-1:-1::0;;;46643:44:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46710:13:0;::::1;46749:4;46732:16;:10:::0;46745:3:::1;46732:16;:::i;:::-;:21;;;;:::i;:::-;46710:49;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46696:63;;;;;46774:7;46766:44;;;;-1:-1:-1::0;;;46766:44:0::1;;;;;;;:::i;:::-;45786:1030;;;;;;;45747:1069::o:0;33194:177::-;33324:39;33341:4;33347:2;33351:7;33324:39;;;;;;;;;;;;:16;:39::i;27507:188::-;27574:7;27610:13;27410:12;;;27330:100;27610:13;27602:5;:21;27594:70;;;;-1:-1:-1;;;27594:70:0;;15338:2:1;27594:70:0;;;15320:21:1;15377:2;15357:18;;;15350:30;15416:34;15396:18;;;15389:62;-1:-1:-1;;;15467:18:1;;;15460:34;15511:19;;27594:70:0;15136:400:1;27594:70:0;-1:-1:-1;27682:5:0;27507:188::o;47201:100::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;47272:23:::1;:13;47288:7:::0;;47272:23:::1;:::i;30328:124::-:0;30392:7;30419:20;30431:7;30419:11;:20::i;:::-;:25;;30328:124;-1:-1:-1;;30328:124:0:o;29324:222::-;29388:7;-1:-1:-1;;;;;29416:19:0;;29408:76;;;;-1:-1:-1;;;29408:76:0;;15743:2:1;29408:76:0;;;15725:21:1;15782:2;15762:18;;;15755:30;15821:34;15801:18;;;15794:62;-1:-1:-1;;;15872:18:1;;;15865:42;15924:19;;29408:76:0;15541:408:1;29408:76:0;-1:-1:-1;;;;;;29510:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29510:27:0;;29324:222::o;24733:94::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;24798:21:::1;24816:1;24798:9;:21::i;:::-;24733:94::o:0;47436:129::-;-1:-1:-1;;;;;;;;;;;;;;;;;47539:20:0;47551:7;47539:11;:20::i;30688:104::-;30744:13;30777:7;30770:14;;;;;:::i;32370:289::-;-1:-1:-1;;;;;32465:24:0;;19904:10;32465:24;;32457:64;;;;-1:-1:-1;;;32457:64:0;;16156:2:1;32457:64:0;;;16138:21:1;16195:2;16175:18;;;16168:30;16234:29;16214:18;;;16207:57;16281:18;;32457:64:0;15954:351:1;32457:64:0;19904:10;32534:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32534:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32534:53:0;;;;;;;;;;32603:48;;540:41:1;;;32534:42:0;;19904:10;32603:48;;513:18:1;32603:48:0;;;;;;;32370:289;;:::o;44638:433::-;27176:9;27189:10;27176:23;27168:66;;;;-1:-1:-1;;;27168:66:0;;16512:2:1;27168:66:0;;;16494:21:1;16551:2;16531:18;;;16524:30;16590:32;16570:18;;;16563:60;16640:18;;27168:66:0;16310:354:1;27168:66:0;1784:1:::1;2380:7;;:19;;2372:63;;;;-1:-1:-1::0;;;2372:63:0::1;;;;;;;:::i;:::-;1784:1;2513:7;:18:::0;44738::::2;::::0;::::2;;44730:53;;;::::0;-1:-1:-1;;;44730:53:0;;16871:2:1;44730:53:0::2;::::0;::::2;16853:21:1::0;16910:2;16890:18;;;16883:30;-1:-1:-1;;;16929:18:1;;;16922:52;16991:18;;44730:53:0::2;16669:346:1::0;44730:53:0::2;44810:14;;44798:8;:26;;44790:69;;;::::0;-1:-1:-1;;;44790:69:0;;17222:2:1;44790:69:0::2;::::0;::::2;17204:21:1::0;17261:2;17241:18;;;17234:30;17300:32;17280:18;;;17273:60;17350:18;;44790:69:0::2;17020:354:1::0;44790:69:0::2;44919:15;;44901:14;;44890:8;44874:13;27410:12:::0;;;27330:100;44874:13:::2;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:60;;44866:93;;;;-1:-1:-1::0;;;44866:93:0::2;;;;;;;:::i;:::-;44994:8;44987:4;;:15;;;;:::i;:::-;44974:9;:28;;44966:57;;;::::0;-1:-1:-1;;;44966:57:0;;12139:2:1;44966:57:0::2;::::0;::::2;12121:21:1::0;12178:2;12158:18;;;12151:30;-1:-1:-1;;;12197:18:1;;;12190:46;12253:18;;44966:57:0::2;11937:340:1::0;44966:57:0::2;45030:35;45040:10;45052:8;45030:35;;;;;;;;;;;::::0;:9:::2;:35::i;48135:105::-:0;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;48204:18:::1;:30:::0;;-1:-1:-1;;48204:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48135:105::o;33442:356::-;33601:28;33611:4;33617:2;33621:7;33601:9;:28::i;:::-;33662:48;33685:4;33691:2;33695:7;33704:5;33662:22;:48::i;:::-;33640:150;;;;-1:-1:-1;;;33640:150:0;;;;;;;:::i;:::-;33442:356;;;;:::o;42959:467::-;43091:4;43106:14;43144:7;24128;24155:6;-1:-1:-1;;;;;24155:6:0;;24082:87;43144:7;43133:25;;;-1:-1:-1;;;;;18030:15:1;;;43133:25:0;;;18012:34:1;18082:15;;;18062:18;;;18055:43;17947:18;;43133:25:0;;;-1:-1:-1;;43133:25:0;;;;;;;;;43123:36;;43133:25;43123:36;;;;43168:14;43185:29;;;;;;;;;18336:25:1;;;18409:4;18397:17;;18377:18;;;18370:45;;;;18431:18;;;18424:34;;;18474:18;;;18467:34;;;43123:36:0;;-1:-1:-1;43168:14:0;43185:29;;18308:19:1;;43185:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43185:29:0;;-1:-1:-1;;43185:29:0;;;-1:-1:-1;;;;;;;43231:20:0;;43223:57;;;;-1:-1:-1;;;43223:57:0;;18714:2:1;43223:57:0;;;18696:21:1;18753:2;18733:18;;;18726:30;18792:26;18772:18;;;18765:54;18836:18;;43223:57:0;18512:348:1;43223:57:0;43329:13;;-1:-1:-1;;;;;43329:23:0;;;:13;;:23;43321:60;;;;-1:-1:-1;;;43321:60:0;;19067:2:1;43321:60:0;;;19049:21:1;19106:2;19086:18;;;19079:30;19145:26;19125:18;;;19118:54;19189:18;;43321:60:0;18865:348:1;43321:60:0;43407:13;;-1:-1:-1;;;;;43397:23:0;;;43407:13;;43397:23;;-1:-1:-1;;42959:467:0;;;;;;;:::o;43678:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30863:334::-;30936:13;30970:16;30978:7;34144:12;;-1:-1:-1;34134:22:0;34053:111;30970:16;30962:76;;;;-1:-1:-1;;;30962:76:0;;19420:2:1;30962:76:0;;;19402:21:1;19459:2;19439:18;;;19432:30;19498:34;19478:18;;;19471:62;-1:-1:-1;;;19549:18:1;;;19542:45;19604:19;;30962:76:0;19218:411:1;30962:76:0;31051:21;31075:10;:8;:10::i;:::-;31051:34;;31127:1;31109:7;31103:21;:25;:86;;;;;;;;;;;;;;;;;31155:7;31164:18;:7;:16;:18::i;:::-;31138:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31103:86;31096:93;30863:334;-1:-1:-1;;;30863:334:0:o;47585:110::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;47664:25:::1;:14;47681:8:::0;;47664:25:::1;:::i;46822:243::-:0;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;46967:41:::1;::::0;46898:42:::1;::::0;46877:10:::1;::::0;46898:42;;46982:21:::1;::::0;46877:10;46967:41;46877:10;46967:41;46982:21;46898:42;46967:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46948:60;;;47023:7;47015:44;;;;-1:-1:-1::0;;;47015:44:0::1;;;;;;;:::i;:::-;46870:195;;46822:243::o:0;47321:107::-;47379:7;47402:20;47416:5;47402:13;:20::i;47809:102::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;47880:15:::1;:25:::0;47809:102::o;24982:192::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25071:22:0;::::1;25063:73;;;::::0;-1:-1:-1;;;25063:73:0;;20311:2:1;25063:73:0::1;::::0;::::1;20293:21:1::0;20350:2;20330:18;;;20323:30;20389:34;20369:18;;;20362:62;-1:-1:-1;;;20440:18:1;;;20433:36;20486:19;;25063:73:0::1;20109:402:1::0;25063:73:0::1;25147:19;25157:8;25147:9;:19::i;:::-;24982:192:::0;:::o;47917:108::-;24128:7;24155:6;-1:-1:-1;;;;;24155:6:0;19904:10;24302:23;24294:68;;;;-1:-1:-1;;;24294:68:0;;;;;;;:::i;:::-;47991:18:::1;:28:::0;47917:108::o;38123:196::-;38238:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;38238:29:0;-1:-1:-1;;;;;38238:29:0;;;;;;;;;38283:28;;38238:24;;38283:28;;;;;;;38123:196;;;:::o;34553:1328::-;34699:12;;-1:-1:-1;;;;;34730:16:0;;34722:63;;;;-1:-1:-1;;;34722:63:0;;20718:2:1;34722:63:0;;;20700:21:1;20757:2;20737:18;;;20730:30;20796:34;20776:18;;;20769:62;-1:-1:-1;;;20847:18:1;;;20840:32;20889:19;;34722:63:0;20516:398:1;34722:63:0;34930:21;34938:12;34144;;-1:-1:-1;34134:22:0;34053:111;34930:21;34929:22;34921:65;;;;-1:-1:-1;;;34921:65:0;;21121:2:1;34921:65:0;;;21103:21:1;21160:2;21140:18;;;21133:30;21199:32;21179:18;;;21172:60;21249:18;;34921:65:0;20919:354:1;34921:65:0;35016:1;35005:8;:12;34997:61;;;;-1:-1:-1;;;34997:61:0;;21480:2:1;34997:61:0;;;21462:21:1;21519:2;21499:18;;;21492:30;21558:34;21538:18;;;21531:62;-1:-1:-1;;;21609:18:1;;;21602:34;21653:19;;34997:61:0;21278:400:1;34997:61:0;-1:-1:-1;;;;;35145:16:0;;;;;;:12;:16;;;;;:45;;35181:8;;35145:16;:45;;35181:8;;-1:-1:-1;;;;;35145:45:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;35145:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35201:16:0;;-1:-1:-1;35201:16:0;;;:12;:16;;;;;:50;;35242:8;;-1:-1:-1;35201:16:0;;:29;;:50;;35242:8;;-1:-1:-1;;;35201:50:0;;;;:::i;:::-;;;-1:-1:-1;;;;;35201:50:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35264:25:0;;;:11;:25;;;;;:35;;35310:66;35360:15;35310:66;-1:-1:-1;;;35310:66:0;-1:-1:-1;;;;;;35310:66:0;;;-1:-1:-1;;;;;35264:35:0;;35310:66;;;;35276:12;;35437:326;35461:8;35457:1;:12;35437:326;;;35496:38;;35521:12;;-1:-1:-1;;;;;35496:38:0;;;35513:1;;35496:38;;35513:1;;35496:38;35575:59;35606:1;35610:2;35614:12;35628:5;35575:22;:59::i;:::-;35549:173;;;;-1:-1:-1;;;35549:173:0;;;;;;;:::i;:::-;35737:14;;;;:::i;:::-;;;;35471:3;;;;;:::i;:::-;;;;35437:326;;;-1:-1:-1;35775:12:0;:27;-1:-1:-1;;;;34553:1328:0:o;36135:1870::-;36250:35;36288:20;36300:7;36288:11;:20::i;:::-;36363:18;;36250:58;;-1:-1:-1;36321:22:0;;-1:-1:-1;;;;;36347:34:0;19904:10;-1:-1:-1;;;;;36347:34:0;;:87;;;-1:-1:-1;19904:10:0;36398:20;36410:7;36398:11;:20::i;:::-;-1:-1:-1;;;;;36398:36:0;;36347:87;:154;;;-1:-1:-1;36468:18:0;;36451:50;;19904:10;32730:164;:::i;36451:50::-;36321:181;;36523:17;36515:81;;;;-1:-1:-1;;;36515:81:0;;22143:2:1;36515:81:0;;;22125:21:1;22182:2;22162:18;;;22155:30;22221:34;22201:18;;;22194:62;-1:-1:-1;;;22272:18:1;;;22265:49;22331:19;;36515:81:0;21941:415:1;36515:81:0;36639:4;-1:-1:-1;;;;;36617:26:0;:13;:18;;;-1:-1:-1;;;;;36617:26:0;;36609:78;;;;-1:-1:-1;;;36609:78:0;;22563:2:1;36609:78:0;;;22545:21:1;22602:2;22582:18;;;22575:30;22641:34;22621:18;;;22614:62;-1:-1:-1;;;22692:18:1;;;22685:37;22739:19;;36609:78:0;22361:403:1;36609:78:0;-1:-1:-1;;;;;36706:16:0;;36698:67;;;;-1:-1:-1;;;36698:67:0;;22971:2:1;36698:67:0;;;22953:21:1;23010:2;22990:18;;;22983:30;23049:34;23029:18;;;23022:62;-1:-1:-1;;;23100:18:1;;;23093:36;23146:19;;36698:67:0;22769:402:1;36698:67:0;36886:49;36903:1;36907:7;36916:13;:18;;;36886:8;:49::i;:::-;-1:-1:-1;;;;;37140:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37140:31:0;;;-1:-1:-1;;;;;37140:31:0;;;-1:-1:-1;;37140:31:0;;;;;;;37186:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37186:29:0;;;;;;;;;;;;;37239:20;;;:11;:20;;;;;:30;;-1:-1:-1;;;;;;37280:61:0;;;;-1:-1:-1;;;37325:15:0;37280:61;;;;;;37140:18;37603:11;;37239:20;;37603:11;:::i;:::-;37670:1;37629:24;;;:11;:24;;;;;:29;37581:33;;-1:-1:-1;;;;;;37629:29:0;37625:275;;37693:20;37701:11;34144:12;;-1:-1:-1;34134:22:0;34053:111;37693:20;37689:200;;;37766:18;;;37734:24;;;:11;:24;;;;;;;;:50;;37845:28;;;;37803:70;;-1:-1:-1;;;37803:70:0;-1:-1:-1;;;;;;37803:70:0;;;-1:-1:-1;;;;;37734:50:0;;;37803:70;;;;;;;37689:200;37936:7;37932:2;-1:-1:-1;;;;;37917:27:0;37926:4;-1:-1:-1;;;;;37917:27:0;;;;;;;;;;;37955:42;33442:356;38479:961;38564:1;38553:8;:12;38545:59;;;;-1:-1:-1;;;38545:59:0;;23378:2:1;38545:59:0;;;23360:21:1;23417:2;23397:18;;;23390:30;23456:34;23436:18;;;23429:62;-1:-1:-1;;;23507:18:1;;;23500:32;23549:19;;38545:59:0;23176:398:1;38545:59:0;38638:1;38623:12;;:16;38615:49;;;;-1:-1:-1;;;38615:49:0;;23781:2:1;38615:49:0;;;23763:21:1;23820:2;23800:18;;;23793:30;-1:-1:-1;;;23839:18:1;;;23832:50;23899:18;;38615:49:0;23579:344:1;38615:49:0;38710:12;;38683:24;;:39;38675:80;;;;-1:-1:-1;;;38675:80:0;;24130:2:1;38675:80:0;;;24112:21:1;24169:2;24149:18;;;24142:30;24208;24188:18;;;24181:58;24256:18;;38675:80:0;23928:352:1;38675:80:0;38796:24;;38768:25;38881:1;38850:28;38870:8;38796:24;38850:28;:::i;:::-;:32;;;;:::i;:::-;38831:51;;38980:1;38965:12;;:16;;;;:::i;:::-;38954:8;:27;38950:87;;;39024:1;39009:12;;:16;;;;:::i;:::-;38998:27;;38950:87;39066:17;39049:334;39090:8;39085:1;:13;39049:334;;39155:1;39124:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;39124:19:0;39120:252;;39178:31;39212:14;39224:1;39212:11;:14::i;:::-;39267;;;39245;;;:11;:14;;;;;;;;:36;;39332:24;;;;;39300:56;;-1:-1:-1;;;39300:56:0;-1:-1:-1;;;;;;39300:56:0;;;-1:-1:-1;;;;;39245:36:0;;;39300:56;;;;;;;-1:-1:-1;39120:252:0;39100:3;;;;:::i;:::-;;;;39049:334;;;-1:-1:-1;39420:12:0;:8;39431:1;39420:12;:::i;:::-;39393:24;:39;-1:-1:-1;;;38479:961:0:o;29792:474::-;-1:-1:-1;;;;;;;;;;;;;;;;;29895:16:0;29903:7;34144:12;;-1:-1:-1;34134:22:0;34053:111;29895:16;29887:72;;;;-1:-1:-1;;;29887:72:0;;24487:2:1;29887:72:0;;;24469:21:1;24526:2;24506:18;;;24499:30;24565:34;24545:18;;;24538:62;-1:-1:-1;;;24616:18:1;;;24609:41;24667:19;;29887:72:0;24285:407:1;29887:72:0;29992:7;29972:216;30026:31;30060:17;;;:11;:17;;;;;;;;;30026:51;;;;;;;;;-1:-1:-1;;;;;30026:51:0;;;;;-1:-1:-1;;;30026:51:0;;;;;;;;;;;;30096:28;30092:85;;30152:9;29792:474;-1:-1:-1;;;29792:474:0:o;30092:85::-;-1:-1:-1;30003:6:0;;;;:::i;:::-;;;;29972:216;;25182:173;25238:16;25257:6;;-1:-1:-1;;;;;25274:17:0;;;-1:-1:-1;;;;;;25274:17:0;;;;;;25307:40;;25257:6;;;;;;;25307:40;;25238:16;25307:40;25227:128;25182:173;:::o;40008:805::-;40163:4;-1:-1:-1;;;;;40184:13:0;;12183:20;12231:8;40180:626;;40220:72;;-1:-1:-1;;;40220:72:0;;-1:-1:-1;;;;;40220:36:0;;;;;:72;;19904:10;;40271:4;;40277:7;;40286:5;;40220:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40220:72:0;;;;;;;;-1:-1:-1;;40220:72:0;;;;;;;;;;;;:::i;:::-;;;40216:535;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40466:13:0;;40462:274;;40509:62;;-1:-1:-1;;;40509:62:0;;;;;;;:::i;40462:274::-;40686:6;40680:13;40671:6;40667:2;40663:15;40656:38;40216:535;-1:-1:-1;;;;;;40343:55:0;-1:-1:-1;;;40343:55:0;;-1:-1:-1;40336:62:0;;40180:626;-1:-1:-1;40790:4:0;40783:11;;47087:108;47147:13;47176;47169:20;;;;;:::i;21319:723::-;21375:13;21596:10;21592:53;;-1:-1:-1;;21623:10:0;;;;;;;;;;;;-1:-1:-1;;;21623:10:0;;;;;21319:723::o;21592:53::-;21670:5;21655:12;21711:78;21718:9;;21711:78;;21744:8;;;;:::i;:::-;;-1:-1:-1;21767:10:0;;-1:-1:-1;21775:2:0;21767:10;;:::i;:::-;;;21711:78;;;21799:19;21831:6;21821:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21821:17:0;;21799:39;;21849:154;21856:10;;21849:154;;21883:11;21893:1;21883:11;;:::i;:::-;;-1:-1:-1;21952:10:0;21960:2;21952:5;:10;:::i;:::-;21939:24;;:2;:24;:::i;:::-;21926:39;;21909:6;21916;21909:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;21909:56:0;;;;;;;;-1:-1:-1;21980:11:0;21989:2;21980:11;;:::i;:::-;;;21849:154;;29554:230;29615:7;-1:-1:-1;;;;;29643:19:0;;29635:82;;;;-1:-1:-1;;;29635:82:0;;26322:2:1;29635:82:0;;;26304:21:1;26361:2;26341:18;;;26334:30;26400:34;26380:18;;;26373:62;-1:-1:-1;;;26451:18:1;;;26444:48;26509:19;;29635:82:0;26120:414:1;29635:82:0;-1:-1:-1;;;;;;29743:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;29743:32:0;;-1:-1:-1;;;;;29743:32:0;;29554:230::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;961:180::-;1020:6;1073:2;1061:9;1052:7;1048:23;1044:32;1041:52;;;1089:1;1086;1079:12;1041:52;-1:-1:-1;1112:23:1;;961:180;-1:-1:-1;961:180:1:o;1146:258::-;1218:1;1228:113;1242:6;1239:1;1236:13;1228:113;;;1318:11;;;1312:18;1299:11;;;1292:39;1264:2;1257:10;1228:113;;;1359:6;1356:1;1353:13;1350:48;;;-1:-1:-1;;1394:1:1;1376:16;;1369:27;1146:258::o;1409:::-;1451:3;1489:5;1483:12;1516:6;1511:3;1504:19;1532:63;1588:6;1581:4;1576:3;1572:14;1565:4;1558:5;1554:16;1532:63;:::i;:::-;1649:2;1628:15;-1:-1:-1;;1624:29:1;1615:39;;;;1656:4;1611:50;;1409:258;-1:-1:-1;;1409:258:1:o;1672:220::-;1821:2;1810:9;1803:21;1784:4;1841:45;1882:2;1871:9;1867:18;1859:6;1841:45;:::i;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2546:156::-;2612:20;;2672:4;2661:16;;2651:27;;2641:55;;2692:1;2689;2682:12;2707:387;2791:6;2799;2807;2815;2868:3;2856:9;2847:7;2843:23;2839:33;2836:53;;;2885:1;2882;2875:12;2836:53;2921:9;2908:23;2898:33;;2978:2;2967:9;2963:18;2950:32;2940:42;;3029:2;3018:9;3014:18;3001:32;2991:42;;3052:36;3084:2;3073:9;3069:18;3052:36;:::i;:::-;3042:46;;2707:387;;;;;;;:::o;3099:328::-;3176:6;3184;3192;3245:2;3233:9;3224:7;3220:23;3216:32;3213:52;;;3261:1;3258;3251:12;3213:52;3284:29;3303:9;3284:29;:::i;:::-;3274:39;;3332:38;3366:2;3355:9;3351:18;3332:38;:::i;:::-;3322:48;;3417:2;3406:9;3402:18;3389:32;3379:42;;3099:328;;;;;:::o;3432:367::-;3495:8;3505:6;3559:3;3552:4;3544:6;3540:17;3536:27;3526:55;;3577:1;3574;3567:12;3526:55;-1:-1:-1;3600:20:1;;3643:18;3632:30;;3629:50;;;3675:1;3672;3665:12;3629:50;3712:4;3704:6;3700:17;3688:29;;3772:3;3765:4;3755:6;3752:1;3748:14;3740:6;3736:27;3732:38;3729:47;3726:67;;;3789:1;3786;3779:12;3726:67;3432:367;;;;;:::o;3804:773::-;3926:6;3934;3942;3950;4003:2;3991:9;3982:7;3978:23;3974:32;3971:52;;;4019:1;4016;4009:12;3971:52;4059:9;4046:23;4088:18;4129:2;4121:6;4118:14;4115:34;;;4145:1;4142;4135:12;4115:34;4184:70;4246:7;4237:6;4226:9;4222:22;4184:70;:::i;:::-;4273:8;;-1:-1:-1;4158:96:1;-1:-1:-1;4361:2:1;4346:18;;4333:32;;-1:-1:-1;4377:16:1;;;4374:36;;;4406:1;4403;4396:12;4374:36;;4445:72;4509:7;4498:8;4487:9;4483:24;4445:72;:::i;:::-;3804:773;;;;-1:-1:-1;4536:8:1;-1:-1:-1;;;;3804:773:1:o;4582:160::-;4647:20;;4703:13;;4696:21;4686:32;;4676:60;;4732:1;4729;4722:12;4747:180;4803:6;4856:2;4844:9;4835:7;4831:23;4827:32;4824:52;;;4872:1;4869;4862:12;4824:52;4895:26;4911:9;4895:26;:::i;4932:592::-;5003:6;5011;5064:2;5052:9;5043:7;5039:23;5035:32;5032:52;;;5080:1;5077;5070:12;5032:52;5120:9;5107:23;5149:18;5190:2;5182:6;5179:14;5176:34;;;5206:1;5203;5196:12;5176:34;5244:6;5233:9;5229:22;5219:32;;5289:7;5282:4;5278:2;5274:13;5270:27;5260:55;;5311:1;5308;5301:12;5260:55;5351:2;5338:16;5377:2;5369:6;5366:14;5363:34;;;5393:1;5390;5383:12;5363:34;5438:7;5433:2;5424:6;5420:2;5416:15;5412:24;5409:37;5406:57;;;5459:1;5456;5449:12;5406:57;5490:2;5482:11;;;;;5512:6;;-1:-1:-1;4932:592:1;;-1:-1:-1;;;;4932:592:1:o;5894:254::-;5959:6;5967;6020:2;6008:9;5999:7;5995:23;5991:32;5988:52;;;6036:1;6033;6026:12;5988:52;6059:29;6078:9;6059:29;:::i;:::-;6049:39;;6107:35;6138:2;6127:9;6123:18;6107:35;:::i;:::-;6097:45;;5894:254;;;;;:::o;6153:127::-;6214:10;6209:3;6205:20;6202:1;6195:31;6245:4;6242:1;6235:15;6269:4;6266:1;6259:15;6285:1138;6380:6;6388;6396;6404;6457:3;6445:9;6436:7;6432:23;6428:33;6425:53;;;6474:1;6471;6464:12;6425:53;6497:29;6516:9;6497:29;:::i;:::-;6487:39;;6545:38;6579:2;6568:9;6564:18;6545:38;:::i;:::-;6535:48;;6630:2;6619:9;6615:18;6602:32;6592:42;;6685:2;6674:9;6670:18;6657:32;6708:18;6749:2;6741:6;6738:14;6735:34;;;6765:1;6762;6755:12;6735:34;6803:6;6792:9;6788:22;6778:32;;6848:7;6841:4;6837:2;6833:13;6829:27;6819:55;;6870:1;6867;6860:12;6819:55;6906:2;6893:16;6928:2;6924;6921:10;6918:36;;;6934:18;;:::i;:::-;7009:2;7003:9;6977:2;7063:13;;-1:-1:-1;;7059:22:1;;;7083:2;7055:31;7051:40;7039:53;;;7107:18;;;7127:22;;;7104:46;7101:72;;;7153:18;;:::i;:::-;7193:10;7189:2;7182:22;7228:2;7220:6;7213:18;7268:7;7263:2;7258;7254;7250:11;7246:20;7243:33;7240:53;;;7289:1;7286;7279:12;7240:53;7345:2;7340;7336;7332:11;7327:2;7319:6;7315:15;7302:46;7390:1;7385:2;7380;7372:6;7368:15;7364:24;7357:35;7411:6;7401:16;;;;;;;6285:1138;;;;;;;:::o;7428:393::-;7512:6;7520;7528;7536;7589:3;7577:9;7568:7;7564:23;7560:33;7557:53;;;7606:1;7603;7596:12;7557:53;7629:29;7648:9;7629:29;:::i;:::-;7619:39;;7705:2;7694:9;7690:18;7677:32;7667:42;;7756:2;7745:9;7741:18;7728:32;7718:42;;7779:36;7811:2;7800:9;7796:18;7779:36;:::i;7826:260::-;7894:6;7902;7955:2;7943:9;7934:7;7930:23;7926:32;7923:52;;;7971:1;7968;7961:12;7923:52;7994:29;8013:9;7994:29;:::i;:::-;7984:39;;8042:38;8076:2;8065:9;8061:18;8042:38;:::i;8091:356::-;8293:2;8275:21;;;8312:18;;;8305:30;8371:34;8366:2;8351:18;;8344:62;8438:2;8423:18;;8091:356::o;8452:380::-;8531:1;8527:12;;;;8574;;;8595:61;;8649:4;8641:6;8637:17;8627:27;;8595:61;8702:2;8694:6;8691:14;8671:18;8668:38;8665:161;;;8748:10;8743:3;8739:20;8736:1;8729:31;8783:4;8780:1;8773:15;8811:4;8808:1;8801:15;8665:161;;8452:380;;;:::o;10083:355::-;10285:2;10267:21;;;10324:2;10304:18;;;10297:30;10363:33;10358:2;10343:18;;10336:61;10429:2;10414:18;;10083:355::o;10790:127::-;10851:10;10846:3;10842:20;10839:1;10832:31;10882:4;10879:1;10872:15;10906:4;10903:1;10896:15;10922:128;10962:3;10993:1;10989:6;10986:1;10983:13;10980:39;;;10999:18;;:::i;:::-;-1:-1:-1;11035:9:1;;10922:128::o;11415:344::-;11617:2;11599:21;;;11656:2;11636:18;;;11629:30;-1:-1:-1;;;11690:2:1;11675:18;;11668:50;11750:2;11735:18;;11415:344::o;11764:168::-;11804:7;11870:1;11866;11862:6;11858:14;11855:1;11852:21;11847:1;11840:9;11833:17;11829:45;11826:71;;;11877:18;;:::i;:::-;-1:-1:-1;11917:9:1;;11764:168::o;12690:127::-;12751:10;12746:3;12742:20;12739:1;12732:31;12782:4;12779:1;12772:15;12806:4;12803:1;12796:15;12822:135;12861:3;-1:-1:-1;;12882:17:1;;12879:43;;;12902:18;;:::i;:::-;-1:-1:-1;12949:1:1;12938:13;;12822:135::o;13366:125::-;13406:4;13434:1;13431;13428:8;13425:34;;;13439:18;;:::i;:::-;-1:-1:-1;13476:9:1;;13366:125::o;14316:127::-;14377:10;14372:3;14368:20;14365:1;14358:31;14408:4;14405:1;14398:15;14432:4;14429:1;14422:15;14448:120;14488:1;14514;14504:35;;14519:18;;:::i;:::-;-1:-1:-1;14553:9:1;;14448:120::o;14783:348::-;14985:2;14967:21;;;15024:2;15004:18;;;14997:30;15063:26;15058:2;15043:18;;15036:54;15122:2;15107:18;;14783:348::o;17379:416::-;17581:2;17563:21;;;17620:2;17600:18;;;17593:30;17659:34;17654:2;17639:18;;17632:62;-1:-1:-1;;;17725:2:1;17710:18;;17703:50;17785:3;17770:19;;17379:416::o;19634:470::-;19813:3;19851:6;19845:13;19867:53;19913:6;19908:3;19901:4;19893:6;19889:17;19867:53;:::i;:::-;19983:13;;19942:16;;;;20005:57;19983:13;19942:16;20039:4;20027:17;;20005:57;:::i;:::-;20078:20;;19634:470;-1:-1:-1;;;;19634:470:1:o;21683:253::-;21723:3;-1:-1:-1;;;;;21812:2:1;21809:1;21805:10;21842:2;21839:1;21835:10;21873:3;21869:2;21865:12;21860:3;21857:21;21854:47;;;21881:18;;:::i;24697:136::-;24736:3;24764:5;24754:39;;24773:18;;:::i;:::-;-1:-1:-1;;;24809:18:1;;24697:136::o;25255:489::-;-1:-1:-1;;;;;25524:15:1;;;25506:34;;25576:15;;25571:2;25556:18;;25549:43;25623:2;25608:18;;25601:34;;;25671:3;25666:2;25651:18;;25644:31;;;25449:4;;25692:46;;25718:19;;25710:6;25692:46;:::i;:::-;25684:54;25255:489;-1:-1:-1;;;;;;25255:489:1:o;25749:249::-;25818:6;25871:2;25859:9;25850:7;25846:23;25842:32;25839:52;;;25887:1;25884;25877:12;25839:52;25919:9;25913:16;25938:30;25962:5;25938:30;:::i;26003:112::-;26035:1;26061;26051:35;;26066:18;;:::i;:::-;-1:-1:-1;26100:9:1;;26003:112::o

Swarm Source

ipfs://c4c177af4844e4ce425b587470d96e1e4dade2d77e69a8e31ba3cf81062964c3
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.