ETH Price: $3,145.61 (+2.39%)
Gas: 13 Gwei

Token

WGMI Premium Membership (WGMI)
 

Overview

Max Total Supply

4,198 WGMI

Holders

3,837

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WGMI
0xa1e4f7dc1983fefe37e2175524ebad87f1c78c3c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The WGMI Premium Member Token provides access to all wgmi.io premium features.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WgmiNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-23
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // 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/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

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/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

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

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


// OpenZeppelin Contracts v4.4.1 (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 tokenId);

    /**
     * @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/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: contracts/WgmiNFTContract.sol



pragma solidity 0.8.7;








/**
 * @title WgmiNFT Contract
 * @author @wgmi_io
 * https://wgmi.io
 */

interface IWgmiRegister {
    function isAddressRegistered(address _account) external view returns (bool);
}

contract WgmiNFT is ERC721Burnable, ERC721Enumerable, ReentrancyGuard, Ownable {
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    // Events
    event Claim(address indexed _address);

    Counters.Counter private _tokenIdTracker;

    // set on contract deployment
    uint256 public maxSupply;

    address private _wgmiRegisterAddress;
    string private _baseTokenURI;
    string private _contractURI;

    // 50 reserved for promotional purposes (i.e giveaways & contests)
    uint256 public wgmiReserve = 50;
    // Reserve can only be minted once
    bool public hasMintedReserve = false;

    // Enable/disable claim
    bool public isClaimActive = false;

    mapping(address => bool) private hasClaimed;

    // Construct with a name, symbol, max supply, and base token URI.
    constructor(
        string memory name,
        string memory symbol,
        uint256 _maxSupply,
        string memory baseTokenURI
    ) ERC721(name, symbol) {
        maxSupply = _maxSupply;
        _baseTokenURI = baseTokenURI;
        // Sets token ID to start at '1' for UX.
        _tokenIdTracker.increment();
    }

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

    function baseURI() public view returns (string memory) {
        return _baseURI();
    }

    function wgmiRegisterAddress() public view returns (address) {
        return _wgmiRegisterAddress;
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // See {IERC165-supportsInterface}.
    function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721, ERC721Enumerable)
    returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    // Check if an address is eligible to claim NFT
    function canClaim(address _address) public view returns (bool) {
        return
        IWgmiRegister(_wgmiRegisterAddress).isAddressRegistered(_address) &&
        !hasClaimed[_address];
    }

    // Claim WgmiNFT
    function claim() external nonReentrant {
        require(isClaimActive == true, "Claim is not active");
        address _claimer = _msgSender();

        bool _canClaim = canClaim(_claimer);
        require(_canClaim == true, "Not eligible to claim");

        uint256 _totalSupply = totalSupply();
        uint256 total = _totalSupply.add(1);
        require(total <= maxSupply, "Claim would exceed max supply");

        hasClaimed[_claimer] = true;
        _safeMint(_msgSender(), _tokenIdTracker.current());
        _tokenIdTracker.increment();

        emit Claim(_claimer);
    }

    /*
     *   ADMIN FUNCTIONS
     */

    // Allows `owner` to toggle if claiming is active
    function toggleIsClaimActive() external nonReentrant onlyOwner {
        isClaimActive = !isClaimActive;
    }

    function withdraw() external nonReentrant onlyOwner {
        address owner = _msgSender();
        uint256 balance = address(this).balance;
        payable(owner).transfer(balance);
    }

    // Ability to change the URI. i.e self hosted api -> ipfs
    function setBaseURI(string memory _newBaseURI)
    external
    nonReentrant
    onlyOwner
    {
        _baseTokenURI = _newBaseURI;
    }

    // Ability to change the contractURI. i.e self hosted api -> ipfs
    function setContractURI(string memory _newContractURI)
    external
    nonReentrant
    onlyOwner
    {
        _contractURI = _newContractURI;
    }

    // Set the OG WGMI Contract
    function setWgmiRegisterAddress(address _newWgmiRegisterAddress)
    external
    nonReentrant
    onlyOwner
    {
        _wgmiRegisterAddress = _newWgmiRegisterAddress;
    }

    // 50 reserved for promotional purposes (i.e giveaways & contests).
    function mintReserve() external nonReentrant onlyOwner {
        require(hasMintedReserve == false, "Has already claimed reserve");
        uint256 _totalSupply = totalSupply();
        uint256 total = _totalSupply.add(wgmiReserve);
        require(total <= maxSupply, "Claim would exceed max supply");

        for (uint256 i = 0; i < wgmiReserve; i++) {
            if (totalSupply() <= maxSupply) {
                _safeMint(_msgSender(), _tokenIdTracker.current());
                _tokenIdTracker.increment();
            }
        }
        hasMintedReserve = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"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":"_address","type":"address"}],"name":"Claim","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"},{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasMintedReserve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWgmiRegisterAddress","type":"address"}],"name":"setWgmiRegisterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleIsClaimActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"wgmiRegisterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wgmiReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260326011556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055503480156200004c57600080fd5b5060405162004ce638038062004ce683398181016040528101906200007291906200033a565b838381600090805190602001906200008c929190620001f5565b508060019080519060200190620000a5929190620001f5565b5050506001600a81905550620000d0620000c46200011160201b60201c565b6200011960201b60201c565b81600d8190555080600f9080519060200190620000ef929190620001f5565b5062000107600c620001df60201b62001b541760201c565b50505050620005b1565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8280546200020390620004a8565b90600052602060002090601f01602090048101928262000227576000855562000273565b82601f106200024257805160ff191683800117855562000273565b8280016001018555821562000273579182015b828111156200027257825182559160200191906001019062000255565b5b50905062000282919062000286565b5090565b5b80821115620002a157600081600090555060010162000287565b5090565b6000620002bc620002b68462000432565b62000409565b905082815260208101848484011115620002db57620002da62000577565b5b620002e884828562000472565b509392505050565b600082601f83011262000308576200030762000572565b5b81516200031a848260208601620002a5565b91505092915050565b600081519050620003348162000597565b92915050565b6000806000806080858703121562000357576200035662000581565b5b600085015167ffffffffffffffff8111156200037857620003776200057c565b5b6200038687828801620002f0565b945050602085015167ffffffffffffffff811115620003aa57620003a96200057c565b5b620003b887828801620002f0565b9350506040620003cb8782880162000323565b925050606085015167ffffffffffffffff811115620003ef57620003ee6200057c565b5b620003fd87828801620002f0565b91505092959194509250565b60006200041562000428565b9050620004238282620004de565b919050565b6000604051905090565b600067ffffffffffffffff82111562000450576200044f62000543565b5b6200045b8262000586565b9050602081019050919050565b6000819050919050565b60005b838110156200049257808201518184015260208101905062000475565b83811115620004a2576000848401525b50505050565b60006002820490506001821680620004c157607f821691505b60208210811415620004d857620004d762000514565b5b50919050565b620004e98262000586565b810181811067ffffffffffffffff821117156200050b576200050a62000543565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620005a28162000468565b8114620005ae57600080fd5b50565b61472580620005c16000396000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c80636352211e1161012557806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd146105a1578063d5abeb01146105d1578063e8a3d485146105ef578063e985e9c51461060d578063f2fde38b1461063d57610210565b806395d89b411461051b578063a22cb46514610539578063b88d4fde14610555578063bf3506c11461057157610210565b8063715018a6116100f4578063715018a6146104af5780637fc27803146104b9578063890ac366146104d75780638da5cb5b146104e1578063938e3d7b146104ff57610210565b80636352211e146104275780636c0360eb146104575780636daa18f81461047557806370a082311461047f57610210565b80632f745c59116101a85780634e71d92d116101775780634e71d92d146103955780634f6ccce71461039f57806355f804b3146103cf57806357b72af5146103eb5780635fae51d21461040957610210565b80632f745c59146103235780633ccfd60b1461035357806342842e0e1461035d57806342966c681461037957610210565b8063081812fc116101e4578063081812fc1461029d578063095ea7b3146102cd57806318160ddd146102e957806323b872dd1461030757610210565b80626cf05214610215578063018f5c5f1461023157806301ffc9a71461024f57806306fdde031461027f575b600080fd5b61022f600480360381019061022a919061316f565b610659565b005b61023961076f565b604051610246919061386b565b60405180910390f35b6102696004803603810190610264919061335f565b610799565b60405161027691906138d2565b60405180910390f35b6102876107ab565b60405161029491906138ed565b60405180910390f35b6102b760048036038101906102b29190613402565b61083d565b6040516102c4919061386b565b60405180910390f35b6102e760048036038101906102e291906132f2565b6108c2565b005b6102f16109da565b6040516102fe9190613c0f565b60405180910390f35b610321600480360381019061031c91906131dc565b6109e7565b005b61033d600480360381019061033891906132f2565b610a47565b60405161034a9190613c0f565b60405180910390f35b61035b610aec565b005b610377600480360381019061037291906131dc565b610c1a565b005b610393600480360381019061038e9190613402565b610c3a565b005b61039d610c96565b005b6103b960048036038101906103b49190613402565b610ed0565b6040516103c69190613c0f565b60405180910390f35b6103e960048036038101906103e491906133b9565b610f41565b005b6103f361102d565b60405161040091906138d2565b60405180910390f35b610411611040565b60405161041e9190613c0f565b60405180910390f35b610441600480360381019061043c9190613402565b611046565b60405161044e919061386b565b60405180910390f35b61045f6110f8565b60405161046c91906138ed565b60405180910390f35b61047d611107565b005b6104996004803603810190610494919061316f565b611205565b6040516104a69190613c0f565b60405180910390f35b6104b76112bd565b005b6104c1611345565b6040516104ce91906138d2565b60405180910390f35b6104df611358565b005b6104e961155f565b6040516104f6919061386b565b60405180910390f35b610519600480360381019061051491906133b9565b611589565b005b610523611675565b60405161053091906138ed565b60405180910390f35b610553600480360381019061054e91906132b2565b611707565b005b61056f600480360381019061056a919061322f565b61171d565b005b61058b6004803603810190610586919061316f565b61177f565b60405161059891906138d2565b60405180910390f35b6105bb60048036038101906105b69190613402565b611889565b6040516105c891906138ed565b60405180910390f35b6105d9611930565b6040516105e69190613c0f565b60405180910390f35b6105f7611936565b60405161060491906138ed565b60405180910390f35b6106276004803603810190610622919061319c565b6119c8565b60405161063491906138d2565b60405180910390f35b6106576004803603810190610652919061316f565b611a5c565b005b6002600a54141561069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069690613bcf565b60405180910390fd5b6002600a819055506106af611b6a565b73ffffffffffffffffffffffffffffffffffffffff166106cd61155f565b73ffffffffffffffffffffffffffffffffffffffff1614610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90613acf565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a8190555050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006107a482611b72565b9050919050565b6060600080546107ba90613e65565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690613e65565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b5050505050905090565b600061084882611bec565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90613aaf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cd82611046565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590613b6f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095d611b6a565b73ffffffffffffffffffffffffffffffffffffffff16148061098c575061098b81610986611b6a565b6119c8565b5b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613a0f565b60405180910390fd5b6109d58383611c58565b505050565b6000600880549050905090565b6109f86109f2611b6a565b82611d11565b610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90613b8f565b60405180910390fd5b610a42838383611def565b505050565b6000610a5283611205565b8210610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a9061390f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990613bcf565b60405180910390fd5b6002600a81905550610b42611b6a565b73ffffffffffffffffffffffffffffffffffffffff16610b6061155f565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90613acf565b60405180910390fd5b6000610bc0611b6a565b905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c0d573d6000803e3d6000fd5b5050506001600a81905550565b610c358383836040518060200160405280600081525061171d565b505050565b610c4b610c45611b6a565b82611d11565b610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190613bef565b60405180910390fd5b610c938161204b565b50565b6002600a541415610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613bcf565b60405180910390fd5b6002600a8190555060011515601260019054906101000a900460ff16151514610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190613a8f565b60405180910390fd5b6000610d44611b6a565b90506000610d518261177f565b90506001151581151514610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d91906139ef565b60405180910390fd5b6000610da46109da565b90506000610dbc60018361215c90919063ffffffff16565b9050600d54811115610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa90613b2f565b60405180910390fd5b6001601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e75610e66611b6a565b610e70600c612172565b612180565b610e7f600c611b54565b8373ffffffffffffffffffffffffffffffffffffffff167f0c7ef932d3b91976772937f18d5ef9b39a9930bef486b576c374f047c4b512dc60405160405180910390a2505050506001600a81905550565b6000610eda6109da565b8210610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1290613baf565b60405180910390fd5b60088281548110610f2f57610f2e613ffe565b5b90600052602060002001549050919050565b6002600a541415610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90613bcf565b60405180910390fd5b6002600a81905550610f97611b6a565b73ffffffffffffffffffffffffffffffffffffffff16610fb561155f565b73ffffffffffffffffffffffffffffffffffffffff161461100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290613acf565b60405180910390fd5b80600f9080519060200190611021929190612f6e565b506001600a8190555050565b601260009054906101000a900460ff1681565b60115481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690613a4f565b60405180910390fd5b80915050919050565b606061110261219e565b905090565b6002600a54141561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613bcf565b60405180910390fd5b6002600a8190555061115d611b6a565b73ffffffffffffffffffffffffffffffffffffffff1661117b61155f565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890613acf565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff0219169083151502179055506001600a81905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613a2f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c5611b6a565b73ffffffffffffffffffffffffffffffffffffffff166112e361155f565b73ffffffffffffffffffffffffffffffffffffffff1614611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090613acf565b60405180910390fd5b6113436000612230565b565b601260019054906101000a900460ff1681565b6002600a54141561139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139590613bcf565b60405180910390fd5b6002600a819055506113ae611b6a565b73ffffffffffffffffffffffffffffffffffffffff166113cc61155f565b73ffffffffffffffffffffffffffffffffffffffff1614611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990613acf565b60405180910390fd5b60001515601260009054906101000a900460ff16151514611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f90613b4f565b60405180910390fd5b60006114826109da565b9050600061149b6011548361215c90919063ffffffff16565b9050600d548111156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990613b2f565b60405180910390fd5b60005b60115481101561153757600d546114fa6109da565b116115245761151961150a611b6a565b611514600c612172565b612180565b611523600c611b54565b5b808061152f90613ec8565b9150506114e5565b506001601260006101000a81548160ff02191690831515021790555050506001600a81905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6002600a5414156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613bcf565b60405180910390fd5b6002600a819055506115df611b6a565b73ffffffffffffffffffffffffffffffffffffffff166115fd61155f565b73ffffffffffffffffffffffffffffffffffffffff1614611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613acf565b60405180910390fd5b8060109080519060200190611669929190612f6e565b506001600a8190555050565b60606001805461168490613e65565b80601f01602080910402602001604051908101604052809291908181526020018280546116b090613e65565b80156116fd5780601f106116d2576101008083540402835291602001916116fd565b820191906000526020600020905b8154815290600101906020018083116116e057829003601f168201915b5050505050905090565b611719611712611b6a565b83836122f6565b5050565b61172e611728611b6a565b83611d11565b61176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490613b8f565b60405180910390fd5b61177984848484612463565b50505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338b6a3a1836040518263ffffffff1660e01b81526004016117dc919061386b565b60206040518083038186803b1580156117f457600080fd5b505afa158015611808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182c9190613332565b80156118825750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b9050919050565b606061189482611bec565b6118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90613b0f565b60405180910390fd5b60006118dd61219e565b905060008151116118fd5760405180602001604052806000815250611928565b80611907846124bf565b604051602001611918929190613847565b6040516020818303038152906040525b915050919050565b600d5481565b60606010805461194590613e65565b80601f016020809104026020016040519081016040528092919081815260200182805461197190613e65565b80156119be5780601f10611993576101008083540402835291602001916119be565b820191906000526020600020905b8154815290600101906020018083116119a157829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a64611b6a565b73ffffffffffffffffffffffffffffffffffffffff16611a8261155f565b73ffffffffffffffffffffffffffffffffffffffff1614611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90613acf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f9061394f565b60405180910390fd5b611b5181612230565b50565b6001816000016000828254019250508190555050565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611be55750611be482612620565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ccb83611046565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d1c82611bec565b611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906139cf565b60405180910390fd5b6000611d6683611046565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dd557508373ffffffffffffffffffffffffffffffffffffffff16611dbd8461083d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611de65750611de581856119c8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e0f82611046565b73ffffffffffffffffffffffffffffffffffffffff1614611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5c90613aef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc9061398f565b60405180910390fd5b611ee0838383612702565b611eeb600082611c58565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3b9190613d7b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f929190613cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061205682611046565b905061206481600084612702565b61206f600083611c58565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bf9190613d7b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000818361216a9190613cf4565b905092915050565b600081600001549050919050565b61219a828260405180602001604052806000815250612712565b5050565b6060600f80546121ad90613e65565b80601f01602080910402602001604051908101604052809291908181526020018280546121d990613e65565b80156122265780601f106121fb57610100808354040283529160200191612226565b820191906000526020600020905b81548152906001019060200180831161220957829003601f168201915b5050505050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906139af565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161245691906138d2565b60405180910390a3505050565b61246e848484611def565b61247a8484848461276d565b6124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b09061392f565b60405180910390fd5b50505050565b60606000821415612507576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061261b565b600082905060005b6000821461253957808061252290613ec8565b915050600a826125329190613d4a565b915061250f565b60008167ffffffffffffffff8111156125555761255461402d565b5b6040519080825280601f01601f1916602001820160405280156125875781602001600182028036833780820191505090505b5090505b60008514612614576001826125a09190613d7b565b9150600a856125af9190613f11565b60306125bb9190613cf4565b60f81b8183815181106125d1576125d0613ffe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561260d9190613d4a565b945061258b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126eb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126fb57506126fa82612904565b5b9050919050565b61270d83838361296e565b505050565b61271c8383612a82565b612729600084848461276d565b612768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275f9061392f565b60405180910390fd5b505050565b600061278e8473ffffffffffffffffffffffffffffffffffffffff16612c50565b156128f7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b7611b6a565b8786866040518563ffffffff1660e01b81526004016127d99493929190613886565b602060405180830381600087803b1580156127f357600080fd5b505af192505050801561282457506040513d601f19601f82011682018060405250810190612821919061338c565b60015b6128a7573d8060008114612854576040519150601f19603f3d011682016040523d82523d6000602084013e612859565b606091505b5060008151141561289f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128969061392f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128fc565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612979838383612c63565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129bc576129b781612c68565b6129fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129fa576129f98382612cb1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3e57612a3981612e1e565b612a7d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a7c57612a7b8282612eef565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae990613a6f565b60405180910390fd5b612afb81611bec565b15612b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b329061396f565b60405180910390fd5b612b4760008383612702565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b979190613cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cbe84611205565b612cc89190613d7b565b9050600060076000848152602001908152602001600020549050818114612dad576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e329190613d7b565b9050600060096000848152602001908152602001600020549050600060088381548110612e6257612e61613ffe565b5b906000526020600020015490508060088381548110612e8457612e83613ffe565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ed357612ed2613fcf565b5b6001900381819060005260206000200160009055905550505050565b6000612efa83611205565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f7a90613e65565b90600052602060002090601f016020900481019282612f9c5760008555612fe3565b82601f10612fb557805160ff1916838001178555612fe3565b82800160010185558215612fe3579182015b82811115612fe2578251825591602001919060010190612fc7565b5b509050612ff09190612ff4565b5090565b5b8082111561300d576000816000905550600101612ff5565b5090565b600061302461301f84613c4f565b613c2a565b9050828152602081018484840111156130405761303f614061565b5b61304b848285613e23565b509392505050565b600061306661306184613c80565b613c2a565b90508281526020810184848401111561308257613081614061565b5b61308d848285613e23565b509392505050565b6000813590506130a481614693565b92915050565b6000813590506130b9816146aa565b92915050565b6000815190506130ce816146aa565b92915050565b6000813590506130e3816146c1565b92915050565b6000815190506130f8816146c1565b92915050565b600082601f8301126131135761311261405c565b5b8135613123848260208601613011565b91505092915050565b600082601f8301126131415761314061405c565b5b8135613151848260208601613053565b91505092915050565b600081359050613169816146d8565b92915050565b6000602082840312156131855761318461406b565b5b600061319384828501613095565b91505092915050565b600080604083850312156131b3576131b261406b565b5b60006131c185828601613095565b92505060206131d285828601613095565b9150509250929050565b6000806000606084860312156131f5576131f461406b565b5b600061320386828701613095565b935050602061321486828701613095565b92505060406132258682870161315a565b9150509250925092565b600080600080608085870312156132495761324861406b565b5b600061325787828801613095565b945050602061326887828801613095565b93505060406132798782880161315a565b925050606085013567ffffffffffffffff81111561329a57613299614066565b5b6132a6878288016130fe565b91505092959194509250565b600080604083850312156132c9576132c861406b565b5b60006132d785828601613095565b92505060206132e8858286016130aa565b9150509250929050565b600080604083850312156133095761330861406b565b5b600061331785828601613095565b92505060206133288582860161315a565b9150509250929050565b6000602082840312156133485761334761406b565b5b6000613356848285016130bf565b91505092915050565b6000602082840312156133755761337461406b565b5b6000613383848285016130d4565b91505092915050565b6000602082840312156133a2576133a161406b565b5b60006133b0848285016130e9565b91505092915050565b6000602082840312156133cf576133ce61406b565b5b600082013567ffffffffffffffff8111156133ed576133ec614066565b5b6133f98482850161312c565b91505092915050565b6000602082840312156134185761341761406b565b5b60006134268482850161315a565b91505092915050565b61343881613daf565b82525050565b61344781613dc1565b82525050565b600061345882613cb1565b6134628185613cc7565b9350613472818560208601613e32565b61347b81614070565b840191505092915050565b600061349182613cbc565b61349b8185613cd8565b93506134ab818560208601613e32565b6134b481614070565b840191505092915050565b60006134ca82613cbc565b6134d48185613ce9565b93506134e4818560208601613e32565b80840191505092915050565b60006134fd602b83613cd8565b915061350882614081565b604082019050919050565b6000613520603283613cd8565b915061352b826140d0565b604082019050919050565b6000613543602683613cd8565b915061354e8261411f565b604082019050919050565b6000613566601c83613cd8565b91506135718261416e565b602082019050919050565b6000613589602483613cd8565b915061359482614197565b604082019050919050565b60006135ac601983613cd8565b91506135b7826141e6565b602082019050919050565b60006135cf602c83613cd8565b91506135da8261420f565b604082019050919050565b60006135f2601583613cd8565b91506135fd8261425e565b602082019050919050565b6000613615603883613cd8565b915061362082614287565b604082019050919050565b6000613638602a83613cd8565b9150613643826142d6565b604082019050919050565b600061365b602983613cd8565b915061366682614325565b604082019050919050565b600061367e602083613cd8565b915061368982614374565b602082019050919050565b60006136a1601383613cd8565b91506136ac8261439d565b602082019050919050565b60006136c4602c83613cd8565b91506136cf826143c6565b604082019050919050565b60006136e7602083613cd8565b91506136f282614415565b602082019050919050565b600061370a602983613cd8565b91506137158261443e565b604082019050919050565b600061372d602f83613cd8565b91506137388261448d565b604082019050919050565b6000613750601d83613cd8565b915061375b826144dc565b602082019050919050565b6000613773601b83613cd8565b915061377e82614505565b602082019050919050565b6000613796602183613cd8565b91506137a18261452e565b604082019050919050565b60006137b9603183613cd8565b91506137c48261457d565b604082019050919050565b60006137dc602c83613cd8565b91506137e7826145cc565b604082019050919050565b60006137ff601f83613cd8565b915061380a8261461b565b602082019050919050565b6000613822603083613cd8565b915061382d82614644565b604082019050919050565b61384181613e19565b82525050565b600061385382856134bf565b915061385f82846134bf565b91508190509392505050565b6000602082019050613880600083018461342f565b92915050565b600060808201905061389b600083018761342f565b6138a8602083018661342f565b6138b56040830185613838565b81810360608301526138c7818461344d565b905095945050505050565b60006020820190506138e7600083018461343e565b92915050565b600060208201905081810360008301526139078184613486565b905092915050565b60006020820190508181036000830152613928816134f0565b9050919050565b6000602082019050818103600083015261394881613513565b9050919050565b6000602082019050818103600083015261396881613536565b9050919050565b6000602082019050818103600083015261398881613559565b9050919050565b600060208201905081810360008301526139a88161357c565b9050919050565b600060208201905081810360008301526139c88161359f565b9050919050565b600060208201905081810360008301526139e8816135c2565b9050919050565b60006020820190508181036000830152613a08816135e5565b9050919050565b60006020820190508181036000830152613a2881613608565b9050919050565b60006020820190508181036000830152613a488161362b565b9050919050565b60006020820190508181036000830152613a688161364e565b9050919050565b60006020820190508181036000830152613a8881613671565b9050919050565b60006020820190508181036000830152613aa881613694565b9050919050565b60006020820190508181036000830152613ac8816136b7565b9050919050565b60006020820190508181036000830152613ae8816136da565b9050919050565b60006020820190508181036000830152613b08816136fd565b9050919050565b60006020820190508181036000830152613b2881613720565b9050919050565b60006020820190508181036000830152613b4881613743565b9050919050565b60006020820190508181036000830152613b6881613766565b9050919050565b60006020820190508181036000830152613b8881613789565b9050919050565b60006020820190508181036000830152613ba8816137ac565b9050919050565b60006020820190508181036000830152613bc8816137cf565b9050919050565b60006020820190508181036000830152613be8816137f2565b9050919050565b60006020820190508181036000830152613c0881613815565b9050919050565b6000602082019050613c246000830184613838565b92915050565b6000613c34613c45565b9050613c408282613e97565b919050565b6000604051905090565b600067ffffffffffffffff821115613c6a57613c6961402d565b5b613c7382614070565b9050602081019050919050565b600067ffffffffffffffff821115613c9b57613c9a61402d565b5b613ca482614070565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cff82613e19565b9150613d0a83613e19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d3f57613d3e613f42565b5b828201905092915050565b6000613d5582613e19565b9150613d6083613e19565b925082613d7057613d6f613f71565b5b828204905092915050565b6000613d8682613e19565b9150613d9183613e19565b925082821015613da457613da3613f42565b5b828203905092915050565b6000613dba82613df9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e50578082015181840152602081019050613e35565b83811115613e5f576000848401525b50505050565b60006002820490506001821680613e7d57607f821691505b60208210811415613e9157613e90613fa0565b5b50919050565b613ea082614070565b810181811067ffffffffffffffff82111715613ebf57613ebe61402d565b5b80604052505050565b6000613ed382613e19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0657613f05613f42565b5b600182019050919050565b6000613f1c82613e19565b9150613f2783613e19565b925082613f3757613f36613f71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656c696769626c6520746f20636c61696d0000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436c61696d206973206e6f742061637469766500000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f436c61696d20776f756c6420657863656564206d617820737570706c79000000600082015250565b7f48617320616c726561647920636c61696d656420726573657276650000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61469c81613daf565b81146146a757600080fd5b50565b6146b381613dc1565b81146146be57600080fd5b50565b6146ca81613dcd565b81146146d557600080fd5b50565b6146e181613e19565b81146146ec57600080fd5b5056fea264697066735822122013b7b11bdb2199bea3a4d554cdb372ecefe62d970fd3bcdd10d26278d9e49c2e64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000014500000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001757474d49205072656d69756d204d656d62657273686970000000000000000000000000000000000000000000000000000000000000000000000000000000000457474d4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6170692e77676d692e696f2f636f72652f76312f7072656d69756d546f6b656e732f00000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102105760003560e01c80636352211e1161012557806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd146105a1578063d5abeb01146105d1578063e8a3d485146105ef578063e985e9c51461060d578063f2fde38b1461063d57610210565b806395d89b411461051b578063a22cb46514610539578063b88d4fde14610555578063bf3506c11461057157610210565b8063715018a6116100f4578063715018a6146104af5780637fc27803146104b9578063890ac366146104d75780638da5cb5b146104e1578063938e3d7b146104ff57610210565b80636352211e146104275780636c0360eb146104575780636daa18f81461047557806370a082311461047f57610210565b80632f745c59116101a85780634e71d92d116101775780634e71d92d146103955780634f6ccce71461039f57806355f804b3146103cf57806357b72af5146103eb5780635fae51d21461040957610210565b80632f745c59146103235780633ccfd60b1461035357806342842e0e1461035d57806342966c681461037957610210565b8063081812fc116101e4578063081812fc1461029d578063095ea7b3146102cd57806318160ddd146102e957806323b872dd1461030757610210565b80626cf05214610215578063018f5c5f1461023157806301ffc9a71461024f57806306fdde031461027f575b600080fd5b61022f600480360381019061022a919061316f565b610659565b005b61023961076f565b604051610246919061386b565b60405180910390f35b6102696004803603810190610264919061335f565b610799565b60405161027691906138d2565b60405180910390f35b6102876107ab565b60405161029491906138ed565b60405180910390f35b6102b760048036038101906102b29190613402565b61083d565b6040516102c4919061386b565b60405180910390f35b6102e760048036038101906102e291906132f2565b6108c2565b005b6102f16109da565b6040516102fe9190613c0f565b60405180910390f35b610321600480360381019061031c91906131dc565b6109e7565b005b61033d600480360381019061033891906132f2565b610a47565b60405161034a9190613c0f565b60405180910390f35b61035b610aec565b005b610377600480360381019061037291906131dc565b610c1a565b005b610393600480360381019061038e9190613402565b610c3a565b005b61039d610c96565b005b6103b960048036038101906103b49190613402565b610ed0565b6040516103c69190613c0f565b60405180910390f35b6103e960048036038101906103e491906133b9565b610f41565b005b6103f361102d565b60405161040091906138d2565b60405180910390f35b610411611040565b60405161041e9190613c0f565b60405180910390f35b610441600480360381019061043c9190613402565b611046565b60405161044e919061386b565b60405180910390f35b61045f6110f8565b60405161046c91906138ed565b60405180910390f35b61047d611107565b005b6104996004803603810190610494919061316f565b611205565b6040516104a69190613c0f565b60405180910390f35b6104b76112bd565b005b6104c1611345565b6040516104ce91906138d2565b60405180910390f35b6104df611358565b005b6104e961155f565b6040516104f6919061386b565b60405180910390f35b610519600480360381019061051491906133b9565b611589565b005b610523611675565b60405161053091906138ed565b60405180910390f35b610553600480360381019061054e91906132b2565b611707565b005b61056f600480360381019061056a919061322f565b61171d565b005b61058b6004803603810190610586919061316f565b61177f565b60405161059891906138d2565b60405180910390f35b6105bb60048036038101906105b69190613402565b611889565b6040516105c891906138ed565b60405180910390f35b6105d9611930565b6040516105e69190613c0f565b60405180910390f35b6105f7611936565b60405161060491906138ed565b60405180910390f35b6106276004803603810190610622919061319c565b6119c8565b60405161063491906138d2565b60405180910390f35b6106576004803603810190610652919061316f565b611a5c565b005b6002600a54141561069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069690613bcf565b60405180910390fd5b6002600a819055506106af611b6a565b73ffffffffffffffffffffffffffffffffffffffff166106cd61155f565b73ffffffffffffffffffffffffffffffffffffffff1614610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90613acf565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a8190555050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006107a482611b72565b9050919050565b6060600080546107ba90613e65565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690613e65565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b5050505050905090565b600061084882611bec565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90613aaf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cd82611046565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590613b6f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095d611b6a565b73ffffffffffffffffffffffffffffffffffffffff16148061098c575061098b81610986611b6a565b6119c8565b5b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613a0f565b60405180910390fd5b6109d58383611c58565b505050565b6000600880549050905090565b6109f86109f2611b6a565b82611d11565b610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90613b8f565b60405180910390fd5b610a42838383611def565b505050565b6000610a5283611205565b8210610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a9061390f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990613bcf565b60405180910390fd5b6002600a81905550610b42611b6a565b73ffffffffffffffffffffffffffffffffffffffff16610b6061155f565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90613acf565b60405180910390fd5b6000610bc0611b6a565b905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c0d573d6000803e3d6000fd5b5050506001600a81905550565b610c358383836040518060200160405280600081525061171d565b505050565b610c4b610c45611b6a565b82611d11565b610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190613bef565b60405180910390fd5b610c938161204b565b50565b6002600a541415610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613bcf565b60405180910390fd5b6002600a8190555060011515601260019054906101000a900460ff16151514610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190613a8f565b60405180910390fd5b6000610d44611b6a565b90506000610d518261177f565b90506001151581151514610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d91906139ef565b60405180910390fd5b6000610da46109da565b90506000610dbc60018361215c90919063ffffffff16565b9050600d54811115610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa90613b2f565b60405180910390fd5b6001601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e75610e66611b6a565b610e70600c612172565b612180565b610e7f600c611b54565b8373ffffffffffffffffffffffffffffffffffffffff167f0c7ef932d3b91976772937f18d5ef9b39a9930bef486b576c374f047c4b512dc60405160405180910390a2505050506001600a81905550565b6000610eda6109da565b8210610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1290613baf565b60405180910390fd5b60088281548110610f2f57610f2e613ffe565b5b90600052602060002001549050919050565b6002600a541415610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90613bcf565b60405180910390fd5b6002600a81905550610f97611b6a565b73ffffffffffffffffffffffffffffffffffffffff16610fb561155f565b73ffffffffffffffffffffffffffffffffffffffff161461100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290613acf565b60405180910390fd5b80600f9080519060200190611021929190612f6e565b506001600a8190555050565b601260009054906101000a900460ff1681565b60115481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690613a4f565b60405180910390fd5b80915050919050565b606061110261219e565b905090565b6002600a54141561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613bcf565b60405180910390fd5b6002600a8190555061115d611b6a565b73ffffffffffffffffffffffffffffffffffffffff1661117b61155f565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890613acf565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff0219169083151502179055506001600a81905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613a2f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c5611b6a565b73ffffffffffffffffffffffffffffffffffffffff166112e361155f565b73ffffffffffffffffffffffffffffffffffffffff1614611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090613acf565b60405180910390fd5b6113436000612230565b565b601260019054906101000a900460ff1681565b6002600a54141561139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139590613bcf565b60405180910390fd5b6002600a819055506113ae611b6a565b73ffffffffffffffffffffffffffffffffffffffff166113cc61155f565b73ffffffffffffffffffffffffffffffffffffffff1614611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990613acf565b60405180910390fd5b60001515601260009054906101000a900460ff16151514611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f90613b4f565b60405180910390fd5b60006114826109da565b9050600061149b6011548361215c90919063ffffffff16565b9050600d548111156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990613b2f565b60405180910390fd5b60005b60115481101561153757600d546114fa6109da565b116115245761151961150a611b6a565b611514600c612172565b612180565b611523600c611b54565b5b808061152f90613ec8565b9150506114e5565b506001601260006101000a81548160ff02191690831515021790555050506001600a81905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6002600a5414156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613bcf565b60405180910390fd5b6002600a819055506115df611b6a565b73ffffffffffffffffffffffffffffffffffffffff166115fd61155f565b73ffffffffffffffffffffffffffffffffffffffff1614611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613acf565b60405180910390fd5b8060109080519060200190611669929190612f6e565b506001600a8190555050565b60606001805461168490613e65565b80601f01602080910402602001604051908101604052809291908181526020018280546116b090613e65565b80156116fd5780601f106116d2576101008083540402835291602001916116fd565b820191906000526020600020905b8154815290600101906020018083116116e057829003601f168201915b5050505050905090565b611719611712611b6a565b83836122f6565b5050565b61172e611728611b6a565b83611d11565b61176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490613b8f565b60405180910390fd5b61177984848484612463565b50505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338b6a3a1836040518263ffffffff1660e01b81526004016117dc919061386b565b60206040518083038186803b1580156117f457600080fd5b505afa158015611808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182c9190613332565b80156118825750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b9050919050565b606061189482611bec565b6118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90613b0f565b60405180910390fd5b60006118dd61219e565b905060008151116118fd5760405180602001604052806000815250611928565b80611907846124bf565b604051602001611918929190613847565b6040516020818303038152906040525b915050919050565b600d5481565b60606010805461194590613e65565b80601f016020809104026020016040519081016040528092919081815260200182805461197190613e65565b80156119be5780601f10611993576101008083540402835291602001916119be565b820191906000526020600020905b8154815290600101906020018083116119a157829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a64611b6a565b73ffffffffffffffffffffffffffffffffffffffff16611a8261155f565b73ffffffffffffffffffffffffffffffffffffffff1614611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90613acf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f9061394f565b60405180910390fd5b611b5181612230565b50565b6001816000016000828254019250508190555050565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611be55750611be482612620565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ccb83611046565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d1c82611bec565b611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906139cf565b60405180910390fd5b6000611d6683611046565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dd557508373ffffffffffffffffffffffffffffffffffffffff16611dbd8461083d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611de65750611de581856119c8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e0f82611046565b73ffffffffffffffffffffffffffffffffffffffff1614611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5c90613aef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc9061398f565b60405180910390fd5b611ee0838383612702565b611eeb600082611c58565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3b9190613d7b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f929190613cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061205682611046565b905061206481600084612702565b61206f600083611c58565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bf9190613d7b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000818361216a9190613cf4565b905092915050565b600081600001549050919050565b61219a828260405180602001604052806000815250612712565b5050565b6060600f80546121ad90613e65565b80601f01602080910402602001604051908101604052809291908181526020018280546121d990613e65565b80156122265780601f106121fb57610100808354040283529160200191612226565b820191906000526020600020905b81548152906001019060200180831161220957829003601f168201915b5050505050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906139af565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161245691906138d2565b60405180910390a3505050565b61246e848484611def565b61247a8484848461276d565b6124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b09061392f565b60405180910390fd5b50505050565b60606000821415612507576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061261b565b600082905060005b6000821461253957808061252290613ec8565b915050600a826125329190613d4a565b915061250f565b60008167ffffffffffffffff8111156125555761255461402d565b5b6040519080825280601f01601f1916602001820160405280156125875781602001600182028036833780820191505090505b5090505b60008514612614576001826125a09190613d7b565b9150600a856125af9190613f11565b60306125bb9190613cf4565b60f81b8183815181106125d1576125d0613ffe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561260d9190613d4a565b945061258b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126eb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126fb57506126fa82612904565b5b9050919050565b61270d83838361296e565b505050565b61271c8383612a82565b612729600084848461276d565b612768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275f9061392f565b60405180910390fd5b505050565b600061278e8473ffffffffffffffffffffffffffffffffffffffff16612c50565b156128f7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b7611b6a565b8786866040518563ffffffff1660e01b81526004016127d99493929190613886565b602060405180830381600087803b1580156127f357600080fd5b505af192505050801561282457506040513d601f19601f82011682018060405250810190612821919061338c565b60015b6128a7573d8060008114612854576040519150601f19603f3d011682016040523d82523d6000602084013e612859565b606091505b5060008151141561289f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128969061392f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128fc565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612979838383612c63565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129bc576129b781612c68565b6129fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129fa576129f98382612cb1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3e57612a3981612e1e565b612a7d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a7c57612a7b8282612eef565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae990613a6f565b60405180910390fd5b612afb81611bec565b15612b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b329061396f565b60405180910390fd5b612b4760008383612702565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b979190613cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cbe84611205565b612cc89190613d7b565b9050600060076000848152602001908152602001600020549050818114612dad576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e329190613d7b565b9050600060096000848152602001908152602001600020549050600060088381548110612e6257612e61613ffe565b5b906000526020600020015490508060088381548110612e8457612e83613ffe565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ed357612ed2613fcf565b5b6001900381819060005260206000200160009055905550505050565b6000612efa83611205565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f7a90613e65565b90600052602060002090601f016020900481019282612f9c5760008555612fe3565b82601f10612fb557805160ff1916838001178555612fe3565b82800160010185558215612fe3579182015b82811115612fe2578251825591602001919060010190612fc7565b5b509050612ff09190612ff4565b5090565b5b8082111561300d576000816000905550600101612ff5565b5090565b600061302461301f84613c4f565b613c2a565b9050828152602081018484840111156130405761303f614061565b5b61304b848285613e23565b509392505050565b600061306661306184613c80565b613c2a565b90508281526020810184848401111561308257613081614061565b5b61308d848285613e23565b509392505050565b6000813590506130a481614693565b92915050565b6000813590506130b9816146aa565b92915050565b6000815190506130ce816146aa565b92915050565b6000813590506130e3816146c1565b92915050565b6000815190506130f8816146c1565b92915050565b600082601f8301126131135761311261405c565b5b8135613123848260208601613011565b91505092915050565b600082601f8301126131415761314061405c565b5b8135613151848260208601613053565b91505092915050565b600081359050613169816146d8565b92915050565b6000602082840312156131855761318461406b565b5b600061319384828501613095565b91505092915050565b600080604083850312156131b3576131b261406b565b5b60006131c185828601613095565b92505060206131d285828601613095565b9150509250929050565b6000806000606084860312156131f5576131f461406b565b5b600061320386828701613095565b935050602061321486828701613095565b92505060406132258682870161315a565b9150509250925092565b600080600080608085870312156132495761324861406b565b5b600061325787828801613095565b945050602061326887828801613095565b93505060406132798782880161315a565b925050606085013567ffffffffffffffff81111561329a57613299614066565b5b6132a6878288016130fe565b91505092959194509250565b600080604083850312156132c9576132c861406b565b5b60006132d785828601613095565b92505060206132e8858286016130aa565b9150509250929050565b600080604083850312156133095761330861406b565b5b600061331785828601613095565b92505060206133288582860161315a565b9150509250929050565b6000602082840312156133485761334761406b565b5b6000613356848285016130bf565b91505092915050565b6000602082840312156133755761337461406b565b5b6000613383848285016130d4565b91505092915050565b6000602082840312156133a2576133a161406b565b5b60006133b0848285016130e9565b91505092915050565b6000602082840312156133cf576133ce61406b565b5b600082013567ffffffffffffffff8111156133ed576133ec614066565b5b6133f98482850161312c565b91505092915050565b6000602082840312156134185761341761406b565b5b60006134268482850161315a565b91505092915050565b61343881613daf565b82525050565b61344781613dc1565b82525050565b600061345882613cb1565b6134628185613cc7565b9350613472818560208601613e32565b61347b81614070565b840191505092915050565b600061349182613cbc565b61349b8185613cd8565b93506134ab818560208601613e32565b6134b481614070565b840191505092915050565b60006134ca82613cbc565b6134d48185613ce9565b93506134e4818560208601613e32565b80840191505092915050565b60006134fd602b83613cd8565b915061350882614081565b604082019050919050565b6000613520603283613cd8565b915061352b826140d0565b604082019050919050565b6000613543602683613cd8565b915061354e8261411f565b604082019050919050565b6000613566601c83613cd8565b91506135718261416e565b602082019050919050565b6000613589602483613cd8565b915061359482614197565b604082019050919050565b60006135ac601983613cd8565b91506135b7826141e6565b602082019050919050565b60006135cf602c83613cd8565b91506135da8261420f565b604082019050919050565b60006135f2601583613cd8565b91506135fd8261425e565b602082019050919050565b6000613615603883613cd8565b915061362082614287565b604082019050919050565b6000613638602a83613cd8565b9150613643826142d6565b604082019050919050565b600061365b602983613cd8565b915061366682614325565b604082019050919050565b600061367e602083613cd8565b915061368982614374565b602082019050919050565b60006136a1601383613cd8565b91506136ac8261439d565b602082019050919050565b60006136c4602c83613cd8565b91506136cf826143c6565b604082019050919050565b60006136e7602083613cd8565b91506136f282614415565b602082019050919050565b600061370a602983613cd8565b91506137158261443e565b604082019050919050565b600061372d602f83613cd8565b91506137388261448d565b604082019050919050565b6000613750601d83613cd8565b915061375b826144dc565b602082019050919050565b6000613773601b83613cd8565b915061377e82614505565b602082019050919050565b6000613796602183613cd8565b91506137a18261452e565b604082019050919050565b60006137b9603183613cd8565b91506137c48261457d565b604082019050919050565b60006137dc602c83613cd8565b91506137e7826145cc565b604082019050919050565b60006137ff601f83613cd8565b915061380a8261461b565b602082019050919050565b6000613822603083613cd8565b915061382d82614644565b604082019050919050565b61384181613e19565b82525050565b600061385382856134bf565b915061385f82846134bf565b91508190509392505050565b6000602082019050613880600083018461342f565b92915050565b600060808201905061389b600083018761342f565b6138a8602083018661342f565b6138b56040830185613838565b81810360608301526138c7818461344d565b905095945050505050565b60006020820190506138e7600083018461343e565b92915050565b600060208201905081810360008301526139078184613486565b905092915050565b60006020820190508181036000830152613928816134f0565b9050919050565b6000602082019050818103600083015261394881613513565b9050919050565b6000602082019050818103600083015261396881613536565b9050919050565b6000602082019050818103600083015261398881613559565b9050919050565b600060208201905081810360008301526139a88161357c565b9050919050565b600060208201905081810360008301526139c88161359f565b9050919050565b600060208201905081810360008301526139e8816135c2565b9050919050565b60006020820190508181036000830152613a08816135e5565b9050919050565b60006020820190508181036000830152613a2881613608565b9050919050565b60006020820190508181036000830152613a488161362b565b9050919050565b60006020820190508181036000830152613a688161364e565b9050919050565b60006020820190508181036000830152613a8881613671565b9050919050565b60006020820190508181036000830152613aa881613694565b9050919050565b60006020820190508181036000830152613ac8816136b7565b9050919050565b60006020820190508181036000830152613ae8816136da565b9050919050565b60006020820190508181036000830152613b08816136fd565b9050919050565b60006020820190508181036000830152613b2881613720565b9050919050565b60006020820190508181036000830152613b4881613743565b9050919050565b60006020820190508181036000830152613b6881613766565b9050919050565b60006020820190508181036000830152613b8881613789565b9050919050565b60006020820190508181036000830152613ba8816137ac565b9050919050565b60006020820190508181036000830152613bc8816137cf565b9050919050565b60006020820190508181036000830152613be8816137f2565b9050919050565b60006020820190508181036000830152613c0881613815565b9050919050565b6000602082019050613c246000830184613838565b92915050565b6000613c34613c45565b9050613c408282613e97565b919050565b6000604051905090565b600067ffffffffffffffff821115613c6a57613c6961402d565b5b613c7382614070565b9050602081019050919050565b600067ffffffffffffffff821115613c9b57613c9a61402d565b5b613ca482614070565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cff82613e19565b9150613d0a83613e19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d3f57613d3e613f42565b5b828201905092915050565b6000613d5582613e19565b9150613d6083613e19565b925082613d7057613d6f613f71565b5b828204905092915050565b6000613d8682613e19565b9150613d9183613e19565b925082821015613da457613da3613f42565b5b828203905092915050565b6000613dba82613df9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e50578082015181840152602081019050613e35565b83811115613e5f576000848401525b50505050565b60006002820490506001821680613e7d57607f821691505b60208210811415613e9157613e90613fa0565b5b50919050565b613ea082614070565b810181811067ffffffffffffffff82111715613ebf57613ebe61402d565b5b80604052505050565b6000613ed382613e19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0657613f05613f42565b5b600182019050919050565b6000613f1c82613e19565b9150613f2783613e19565b925082613f3757613f36613f71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656c696769626c6520746f20636c61696d0000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436c61696d206973206e6f742061637469766500000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f436c61696d20776f756c6420657863656564206d617820737570706c79000000600082015250565b7f48617320616c726561647920636c61696d656420726573657276650000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61469c81613daf565b81146146a757600080fd5b50565b6146b381613dc1565b81146146be57600080fd5b50565b6146ca81613dcd565b81146146d557600080fd5b50565b6146e181613e19565b81146146ec57600080fd5b5056fea264697066735822122013b7b11bdb2199bea3a4d554cdb372ecefe62d970fd3bcdd10d26278d9e49c2e64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000014500000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001757474d49205072656d69756d204d656d62657273686970000000000000000000000000000000000000000000000000000000000000000000000000000000000457474d4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6170692e77676d692e696f2f636f72652f76312f7072656d69756d546f6b656e732f00000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): WGMI Premium Membership
Arg [1] : symbol (string): WGMI
Arg [2] : _maxSupply (uint256): 5200
Arg [3] : baseTokenURI (string): https://api.wgmi.io/core/v1/premiumTokens/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001450
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [5] : 57474d49205072656d69756d204d656d62657273686970000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 57474d4900000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [9] : 68747470733a2f2f6170692e77676d692e696f2f636f72652f76312f7072656d
Arg [10] : 69756d546f6b656e732f00000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

56734:4736:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60614:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58133:107;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58617:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37011:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38570:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38093:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50157:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39320:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49825:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59930:192;;;:::i;:::-;;39730:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56201:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59101:601;;;:::i;:::-;;50347:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60193:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57339:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57261:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36705:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58034:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59810:112;;;:::i;:::-;;36435:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15981:103;;;:::i;:::-;;57413:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60877:590;;;:::i;:::-;;15330:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60417:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37180:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38863:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39986:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58874:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37355:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57042:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58248:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39089:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16239:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60614:182;10304:1;10902:7;;:19;;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;15561:12:::1;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60765:23:::2;60742:20;;:46;;;;;;;;;;;;;;;;;;10260:1:::0;11214:7;:22;;;;60614:182;:::o;58133:107::-;58185:7;58212:20;;;;;;;;;;;58205:27;;58133:107;:::o;58617:196::-;58740:4;58769:36;58793:11;58769:23;:36::i;:::-;58762:43;;58617:196;;;:::o;37011:100::-;37065:13;37098:5;37091:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37011:100;:::o;38570:221::-;38646:7;38674:16;38682:7;38674;:16::i;:::-;38666:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38759:15;:24;38775:7;38759:24;;;;;;;;;;;;;;;;;;;;;38752:31;;38570:221;;;:::o;38093:411::-;38174:13;38190:23;38205:7;38190:14;:23::i;:::-;38174:39;;38238:5;38232:11;;:2;:11;;;;38224:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38332:5;38316:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38341:37;38358:5;38365:12;:10;:12::i;:::-;38341:16;:37::i;:::-;38316:62;38294:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;38475:21;38484:2;38488:7;38475:8;:21::i;:::-;38163:341;38093:411;;:::o;50157:113::-;50218:7;50245:10;:17;;;;50238:24;;50157:113;:::o;39320:339::-;39515:41;39534:12;:10;:12::i;:::-;39548:7;39515:18;:41::i;:::-;39507:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39623:28;39633:4;39639:2;39643:7;39623:9;:28::i;:::-;39320:339;;;:::o;49825:256::-;49922:7;49958:23;49975:5;49958:16;:23::i;:::-;49950:5;:31;49942:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;50047:12;:19;50060:5;50047:19;;;;;;;;;;;;;;;:26;50067:5;50047:26;;;;;;;;;;;;50040:33;;49825:256;;;;:::o;59930:192::-;10304:1;10902:7;;:19;;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;15561:12:::1;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59993:13:::2;60009:12;:10;:12::i;:::-;59993:28;;60032:15;60050:21;60032:39;;60090:5;60082:23;;:32;60106:7;60082:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;59982:140;;10260:1:::0;11214:7;:22;;;;59930:192::o;39730:185::-;39868:39;39885:4;39891:2;39895:7;39868:39;;;;;;;;;;;;:16;:39::i;:::-;39730:185;;;:::o;56201:245::-;56319:41;56338:12;:10;:12::i;:::-;56352:7;56319:18;:41::i;:::-;56311:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56424:14;56430:7;56424:5;:14::i;:::-;56201:245;:::o;59101:601::-;10304:1;10902:7;;:19;;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;59176:4:::1;59159:21;;:13;;;;;;;;;;;:21;;;59151:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59215:16;59234:12;:10;:12::i;:::-;59215:31;;59259:14;59276:18;59285:8;59276;:18::i;:::-;59259:35;;59326:4;59313:17;;:9;:17;;;59305:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;59369:20;59392:13;:11;:13::i;:::-;59369:36;;59416:13;59432:19;59449:1;59432:12;:16;;:19;;;;:::i;:::-;59416:35;;59479:9;;59470:5;:18;;59462:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59558:4;59535:10;:20;59546:8;59535:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;59573:50;59583:12;:10;:12::i;:::-;59597:25;:15;:23;:25::i;:::-;59573:9;:50::i;:::-;59634:27;:15;:25;:27::i;:::-;59685:8;59679:15;;;;;;;;;;;;59140:562;;;;10260:1:::0;11214:7;:22;;;;59101:601::o;50347:233::-;50422:7;50458:30;:28;:30::i;:::-;50450:5;:38;50442:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;50555:10;50566:5;50555:17;;;;;;;;:::i;:::-;;;;;;;;;;50548:24;;50347:233;;;:::o;60193:145::-;10304:1;10902:7;;:19;;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;15561:12:::1;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60319:11:::2;60303:13;:27;;;;;;;;;;;;:::i;:::-;;10260:1:::0;11214:7;:22;;;;60193:145;:::o;57339:36::-;;;;;;;;;;;;;:::o;57261:31::-;;;;:::o;36705:239::-;36777:7;36797:13;36813:7;:16;36821:7;36813:16;;;;;;;;;;;;;;;;;;;;;36797:32;;36865:1;36848:19;;:5;:19;;;;36840:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36931:5;36924:12;;;36705:239;;;:::o;58034:91::-;58074:13;58107:10;:8;:10::i;:::-;58100:17;;58034:91;:::o;59810:112::-;10304:1;10902:7;;:19;;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;15561:12:::1;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59901:13:::2;;;;;;;;;;;59900:14;59884:13;;:30;;;;;;;;;;;;;;;;;;10260:1:::0;11214:7;:22;;;;59810:112::o;36435:208::-;36507:7;36552:1;36535:19;;:5;:19;;;;36527:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36619:9;:16;36629:5;36619:16;;;;;;;;;;;;;;;;36612:23;;36435:208;;;:::o;15981:103::-;15561:12;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16046:30:::1;16073:1;16046:18;:30::i;:::-;15981:103::o:0;57413:33::-;;;;;;;;;;;;;:::o;60877:590::-;10304:1;10902:7;;:19;;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;15561:12:::1;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60971:5:::2;60951:25;;:16;;;;;;;;;;;:25;;;60943:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61019:20;61042:13;:11;:13::i;:::-;61019:36;;61066:13;61082:29;61099:11;;61082:12;:16;;:29;;;;:::i;:::-;61066:45;;61139:9;;61130:5;:18;;61122:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61200:9;61195:231;61219:11;;61215:1;:15;61195:231;;;61273:9;;61256:13;:11;:13::i;:::-;:26;61252:163;;61303:50;61313:12;:10;:12::i;:::-;61327:25;:15;:23;:25::i;:::-;61303:9;:50::i;:::-;61372:27;:15;:25;:27::i;:::-;61252:163;61232:3;;;;;:::i;:::-;;;;61195:231;;;;61455:4;61436:16;;:23;;;;;;;;;;;;;;;;;;60932:535;;10260:1:::0;11214:7;:22;;;;60877:590::o;15330:87::-;15376:7;15403:6;;;;;;;;;;;15396:13;;15330:87;:::o;60417:156::-;10304:1;10902:7;;:19;;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;15561:12:::1;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60550:15:::2;60535:12;:30;;;;;;;;;;;;:::i;:::-;;10260:1:::0;11214:7;:22;;;;60417:156;:::o;37180:104::-;37236:13;37269:7;37262:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37180:104;:::o;38863:155::-;38958:52;38977:12;:10;:12::i;:::-;38991:8;39001;38958:18;:52::i;:::-;38863:155;;:::o;39986:328::-;40161:41;40180:12;:10;:12::i;:::-;40194:7;40161:18;:41::i;:::-;40153:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40267:39;40281:4;40287:2;40291:7;40300:5;40267:13;:39::i;:::-;39986:328;;;;:::o;58874:197::-;58931:4;58978:20;;;;;;;;;;;58964:55;;;59020:8;58964:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:99;;;;;59043:10;:20;59054:8;59043:20;;;;;;;;;;;;;;;;;;;;;;;;;59042:21;58964:99;58948:115;;58874:197;;;:::o;37355:334::-;37428:13;37462:16;37470:7;37462;:16::i;:::-;37454:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37543:21;37567:10;:8;:10::i;:::-;37543:34;;37619:1;37601:7;37595:21;:25;:86;;;;;;;;;;;;;;;;;37647:7;37656:18;:7;:16;:18::i;:::-;37630:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37595:86;37588:93;;;37355:334;;;:::o;57042:24::-;;;;:::o;58248:97::-;58292:13;58325:12;58318:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58248:97;:::o;39089:164::-;39186:4;39210:18;:25;39229:5;39210:25;;;;;;;;;;;;;;;:35;39236:8;39210:35;;;;;;;;;;;;;;;;;;;;;;;;;39203:42;;39089:164;;;;:::o;16239:201::-;15561:12;:10;:12::i;:::-;15550:23;;:7;:5;:7::i;:::-;:23;;;15542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16348:1:::1;16328:22;;:8;:22;;;;16320:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16404:28;16423:8;16404:18;:28::i;:::-;16239:201:::0;:::o;8021:127::-;8128:1;8110:7;:14;;;:19;;;;;;;;;;;8021:127;:::o;14054:98::-;14107:7;14134:10;14127:17;;14054:98;:::o;49517:224::-;49619:4;49658:35;49643:50;;;:11;:50;;;;:90;;;;49697:36;49721:11;49697:23;:36::i;:::-;49643:90;49636:97;;49517:224;;;:::o;41824:127::-;41889:4;41941:1;41913:30;;:7;:16;41921:7;41913:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41906:37;;41824:127;;;:::o;45806:174::-;45908:2;45881:15;:24;45897:7;45881:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45964:7;45960:2;45926:46;;45935:23;45950:7;45935:14;:23::i;:::-;45926:46;;;;;;;;;;;;45806:174;;:::o;42118:348::-;42211:4;42236:16;42244:7;42236;:16::i;:::-;42228:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42312:13;42328:23;42343:7;42328:14;:23::i;:::-;42312:39;;42381:5;42370:16;;:7;:16;;;:51;;;;42414:7;42390:31;;:20;42402:7;42390:11;:20::i;:::-;:31;;;42370:51;:87;;;;42425:32;42442:5;42449:7;42425:16;:32::i;:::-;42370:87;42362:96;;;42118:348;;;;:::o;45110:578::-;45269:4;45242:31;;:23;45257:7;45242:14;:23::i;:::-;:31;;;45234:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45352:1;45338:16;;:2;:16;;;;45330:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45408:39;45429:4;45435:2;45439:7;45408:20;:39::i;:::-;45512:29;45529:1;45533:7;45512:8;:29::i;:::-;45573:1;45554:9;:15;45564:4;45554:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45602:1;45585:9;:13;45595:2;45585:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45633:2;45614:7;:16;45622:7;45614:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45672:7;45668:2;45653:27;;45662:4;45653:27;;;;;;;;;;;;45110:578;;;:::o;44413:360::-;44473:13;44489:23;44504:7;44489:14;:23::i;:::-;44473:39;;44525:48;44546:5;44561:1;44565:7;44525:20;:48::i;:::-;44614:29;44631:1;44635:7;44614:8;:29::i;:::-;44676:1;44656:9;:16;44666:5;44656:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;44695:7;:16;44703:7;44695:16;;;;;;;;;;;;44688:23;;;;;;;;;;;44757:7;44753:1;44729:36;;44738:5;44729:36;;;;;;;;;;;;44462:311;44413:360;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;7899:114::-;7964:7;7991;:14;;;7984:21;;7899:114;;;:::o;42808:110::-;42884:26;42894:2;42898:7;42884:26;;;;;;;;;;;;:9;:26::i;:::-;42808:110;;:::o;57920:106::-;57972:13;58005;57998:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57920:106;:::o;16600:191::-;16674:16;16693:6;;;;;;;;;;;16674:25;;16719:8;16710:6;;:17;;;;;;;;;;;;;;;;;;16774:8;16743:40;;16764:8;16743:40;;;;;;;;;;;;16663:128;16600:191;:::o;46122:315::-;46277:8;46268:17;;:5;:17;;;;46260:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46364:8;46326:18;:25;46345:5;46326:25;;;;;;;;;;;;;;;:35;46352:8;46326:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46410:8;46388:41;;46403:5;46388:41;;;46420:8;46388:41;;;;;;:::i;:::-;;;;;;;;46122:315;;;:::o;41196:::-;41353:28;41363:4;41369:2;41373:7;41353:9;:28::i;:::-;41400:48;41423:4;41429:2;41433:7;41442:5;41400:22;:48::i;:::-;41392:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41196:315;;;;:::o;11616:723::-;11672:13;11902:1;11893:5;:10;11889:53;;;11920:10;;;;;;;;;;;;;;;;;;;;;11889:53;11952:12;11967:5;11952:20;;11983:14;12008:78;12023:1;12015:4;:9;12008:78;;12041:8;;;;;:::i;:::-;;;;12072:2;12064:10;;;;;:::i;:::-;;;12008:78;;;12096:19;12128:6;12118:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12096:39;;12146:154;12162:1;12153:5;:10;12146:154;;12190:1;12180:11;;;;;:::i;:::-;;;12257:2;12249:5;:10;;;;:::i;:::-;12236:2;:24;;;;:::i;:::-;12223:39;;12206:6;12213;12206:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;12286:2;12277:11;;;;;:::i;:::-;;;12146:154;;;12324:6;12310:21;;;;;11616:723;;;;:::o;36066:305::-;36168:4;36220:25;36205:40;;;:11;:40;;;;:105;;;;36277:33;36262:48;;;:11;:48;;;;36205:105;:158;;;;36327:36;36351:11;36327:23;:36::i;:::-;36205:158;36185:178;;36066:305;;;:::o;58353:215::-;58515:45;58542:4;58548:2;58552:7;58515:26;:45::i;:::-;58353:215;;;:::o;43145:321::-;43275:18;43281:2;43285:7;43275:5;:18::i;:::-;43326:54;43357:1;43361:2;43365:7;43374:5;43326:22;:54::i;:::-;43304:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;43145:321;;;:::o;47002:799::-;47157:4;47178:15;:2;:13;;;:15::i;:::-;47174:620;;;47230:2;47214:36;;;47251:12;:10;:12::i;:::-;47265:4;47271:7;47280:5;47214:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47210:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47473:1;47456:6;:13;:18;47452:272;;;47499:60;;;;;;;;;;:::i;:::-;;;;;;;;47452:272;47674:6;47668:13;47659:6;47655:2;47651:15;47644:38;47210:529;47347:41;;;47337:51;;;:6;:51;;;;47330:58;;;;;47174:620;47778:4;47771:11;;47002:799;;;;;;;:::o;27762:157::-;27847:4;27886:25;27871:40;;;:11;:40;;;;27864:47;;27762:157;;;:::o;51193:589::-;51337:45;51364:4;51370:2;51374:7;51337:26;:45::i;:::-;51415:1;51399:18;;:4;:18;;;51395:187;;;51434:40;51466:7;51434:31;:40::i;:::-;51395:187;;;51504:2;51496:10;;:4;:10;;;51492:90;;51523:47;51556:4;51562:7;51523:32;:47::i;:::-;51492:90;51395:187;51610:1;51596:16;;:2;:16;;;51592:183;;;51629:45;51666:7;51629:36;:45::i;:::-;51592:183;;;51702:4;51696:10;;:2;:10;;;51692:83;;51723:40;51751:2;51755:7;51723:27;:40::i;:::-;51692:83;51592:183;51193:589;;;:::o;43802:382::-;43896:1;43882:16;;:2;:16;;;;43874:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43955:16;43963:7;43955;:16::i;:::-;43954:17;43946:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44017:45;44046:1;44050:2;44054:7;44017:20;:45::i;:::-;44092:1;44075:9;:13;44085:2;44075:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44123:2;44104:7;:16;44112:7;44104:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44168:7;44164:2;44143:33;;44160:1;44143:33;;;;;;;;;;;;43802:382;;:::o;17618:387::-;17678:4;17886:12;17953:7;17941:20;17933:28;;17996:1;17989:4;:8;17982:15;;;17618:387;;;:::o;48373:126::-;;;;:::o;52505:164::-;52609:10;:17;;;;52582:15;:24;52598:7;52582:24;;;;;;;;;;;:44;;;;52637:10;52653:7;52637:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52505:164;:::o;53296:988::-;53562:22;53612:1;53587:22;53604:4;53587:16;:22::i;:::-;:26;;;;:::i;:::-;53562:51;;53624:18;53645:17;:26;53663:7;53645:26;;;;;;;;;;;;53624:47;;53792:14;53778:10;:28;53774:328;;53823:19;53845:12;:18;53858:4;53845:18;;;;;;;;;;;;;;;:34;53864:14;53845:34;;;;;;;;;;;;53823:56;;53929:11;53896:12;:18;53909:4;53896:18;;;;;;;;;;;;;;;:30;53915:10;53896:30;;;;;;;;;;;:44;;;;54046:10;54013:17;:30;54031:11;54013:30;;;;;;;;;;;:43;;;;53808:294;53774:328;54198:17;:26;54216:7;54198:26;;;;;;;;;;;54191:33;;;54242:12;:18;54255:4;54242:18;;;;;;;;;;;;;;;:34;54261:14;54242:34;;;;;;;;;;;54235:41;;;53377:907;;53296:988;;:::o;54579:1079::-;54832:22;54877:1;54857:10;:17;;;;:21;;;;:::i;:::-;54832:46;;54889:18;54910:15;:24;54926:7;54910:24;;;;;;;;;;;;54889:45;;55261:19;55283:10;55294:14;55283:26;;;;;;;;:::i;:::-;;;;;;;;;;55261:48;;55347:11;55322:10;55333;55322:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;55458:10;55427:15;:28;55443:11;55427:28;;;;;;;;;;;:41;;;;55599:15;:24;55615:7;55599:24;;;;;;;;;;;55592:31;;;55634:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54650:1008;;;54579:1079;:::o;52083:221::-;52168:14;52185:20;52202:2;52185:16;:20::i;:::-;52168:37;;52243:7;52216:12;:16;52229:2;52216:16;;;;;;;;;;;;;;;:24;52233:6;52216:24;;;;;;;;;;;:34;;;;52290:6;52261:17;:26;52279:7;52261:26;;;;;;;;;;;:35;;;;52157:147;52083:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:345::-;5830:6;5879:2;5867:9;5858:7;5854:23;5850:32;5847:119;;;5885:79;;:::i;:::-;5847:119;6005:1;6030:61;6083:7;6074:6;6063:9;6059:22;6030:61;:::i;:::-;6020:71;;5976:125;5763:345;;;;:::o;6114:327::-;6172:6;6221:2;6209:9;6200:7;6196:23;6192:32;6189:119;;;6227:79;;:::i;:::-;6189:119;6347:1;6372:52;6416:7;6407:6;6396:9;6392:22;6372:52;:::i;:::-;6362:62;;6318:116;6114:327;;;;:::o;6447:349::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:63;6771:7;6762:6;6751:9;6747:22;6716:63;:::i;:::-;6706:73;;6662:127;6447:349;;;;:::o;6802:509::-;6871:6;6920:2;6908:9;6899:7;6895:23;6891:32;6888:119;;;6926:79;;:::i;:::-;6888:119;7074:1;7063:9;7059:17;7046:31;7104:18;7096:6;7093:30;7090:117;;;7126:79;;:::i;:::-;7090:117;7231:63;7286:7;7277:6;7266:9;7262:22;7231:63;:::i;:::-;7221:73;;7017:287;6802:509;;;;:::o;7317:329::-;7376:6;7425:2;7413:9;7404:7;7400:23;7396:32;7393:119;;;7431:79;;:::i;:::-;7393:119;7551:1;7576:53;7621:7;7612:6;7601:9;7597:22;7576:53;:::i;:::-;7566:63;;7522:117;7317:329;;;;:::o;7652:118::-;7739:24;7757:5;7739:24;:::i;:::-;7734:3;7727:37;7652:118;;:::o;7776:109::-;7857:21;7872:5;7857:21;:::i;:::-;7852:3;7845:34;7776:109;;:::o;7891:360::-;7977:3;8005:38;8037:5;8005:38;:::i;:::-;8059:70;8122:6;8117:3;8059:70;:::i;:::-;8052:77;;8138:52;8183:6;8178:3;8171:4;8164:5;8160:16;8138:52;:::i;:::-;8215:29;8237:6;8215:29;:::i;:::-;8210:3;8206:39;8199:46;;7981:270;7891:360;;;;:::o;8257:364::-;8345:3;8373:39;8406:5;8373:39;:::i;:::-;8428:71;8492:6;8487:3;8428:71;:::i;:::-;8421:78;;8508:52;8553:6;8548:3;8541:4;8534:5;8530:16;8508:52;:::i;:::-;8585:29;8607:6;8585:29;:::i;:::-;8580:3;8576:39;8569:46;;8349:272;8257:364;;;;:::o;8627:377::-;8733:3;8761:39;8794:5;8761:39;:::i;:::-;8816:89;8898:6;8893:3;8816:89;:::i;:::-;8809:96;;8914:52;8959:6;8954:3;8947:4;8940:5;8936:16;8914:52;:::i;:::-;8991:6;8986:3;8982:16;8975:23;;8737:267;8627:377;;;;:::o;9010:366::-;9152:3;9173:67;9237:2;9232:3;9173:67;:::i;:::-;9166:74;;9249:93;9338:3;9249:93;:::i;:::-;9367:2;9362:3;9358:12;9351:19;;9010:366;;;:::o;9382:::-;9524:3;9545:67;9609:2;9604:3;9545:67;:::i;:::-;9538:74;;9621:93;9710:3;9621:93;:::i;:::-;9739:2;9734:3;9730:12;9723:19;;9382:366;;;:::o;9754:::-;9896:3;9917:67;9981:2;9976:3;9917:67;:::i;:::-;9910:74;;9993:93;10082:3;9993:93;:::i;:::-;10111:2;10106:3;10102:12;10095:19;;9754:366;;;:::o;10126:::-;10268:3;10289:67;10353:2;10348:3;10289:67;:::i;:::-;10282:74;;10365:93;10454:3;10365:93;:::i;:::-;10483:2;10478:3;10474:12;10467:19;;10126:366;;;:::o;10498:::-;10640:3;10661:67;10725:2;10720:3;10661:67;:::i;:::-;10654:74;;10737:93;10826:3;10737:93;:::i;:::-;10855:2;10850:3;10846:12;10839:19;;10498:366;;;:::o;10870:::-;11012:3;11033:67;11097:2;11092:3;11033:67;:::i;:::-;11026:74;;11109:93;11198:3;11109:93;:::i;:::-;11227:2;11222:3;11218:12;11211:19;;10870:366;;;:::o;11242:::-;11384:3;11405:67;11469:2;11464:3;11405:67;:::i;:::-;11398:74;;11481:93;11570:3;11481:93;:::i;:::-;11599:2;11594:3;11590:12;11583:19;;11242:366;;;:::o;11614:::-;11756:3;11777:67;11841:2;11836:3;11777:67;:::i;:::-;11770:74;;11853:93;11942:3;11853:93;:::i;:::-;11971:2;11966:3;11962:12;11955:19;;11614:366;;;:::o;11986:::-;12128:3;12149:67;12213:2;12208:3;12149:67;:::i;:::-;12142:74;;12225:93;12314:3;12225:93;:::i;:::-;12343:2;12338:3;12334:12;12327:19;;11986:366;;;:::o;12358:::-;12500:3;12521:67;12585:2;12580:3;12521:67;:::i;:::-;12514:74;;12597:93;12686:3;12597:93;:::i;:::-;12715:2;12710:3;12706:12;12699:19;;12358:366;;;:::o;12730:::-;12872:3;12893:67;12957:2;12952:3;12893:67;:::i;:::-;12886:74;;12969:93;13058:3;12969:93;:::i;:::-;13087:2;13082:3;13078:12;13071:19;;12730:366;;;:::o;13102:::-;13244:3;13265:67;13329:2;13324:3;13265:67;:::i;:::-;13258:74;;13341:93;13430:3;13341:93;:::i;:::-;13459:2;13454:3;13450:12;13443:19;;13102:366;;;:::o;13474:::-;13616:3;13637:67;13701:2;13696:3;13637:67;:::i;:::-;13630:74;;13713:93;13802:3;13713:93;:::i;:::-;13831:2;13826:3;13822:12;13815:19;;13474:366;;;:::o;13846:::-;13988:3;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14085:93;14174:3;14085:93;:::i;:::-;14203:2;14198:3;14194:12;14187:19;;13846:366;;;:::o;14218:::-;14360:3;14381:67;14445:2;14440:3;14381:67;:::i;:::-;14374:74;;14457:93;14546:3;14457:93;:::i;:::-;14575:2;14570:3;14566:12;14559:19;;14218:366;;;:::o;14590:::-;14732:3;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14829:93;14918:3;14829:93;:::i;:::-;14947:2;14942:3;14938:12;14931:19;;14590:366;;;:::o;14962:::-;15104:3;15125:67;15189:2;15184:3;15125:67;:::i;:::-;15118:74;;15201:93;15290:3;15201:93;:::i;:::-;15319:2;15314:3;15310:12;15303:19;;14962:366;;;:::o;15334:::-;15476:3;15497:67;15561:2;15556:3;15497:67;:::i;:::-;15490:74;;15573:93;15662:3;15573:93;:::i;:::-;15691:2;15686:3;15682:12;15675:19;;15334:366;;;:::o;15706:::-;15848:3;15869:67;15933:2;15928:3;15869:67;:::i;:::-;15862:74;;15945:93;16034:3;15945:93;:::i;:::-;16063:2;16058:3;16054:12;16047:19;;15706:366;;;:::o;16078:::-;16220:3;16241:67;16305:2;16300:3;16241:67;:::i;:::-;16234:74;;16317:93;16406:3;16317:93;:::i;:::-;16435:2;16430:3;16426:12;16419:19;;16078:366;;;:::o;16450:::-;16592:3;16613:67;16677:2;16672:3;16613:67;:::i;:::-;16606:74;;16689:93;16778:3;16689:93;:::i;:::-;16807:2;16802:3;16798:12;16791:19;;16450:366;;;:::o;16822:::-;16964:3;16985:67;17049:2;17044:3;16985:67;:::i;:::-;16978:74;;17061:93;17150:3;17061:93;:::i;:::-;17179:2;17174:3;17170:12;17163:19;;16822:366;;;:::o;17194:::-;17336:3;17357:67;17421:2;17416:3;17357:67;:::i;:::-;17350:74;;17433:93;17522:3;17433:93;:::i;:::-;17551:2;17546:3;17542:12;17535:19;;17194:366;;;:::o;17566:::-;17708:3;17729:67;17793:2;17788:3;17729:67;:::i;:::-;17722:74;;17805:93;17894:3;17805:93;:::i;:::-;17923:2;17918:3;17914:12;17907:19;;17566:366;;;:::o;17938:118::-;18025:24;18043:5;18025:24;:::i;:::-;18020:3;18013:37;17938:118;;:::o;18062:435::-;18242:3;18264:95;18355:3;18346:6;18264:95;:::i;:::-;18257:102;;18376:95;18467:3;18458:6;18376:95;:::i;:::-;18369:102;;18488:3;18481:10;;18062:435;;;;;:::o;18503:222::-;18596:4;18634:2;18623:9;18619:18;18611:26;;18647:71;18715:1;18704:9;18700:17;18691:6;18647:71;:::i;:::-;18503:222;;;;:::o;18731:640::-;18926:4;18964:3;18953:9;18949:19;18941:27;;18978:71;19046:1;19035:9;19031:17;19022:6;18978:71;:::i;:::-;19059:72;19127:2;19116:9;19112:18;19103:6;19059:72;:::i;:::-;19141;19209:2;19198:9;19194:18;19185:6;19141:72;:::i;:::-;19260:9;19254:4;19250:20;19245:2;19234:9;19230:18;19223:48;19288:76;19359:4;19350:6;19288:76;:::i;:::-;19280:84;;18731:640;;;;;;;:::o;19377:210::-;19464:4;19502:2;19491:9;19487:18;19479:26;;19515:65;19577:1;19566:9;19562:17;19553:6;19515:65;:::i;:::-;19377:210;;;;:::o;19593:313::-;19706:4;19744:2;19733:9;19729:18;19721:26;;19793:9;19787:4;19783:20;19779:1;19768:9;19764:17;19757:47;19821:78;19894:4;19885:6;19821:78;:::i;:::-;19813:86;;19593:313;;;;:::o;19912:419::-;20078:4;20116:2;20105:9;20101:18;20093:26;;20165:9;20159:4;20155:20;20151:1;20140:9;20136:17;20129:47;20193:131;20319:4;20193:131;:::i;:::-;20185:139;;19912:419;;;:::o;20337:::-;20503:4;20541:2;20530:9;20526:18;20518:26;;20590:9;20584:4;20580:20;20576:1;20565:9;20561:17;20554:47;20618:131;20744:4;20618:131;:::i;:::-;20610:139;;20337:419;;;:::o;20762:::-;20928:4;20966:2;20955:9;20951:18;20943:26;;21015:9;21009:4;21005:20;21001:1;20990:9;20986:17;20979:47;21043:131;21169:4;21043:131;:::i;:::-;21035:139;;20762:419;;;:::o;21187:::-;21353:4;21391:2;21380:9;21376:18;21368:26;;21440:9;21434:4;21430:20;21426:1;21415:9;21411:17;21404:47;21468:131;21594:4;21468:131;:::i;:::-;21460:139;;21187:419;;;:::o;21612:::-;21778:4;21816:2;21805:9;21801:18;21793:26;;21865:9;21859:4;21855:20;21851:1;21840:9;21836:17;21829:47;21893:131;22019:4;21893:131;:::i;:::-;21885:139;;21612:419;;;:::o;22037:::-;22203:4;22241:2;22230:9;22226:18;22218:26;;22290:9;22284:4;22280:20;22276:1;22265:9;22261:17;22254:47;22318:131;22444:4;22318:131;:::i;:::-;22310:139;;22037:419;;;:::o;22462:::-;22628:4;22666:2;22655:9;22651:18;22643:26;;22715:9;22709:4;22705:20;22701:1;22690:9;22686:17;22679:47;22743:131;22869:4;22743:131;:::i;:::-;22735:139;;22462:419;;;:::o;22887:::-;23053:4;23091:2;23080:9;23076:18;23068:26;;23140:9;23134:4;23130:20;23126:1;23115:9;23111:17;23104:47;23168:131;23294:4;23168:131;:::i;:::-;23160:139;;22887:419;;;:::o;23312:::-;23478:4;23516:2;23505:9;23501:18;23493:26;;23565:9;23559:4;23555:20;23551:1;23540:9;23536:17;23529:47;23593:131;23719:4;23593:131;:::i;:::-;23585:139;;23312:419;;;:::o;23737:::-;23903:4;23941:2;23930:9;23926:18;23918:26;;23990:9;23984:4;23980:20;23976:1;23965:9;23961:17;23954:47;24018:131;24144:4;24018:131;:::i;:::-;24010:139;;23737:419;;;:::o;24162:::-;24328:4;24366:2;24355:9;24351:18;24343:26;;24415:9;24409:4;24405:20;24401:1;24390:9;24386:17;24379:47;24443:131;24569:4;24443:131;:::i;:::-;24435:139;;24162:419;;;:::o;24587:::-;24753:4;24791:2;24780:9;24776:18;24768:26;;24840:9;24834:4;24830:20;24826:1;24815:9;24811:17;24804:47;24868:131;24994:4;24868:131;:::i;:::-;24860:139;;24587:419;;;:::o;25012:::-;25178:4;25216:2;25205:9;25201:18;25193:26;;25265:9;25259:4;25255:20;25251:1;25240:9;25236:17;25229:47;25293:131;25419:4;25293:131;:::i;:::-;25285:139;;25012:419;;;:::o;25437:::-;25603:4;25641:2;25630:9;25626:18;25618:26;;25690:9;25684:4;25680:20;25676:1;25665:9;25661:17;25654:47;25718:131;25844:4;25718:131;:::i;:::-;25710:139;;25437:419;;;:::o;25862:::-;26028:4;26066:2;26055:9;26051:18;26043:26;;26115:9;26109:4;26105:20;26101:1;26090:9;26086:17;26079:47;26143:131;26269:4;26143:131;:::i;:::-;26135:139;;25862:419;;;:::o;26287:::-;26453:4;26491:2;26480:9;26476:18;26468:26;;26540:9;26534:4;26530:20;26526:1;26515:9;26511:17;26504:47;26568:131;26694:4;26568:131;:::i;:::-;26560:139;;26287:419;;;:::o;26712:::-;26878:4;26916:2;26905:9;26901:18;26893:26;;26965:9;26959:4;26955:20;26951:1;26940:9;26936:17;26929:47;26993:131;27119:4;26993:131;:::i;:::-;26985:139;;26712:419;;;:::o;27137:::-;27303:4;27341:2;27330:9;27326:18;27318:26;;27390:9;27384:4;27380:20;27376:1;27365:9;27361:17;27354:47;27418:131;27544:4;27418:131;:::i;:::-;27410:139;;27137:419;;;:::o;27562:::-;27728:4;27766:2;27755:9;27751:18;27743:26;;27815:9;27809:4;27805:20;27801:1;27790:9;27786:17;27779:47;27843:131;27969:4;27843:131;:::i;:::-;27835:139;;27562:419;;;:::o;27987:::-;28153:4;28191:2;28180:9;28176:18;28168:26;;28240:9;28234:4;28230:20;28226:1;28215:9;28211:17;28204:47;28268:131;28394:4;28268:131;:::i;:::-;28260:139;;27987:419;;;:::o;28412:::-;28578:4;28616:2;28605:9;28601:18;28593:26;;28665:9;28659:4;28655:20;28651:1;28640:9;28636:17;28629:47;28693:131;28819:4;28693:131;:::i;:::-;28685:139;;28412:419;;;:::o;28837:::-;29003:4;29041:2;29030:9;29026:18;29018:26;;29090:9;29084:4;29080:20;29076:1;29065:9;29061:17;29054:47;29118:131;29244:4;29118:131;:::i;:::-;29110:139;;28837:419;;;:::o;29262:::-;29428:4;29466:2;29455:9;29451:18;29443:26;;29515:9;29509:4;29505:20;29501:1;29490:9;29486:17;29479:47;29543:131;29669:4;29543:131;:::i;:::-;29535:139;;29262:419;;;:::o;29687:::-;29853:4;29891:2;29880:9;29876:18;29868:26;;29940:9;29934:4;29930:20;29926:1;29915:9;29911:17;29904:47;29968:131;30094:4;29968:131;:::i;:::-;29960:139;;29687:419;;;:::o;30112:222::-;30205:4;30243:2;30232:9;30228:18;30220:26;;30256:71;30324:1;30313:9;30309:17;30300:6;30256:71;:::i;:::-;30112:222;;;;:::o;30340:129::-;30374:6;30401:20;;:::i;:::-;30391:30;;30430:33;30458:4;30450:6;30430:33;:::i;:::-;30340:129;;;:::o;30475:75::-;30508:6;30541:2;30535:9;30525:19;;30475:75;:::o;30556:307::-;30617:4;30707:18;30699:6;30696:30;30693:56;;;30729:18;;:::i;:::-;30693:56;30767:29;30789:6;30767:29;:::i;:::-;30759:37;;30851:4;30845;30841:15;30833:23;;30556:307;;;:::o;30869:308::-;30931:4;31021:18;31013:6;31010:30;31007:56;;;31043:18;;:::i;:::-;31007:56;31081:29;31103:6;31081:29;:::i;:::-;31073:37;;31165:4;31159;31155:15;31147:23;;30869:308;;;:::o;31183:98::-;31234:6;31268:5;31262:12;31252:22;;31183:98;;;:::o;31287:99::-;31339:6;31373:5;31367:12;31357:22;;31287:99;;;:::o;31392:168::-;31475:11;31509:6;31504:3;31497:19;31549:4;31544:3;31540:14;31525:29;;31392:168;;;;:::o;31566:169::-;31650:11;31684:6;31679:3;31672:19;31724:4;31719:3;31715:14;31700:29;;31566:169;;;;:::o;31741:148::-;31843:11;31880:3;31865:18;;31741:148;;;;:::o;31895:305::-;31935:3;31954:20;31972:1;31954:20;:::i;:::-;31949:25;;31988:20;32006:1;31988:20;:::i;:::-;31983:25;;32142:1;32074:66;32070:74;32067:1;32064:81;32061:107;;;32148:18;;:::i;:::-;32061:107;32192:1;32189;32185:9;32178:16;;31895:305;;;;:::o;32206:185::-;32246:1;32263:20;32281:1;32263:20;:::i;:::-;32258:25;;32297:20;32315:1;32297:20;:::i;:::-;32292:25;;32336:1;32326:35;;32341:18;;:::i;:::-;32326:35;32383:1;32380;32376:9;32371:14;;32206:185;;;;:::o;32397:191::-;32437:4;32457:20;32475:1;32457:20;:::i;:::-;32452:25;;32491:20;32509:1;32491:20;:::i;:::-;32486:25;;32530:1;32527;32524:8;32521:34;;;32535:18;;:::i;:::-;32521:34;32580:1;32577;32573:9;32565:17;;32397:191;;;;:::o;32594:96::-;32631:7;32660:24;32678:5;32660:24;:::i;:::-;32649:35;;32594:96;;;:::o;32696:90::-;32730:7;32773:5;32766:13;32759:21;32748:32;;32696:90;;;:::o;32792:149::-;32828:7;32868:66;32861:5;32857:78;32846:89;;32792:149;;;:::o;32947:126::-;32984:7;33024:42;33017:5;33013:54;33002:65;;32947:126;;;:::o;33079:77::-;33116:7;33145:5;33134:16;;33079:77;;;:::o;33162:154::-;33246:6;33241:3;33236;33223:30;33308:1;33299:6;33294:3;33290:16;33283:27;33162:154;;;:::o;33322:307::-;33390:1;33400:113;33414:6;33411:1;33408:13;33400:113;;;33499:1;33494:3;33490:11;33484:18;33480:1;33475:3;33471:11;33464:39;33436:2;33433:1;33429:10;33424:15;;33400:113;;;33531:6;33528:1;33525:13;33522:101;;;33611:1;33602:6;33597:3;33593:16;33586:27;33522:101;33371:258;33322:307;;;:::o;33635:320::-;33679:6;33716:1;33710:4;33706:12;33696:22;;33763:1;33757:4;33753:12;33784:18;33774:81;;33840:4;33832:6;33828:17;33818:27;;33774:81;33902:2;33894:6;33891:14;33871:18;33868:38;33865:84;;;33921:18;;:::i;:::-;33865:84;33686:269;33635:320;;;:::o;33961:281::-;34044:27;34066:4;34044:27;:::i;:::-;34036:6;34032:40;34174:6;34162:10;34159:22;34138:18;34126:10;34123:34;34120:62;34117:88;;;34185:18;;:::i;:::-;34117:88;34225:10;34221:2;34214:22;34004:238;33961:281;;:::o;34248:233::-;34287:3;34310:24;34328:5;34310:24;:::i;:::-;34301:33;;34356:66;34349:5;34346:77;34343:103;;;34426:18;;:::i;:::-;34343:103;34473:1;34466:5;34462:13;34455:20;;34248:233;;;:::o;34487:176::-;34519:1;34536:20;34554:1;34536:20;:::i;:::-;34531:25;;34570:20;34588:1;34570:20;:::i;:::-;34565:25;;34609:1;34599:35;;34614:18;;:::i;:::-;34599:35;34655:1;34652;34648:9;34643:14;;34487:176;;;;:::o;34669:180::-;34717:77;34714:1;34707:88;34814:4;34811:1;34804:15;34838:4;34835:1;34828:15;34855:180;34903:77;34900:1;34893:88;35000:4;34997:1;34990:15;35024:4;35021:1;35014:15;35041:180;35089:77;35086:1;35079:88;35186:4;35183:1;35176:15;35210:4;35207:1;35200:15;35227:180;35275:77;35272:1;35265:88;35372:4;35369:1;35362:15;35396:4;35393:1;35386:15;35413:180;35461:77;35458:1;35451:88;35558:4;35555:1;35548:15;35582:4;35579:1;35572:15;35599:180;35647:77;35644:1;35637:88;35744:4;35741:1;35734:15;35768:4;35765:1;35758:15;35785:117;35894:1;35891;35884:12;35908:117;36017:1;36014;36007:12;36031:117;36140:1;36137;36130:12;36154:117;36263:1;36260;36253:12;36277:102;36318:6;36369:2;36365:7;36360:2;36353:5;36349:14;36345:28;36335:38;;36277:102;;;:::o;36385:230::-;36525:34;36521:1;36513:6;36509:14;36502:58;36594:13;36589:2;36581:6;36577:15;36570:38;36385:230;:::o;36621:237::-;36761:34;36757:1;36749:6;36745:14;36738:58;36830:20;36825:2;36817:6;36813:15;36806:45;36621:237;:::o;36864:225::-;37004:34;37000:1;36992:6;36988:14;36981:58;37073:8;37068:2;37060:6;37056:15;37049:33;36864:225;:::o;37095:178::-;37235:30;37231:1;37223:6;37219:14;37212:54;37095:178;:::o;37279:223::-;37419:34;37415:1;37407:6;37403:14;37396:58;37488:6;37483:2;37475:6;37471:15;37464:31;37279:223;:::o;37508:175::-;37648:27;37644:1;37636:6;37632:14;37625:51;37508:175;:::o;37689:231::-;37829:34;37825:1;37817:6;37813:14;37806:58;37898:14;37893:2;37885:6;37881:15;37874:39;37689:231;:::o;37926:171::-;38066:23;38062:1;38054:6;38050:14;38043:47;37926:171;:::o;38103:243::-;38243:34;38239:1;38231:6;38227:14;38220:58;38312:26;38307:2;38299:6;38295:15;38288:51;38103:243;:::o;38352:229::-;38492:34;38488:1;38480:6;38476:14;38469:58;38561:12;38556:2;38548:6;38544:15;38537:37;38352:229;:::o;38587:228::-;38727:34;38723:1;38715:6;38711:14;38704:58;38796:11;38791:2;38783:6;38779:15;38772:36;38587:228;:::o;38821:182::-;38961:34;38957:1;38949:6;38945:14;38938:58;38821:182;:::o;39009:169::-;39149:21;39145:1;39137:6;39133:14;39126:45;39009:169;:::o;39184:231::-;39324:34;39320:1;39312:6;39308:14;39301:58;39393:14;39388:2;39380:6;39376:15;39369:39;39184:231;:::o;39421:182::-;39561:34;39557:1;39549:6;39545:14;39538:58;39421:182;:::o;39609:228::-;39749:34;39745:1;39737:6;39733:14;39726:58;39818:11;39813:2;39805:6;39801:15;39794:36;39609:228;:::o;39843:234::-;39983:34;39979:1;39971:6;39967:14;39960:58;40052:17;40047:2;40039:6;40035:15;40028:42;39843:234;:::o;40083:179::-;40223:31;40219:1;40211:6;40207:14;40200:55;40083:179;:::o;40268:177::-;40408:29;40404:1;40396:6;40392:14;40385:53;40268:177;:::o;40451:220::-;40591:34;40587:1;40579:6;40575:14;40568:58;40660:3;40655:2;40647:6;40643:15;40636:28;40451:220;:::o;40677:236::-;40817:34;40813:1;40805:6;40801:14;40794:58;40886:19;40881:2;40873:6;40869:15;40862:44;40677:236;:::o;40919:231::-;41059:34;41055:1;41047:6;41043:14;41036:58;41128:14;41123:2;41115:6;41111:15;41104:39;40919:231;:::o;41156:181::-;41296:33;41292:1;41284:6;41280:14;41273:57;41156:181;:::o;41343:235::-;41483:34;41479:1;41471:6;41467:14;41460:58;41552:18;41547:2;41539:6;41535:15;41528:43;41343:235;:::o;41584:122::-;41657:24;41675:5;41657:24;:::i;:::-;41650:5;41647:35;41637:63;;41696:1;41693;41686:12;41637:63;41584:122;:::o;41712:116::-;41782:21;41797:5;41782:21;:::i;:::-;41775:5;41772:32;41762:60;;41818:1;41815;41808:12;41762:60;41712:116;:::o;41834:120::-;41906:23;41923:5;41906:23;:::i;:::-;41899:5;41896:34;41886:62;;41944:1;41941;41934:12;41886:62;41834:120;:::o;41960:122::-;42033:24;42051:5;42033:24;:::i;:::-;42026:5;42023:35;42013:63;;42072:1;42069;42062:12;42013:63;41960:122;:::o

Swarm Source

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