ETH Price: $3,453.68 (+1.14%)
Gas: 16 Gwei

Token

Tactus (TACT)
 

Overview

Max Total Supply

906 TACT

Holders

270

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 TACT
0xd6154434d319c9c330cd28e02f1f62d6d04766e3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
KaktusNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// 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/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/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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 (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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/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/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// 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: contracts/KaktusNFT.sol


pragma solidity ^0.8.0;







contract KaktusNFT is ERC721, ERC721Enumerable, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;
    uint public constant maxPurchase = 3;
    uint256 public constant MAX_TOKENS = 10000;
    string public baseExtension = ".json";
    uint256 private _kaktusPrice = 120000000000000000; //0,12 ETH
    string private baseURI;
    bool public saleIsActive = true;

    
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
    }


  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

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

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

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function setPrice(uint256 _newPrice) public onlyOwner() {
        _kaktusPrice = _newPrice;
    }

    function getPrice() public view returns (uint256){
        return _kaktusPrice;
    }

    function mintKaktus(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint");
        require(numberOfTokens <= maxPurchase, "Can only mint 10 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply");
        require(_kaktusPrice.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex + 1);
            }
        }
    }

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

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","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":"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":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintKaktus","outputs":[],"stateMutability":"payable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b908051906020019062000051929190620002bf565b506701aa535d3d0c0000600c556001600e60006101000a81548160ff0219169083151502179055503480156200008657600080fd5b506040516200467b3803806200467b8339818101604052810190620000ac9190620003ed565b82828160009080519060200190620000c6929190620002bf565b508060019080519060200190620000df929190620002bf565b50505062000102620000f66200011c60201b60201c565b6200012460201b60201c565b6200011381620001ea60201b60201c565b505050620006ad565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001fa6200011c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002206200029560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027090620004cd565b60405180910390fd5b80600d908051906020019062000291929190620002bf565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002cd9062000595565b90600052602060002090601f016020900481019282620002f157600085556200033d565b82601f106200030c57805160ff19168380011785556200033d565b828001600101855582156200033d579182015b828111156200033c5782518255916020019190600101906200031f565b5b5090506200034c919062000350565b5090565b5b808211156200036b57600081600090555060010162000351565b5090565b600062000386620003808462000518565b620004ef565b905082815260208101848484011115620003a557620003a462000664565b5b620003b28482856200055f565b509392505050565b600082601f830112620003d257620003d16200065f565b5b8151620003e48482602086016200036f565b91505092915050565b6000806000606084860312156200040957620004086200066e565b5b600084015167ffffffffffffffff8111156200042a576200042962000669565b5b6200043886828701620003ba565b935050602084015167ffffffffffffffff8111156200045c576200045b62000669565b5b6200046a86828701620003ba565b925050604084015167ffffffffffffffff8111156200048e576200048d62000669565b5b6200049c86828701620003ba565b9150509250925092565b6000620004b56020836200054e565b9150620004c28262000684565b602082019050919050565b60006020820190508181036000830152620004e881620004a6565b9050919050565b6000620004fb6200050e565b9050620005098282620005cb565b919050565b6000604051905090565b600067ffffffffffffffff82111562000536576200053562000630565b5b620005418262000673565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200057f57808201518184015260208101905062000562565b838111156200058f576000848401525b50505050565b60006002820490506001821680620005ae57607f821691505b60208210811415620005c557620005c462000601565b5b50919050565b620005d68262000673565b810181811067ffffffffffffffff82111715620005f857620005f762000630565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613fbe80620006bd6000396000f3fe6080604052600436106101c25760003560e01c8063715018a6116100f7578063b88d4fde11610095578063eb8d244411610064578063eb8d244414610640578063f2fde38b1461066b578063f3ba147a14610694578063f47c84c5146106b0576101c2565b8063b88d4fde14610572578063c66828621461059b578063c87b56dd146105c6578063e985e9c514610603576101c2565b806395d89b41116100d157806395d89b41146104c8578063977b055b146104f357806398d5fdca1461051e578063a22cb46514610549576101c2565b8063715018a61461045d5780638da5cb5b1461047457806391b7f5ed1461049f576101c2565b806334918dfd116101645780634f6ccce71161013e5780634f6ccce71461037d57806355f804b3146103ba5780636352211e146103e357806370a0823114610420576101c2565b806334918dfd146103265780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632f745c59146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612bd5565b6106db565b6040516101fb919061318e565b60405180910390f35b34801561021057600080fd5b506102196106ed565b60405161022691906131a9565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612c78565b61077f565b6040516102639190613127565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b95565b610804565b005b3480156102a157600080fd5b506102aa61091c565b6040516102b7919061348b565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612a7f565b610929565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612b95565b610989565b60405161031d919061348b565b60405180910390f35b34801561033257600080fd5b5061033b610a2e565b005b34801561034957600080fd5b50610352610ad6565b005b34801561036057600080fd5b5061037b60048036038101906103769190612a7f565b610ba1565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612c78565b610bc1565b6040516103b1919061348b565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190612c2f565b610c32565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190612c78565b610cc8565b6040516104179190613127565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190612a12565b610d7a565b604051610454919061348b565b60405180910390f35b34801561046957600080fd5b50610472610e32565b005b34801561048057600080fd5b50610489610eba565b6040516104969190613127565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190612c78565b610ee4565b005b3480156104d457600080fd5b506104dd610f6a565b6040516104ea91906131a9565b60405180910390f35b3480156104ff57600080fd5b50610508610ffc565b604051610515919061348b565b60405180910390f35b34801561052a57600080fd5b50610533611001565b604051610540919061348b565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b9190612b55565b61100b565b005b34801561057e57600080fd5b5061059960048036038101906105949190612ad2565b611021565b005b3480156105a757600080fd5b506105b0611083565b6040516105bd91906131a9565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190612c78565b611111565b6040516105fa91906131a9565b60405180910390f35b34801561060f57600080fd5b5061062a60048036038101906106259190612a3f565b6111bb565b604051610637919061318e565b60405180910390f35b34801561064c57600080fd5b5061065561124f565b604051610662919061318e565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190612a12565b611262565b005b6106ae60048036038101906106a99190612c78565b61135a565b005b3480156106bc57600080fd5b506106c56114f9565b6040516106d2919061348b565b60405180910390f35b60006106e6826114ff565b9050919050565b6060600080546106fc90613750565b80601f016020809104026020016040519081016040528092919081815260200182805461072890613750565b80156107755780601f1061074a57610100808354040283529160200191610775565b820191906000526020600020905b81548152906001019060200180831161075857829003601f168201915b5050505050905090565b600061078a82611579565b6107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c0906133ab565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080f82610cc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061340b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089f6115e5565b73ffffffffffffffffffffffffffffffffffffffff1614806108ce57506108cd816108c86115e5565b6111bb565b5b61090d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109049061330b565b60405180910390fd5b61091783836115ed565b505050565b6000600880549050905090565b61093a6109346115e5565b826116a6565b610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709061342b565b60405180910390fd5b610984838383611784565b505050565b600061099483610d7a565b82106109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc906131cb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a366115e5565b73ffffffffffffffffffffffffffffffffffffffff16610a54610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906133cb565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610ade6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610afc610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906133cb565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b9d573d6000803e3d6000fd5b5050565b610bbc83838360405180602001604052806000815250611021565b505050565b6000610bcb61091c565b8210610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c039061344b565b60405180910390fd5b60088281548110610c2057610c1f6138e9565b5b90600052602060002001549050919050565b610c3a6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610c58610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906133cb565b60405180910390fd5b80600d9080519060200190610cc4929190612826565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d689061334b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061332b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e3a6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610e58610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906133cb565b60405180910390fd5b610eb860006119eb565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eec6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610f0a610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f57906133cb565b60405180910390fd5b80600c8190555050565b606060018054610f7990613750565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa590613750565b8015610ff25780601f10610fc757610100808354040283529160200191610ff2565b820191906000526020600020905b815481529060010190602001808311610fd557829003601f168201915b5050505050905090565b600381565b6000600c54905090565b61101d6110166115e5565b8383611ab1565b5050565b61103261102c6115e5565b836116a6565b611071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110689061342b565b60405180910390fd5b61107d84848484611c1e565b50505050565b600b805461109090613750565b80601f01602080910402602001604051908101604052809291908181526020018280546110bc90613750565b80156111095780601f106110de57610100808354040283529160200191611109565b820191906000526020600020905b8154815290600101906020018083116110ec57829003601f168201915b505050505081565b606061111c82611579565b61115b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611152906133eb565b60405180910390fd5b6000611165611c7a565b9050600081511161118557604051806020016040528060008152506111b3565b8061118f84611d0c565b600b6040516020016111a3939291906130f6565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b61126a6115e5565b73ffffffffffffffffffffffffffffffffffffffff16611288610eba565b73ffffffffffffffffffffffffffffffffffffffff16146112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d5906133cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113459061320b565b60405180910390fd5b611357816119eb565b50565b600e60009054906101000a900460ff166113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a0906132cb565b60405180910390fd5b60038111156113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e49061346b565b60405180910390fd5b61271061140a826113fc61091c565b611e6d90919063ffffffff16565b111561144b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114429061336b565b60405180910390fd5b3461146182600c54611e8390919063ffffffff16565b11156114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499906132ab565b60405180910390fd5b60005b818110156114f55760006114b761091c565b90506127106114c461091c565b10156114e1576114e0336001836114db9190613585565b611e99565b5b5080806114ed906137b3565b9150506114a5565b5050565b61271081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611572575061157182611eb7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661166083610cc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116b182611579565b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e7906132eb565b60405180910390fd5b60006116fb83610cc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061176a57508373ffffffffffffffffffffffffffffffffffffffff166117528461077f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061177b575061177a81856111bb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117a482610cc8565b73ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f19061322b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061326b565b60405180910390fd5b611875838383611f99565b6118806000826115ed565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118d09190613666565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119279190613585565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e6838383611fa9565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b179061328b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c11919061318e565b60405180910390a3505050565b611c29848484611784565b611c3584848484611fae565b611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b906131eb565b60405180910390fd5b50505050565b6060600d8054611c8990613750565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590613750565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b5050505050905090565b60606000821415611d54576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e68565b600082905060005b60008214611d86578080611d6f906137b3565b915050600a82611d7f91906135db565b9150611d5c565b60008167ffffffffffffffff811115611da257611da1613918565b5b6040519080825280601f01601f191660200182016040528015611dd45781602001600182028036833780820191505090505b5090505b60008514611e6157600182611ded9190613666565b9150600a85611dfc91906137fc565b6030611e089190613585565b60f81b818381518110611e1e57611e1d6138e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e5a91906135db565b9450611dd8565b8093505050505b919050565b60008183611e7b9190613585565b905092915050565b60008183611e91919061360c565b905092915050565b611eb3828260405180602001604052806000815250612145565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f8257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f925750611f91826121a0565b5b9050919050565b611fa483838361220a565b505050565b505050565b6000611fcf8473ffffffffffffffffffffffffffffffffffffffff1661231e565b15612138578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ff86115e5565b8786866040518563ffffffff1660e01b815260040161201a9493929190613142565b602060405180830381600087803b15801561203457600080fd5b505af192505050801561206557506040513d601f19601f820116820180604052508101906120629190612c02565b60015b6120e8573d8060008114612095576040519150601f19603f3d011682016040523d82523d6000602084013e61209a565b606091505b506000815114156120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906131eb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061213d565b600190505b949350505050565b61214f8383612341565b61215c6000848484611fae565b61219b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612192906131eb565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61221583838361251b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122585761225381612520565b612297565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612296576122958382612569565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122da576122d5816126d6565b612319565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123185761231782826127a7565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a89061338b565b60405180910390fd5b6123ba81611579565b156123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f19061324b565b60405180910390fd5b61240660008383611f99565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124569190613585565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251760008383611fa9565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161257684610d7a565b6125809190613666565b9050600060076000848152602001908152602001600020549050818114612665576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126ea9190613666565b905060006009600084815260200190815260200160002054905060006008838154811061271a576127196138e9565b5b90600052602060002001549050806008838154811061273c5761273b6138e9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061278b5761278a6138ba565b5b6001900381819060005260206000200160009055905550505050565b60006127b283610d7a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461283290613750565b90600052602060002090601f016020900481019282612854576000855561289b565b82601f1061286d57805160ff191683800117855561289b565b8280016001018555821561289b579182015b8281111561289a57825182559160200191906001019061287f565b5b5090506128a891906128ac565b5090565b5b808211156128c55760008160009055506001016128ad565b5090565b60006128dc6128d7846134cb565b6134a6565b9050828152602081018484840111156128f8576128f761394c565b5b61290384828561370e565b509392505050565b600061291e612919846134fc565b6134a6565b90508281526020810184848401111561293a5761293961394c565b5b61294584828561370e565b509392505050565b60008135905061295c81613f2c565b92915050565b60008135905061297181613f43565b92915050565b60008135905061298681613f5a565b92915050565b60008151905061299b81613f5a565b92915050565b600082601f8301126129b6576129b5613947565b5b81356129c68482602086016128c9565b91505092915050565b600082601f8301126129e4576129e3613947565b5b81356129f484826020860161290b565b91505092915050565b600081359050612a0c81613f71565b92915050565b600060208284031215612a2857612a27613956565b5b6000612a368482850161294d565b91505092915050565b60008060408385031215612a5657612a55613956565b5b6000612a648582860161294d565b9250506020612a758582860161294d565b9150509250929050565b600080600060608486031215612a9857612a97613956565b5b6000612aa68682870161294d565b9350506020612ab78682870161294d565b9250506040612ac8868287016129fd565b9150509250925092565b60008060008060808587031215612aec57612aeb613956565b5b6000612afa8782880161294d565b9450506020612b0b8782880161294d565b9350506040612b1c878288016129fd565b925050606085013567ffffffffffffffff811115612b3d57612b3c613951565b5b612b49878288016129a1565b91505092959194509250565b60008060408385031215612b6c57612b6b613956565b5b6000612b7a8582860161294d565b9250506020612b8b85828601612962565b9150509250929050565b60008060408385031215612bac57612bab613956565b5b6000612bba8582860161294d565b9250506020612bcb858286016129fd565b9150509250929050565b600060208284031215612beb57612bea613956565b5b6000612bf984828501612977565b91505092915050565b600060208284031215612c1857612c17613956565b5b6000612c268482850161298c565b91505092915050565b600060208284031215612c4557612c44613956565b5b600082013567ffffffffffffffff811115612c6357612c62613951565b5b612c6f848285016129cf565b91505092915050565b600060208284031215612c8e57612c8d613956565b5b6000612c9c848285016129fd565b91505092915050565b612cae8161369a565b82525050565b612cbd816136ac565b82525050565b6000612cce82613542565b612cd88185613558565b9350612ce881856020860161371d565b612cf18161395b565b840191505092915050565b6000612d078261354d565b612d118185613569565b9350612d2181856020860161371d565b612d2a8161395b565b840191505092915050565b6000612d408261354d565b612d4a818561357a565b9350612d5a81856020860161371d565b80840191505092915050565b60008154612d7381613750565b612d7d818661357a565b94506001821660008114612d985760018114612da957612ddc565b60ff19831686528186019350612ddc565b612db28561352d565b60005b83811015612dd457815481890152600182019150602081019050612db5565b838801955050505b50505092915050565b6000612df2602b83613569565b9150612dfd8261396c565b604082019050919050565b6000612e15603283613569565b9150612e20826139bb565b604082019050919050565b6000612e38602683613569565b9150612e4382613a0a565b604082019050919050565b6000612e5b602583613569565b9150612e6682613a59565b604082019050919050565b6000612e7e601c83613569565b9150612e8982613aa8565b602082019050919050565b6000612ea1602483613569565b9150612eac82613ad1565b604082019050919050565b6000612ec4601983613569565b9150612ecf82613b20565b602082019050919050565b6000612ee7601f83613569565b9150612ef282613b49565b602082019050919050565b6000612f0a601b83613569565b9150612f1582613b72565b602082019050919050565b6000612f2d602c83613569565b9150612f3882613b9b565b604082019050919050565b6000612f50603883613569565b9150612f5b82613bea565b604082019050919050565b6000612f73602a83613569565b9150612f7e82613c39565b604082019050919050565b6000612f96602983613569565b9150612fa182613c88565b604082019050919050565b6000612fb9602083613569565b9150612fc482613cd7565b602082019050919050565b6000612fdc602083613569565b9150612fe782613d00565b602082019050919050565b6000612fff602c83613569565b915061300a82613d29565b604082019050919050565b6000613022602083613569565b915061302d82613d78565b602082019050919050565b6000613045602f83613569565b915061305082613da1565b604082019050919050565b6000613068602183613569565b915061307382613df0565b604082019050919050565b600061308b603183613569565b915061309682613e3f565b604082019050919050565b60006130ae602c83613569565b91506130b982613e8e565b604082019050919050565b60006130d1602183613569565b91506130dc82613edd565b604082019050919050565b6130f081613704565b82525050565b60006131028286612d35565b915061310e8285612d35565b915061311a8284612d66565b9150819050949350505050565b600060208201905061313c6000830184612ca5565b92915050565b60006080820190506131576000830187612ca5565b6131646020830186612ca5565b61317160408301856130e7565b81810360608301526131838184612cc3565b905095945050505050565b60006020820190506131a36000830184612cb4565b92915050565b600060208201905081810360008301526131c38184612cfc565b905092915050565b600060208201905081810360008301526131e481612de5565b9050919050565b6000602082019050818103600083015261320481612e08565b9050919050565b6000602082019050818103600083015261322481612e2b565b9050919050565b6000602082019050818103600083015261324481612e4e565b9050919050565b6000602082019050818103600083015261326481612e71565b9050919050565b6000602082019050818103600083015261328481612e94565b9050919050565b600060208201905081810360008301526132a481612eb7565b9050919050565b600060208201905081810360008301526132c481612eda565b9050919050565b600060208201905081810360008301526132e481612efd565b9050919050565b6000602082019050818103600083015261330481612f20565b9050919050565b6000602082019050818103600083015261332481612f43565b9050919050565b6000602082019050818103600083015261334481612f66565b9050919050565b6000602082019050818103600083015261336481612f89565b9050919050565b6000602082019050818103600083015261338481612fac565b9050919050565b600060208201905081810360008301526133a481612fcf565b9050919050565b600060208201905081810360008301526133c481612ff2565b9050919050565b600060208201905081810360008301526133e481613015565b9050919050565b6000602082019050818103600083015261340481613038565b9050919050565b600060208201905081810360008301526134248161305b565b9050919050565b600060208201905081810360008301526134448161307e565b9050919050565b60006020820190508181036000830152613464816130a1565b9050919050565b60006020820190508181036000830152613484816130c4565b9050919050565b60006020820190506134a060008301846130e7565b92915050565b60006134b06134c1565b90506134bc8282613782565b919050565b6000604051905090565b600067ffffffffffffffff8211156134e6576134e5613918565b5b6134ef8261395b565b9050602081019050919050565b600067ffffffffffffffff82111561351757613516613918565b5b6135208261395b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061359082613704565b915061359b83613704565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135d0576135cf61382d565b5b828201905092915050565b60006135e682613704565b91506135f183613704565b9250826136015761360061385c565b5b828204905092915050565b600061361782613704565b915061362283613704565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561365b5761365a61382d565b5b828202905092915050565b600061367182613704565b915061367c83613704565b92508282101561368f5761368e61382d565b5b828203905092915050565b60006136a5826136e4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561373b578082015181840152602081019050613720565b8381111561374a576000848401525b50505050565b6000600282049050600182168061376857607f821691505b6020821081141561377c5761377b61388b565b5b50919050565b61378b8261395b565b810181811067ffffffffffffffff821117156137aa576137a9613918565b5b80604052505050565b60006137be82613704565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137f1576137f061382d565b5b600182019050919050565b600061380782613704565b915061381283613704565b9250826138225761382161385c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b613f358161369a565b8114613f4057600080fd5b50565b613f4c816136ac565b8114613f5757600080fd5b50565b613f63816136b8565b8114613f6e57600080fd5b50565b613f7a81613704565b8114613f8557600080fd5b5056fea264697066735822122024ae6e1dab55b735bc1131dab1ab3d709b30822e8ce4f06c8e2ead953cef285864736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000065461637475730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454414354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101c25760003560e01c8063715018a6116100f7578063b88d4fde11610095578063eb8d244411610064578063eb8d244414610640578063f2fde38b1461066b578063f3ba147a14610694578063f47c84c5146106b0576101c2565b8063b88d4fde14610572578063c66828621461059b578063c87b56dd146105c6578063e985e9c514610603576101c2565b806395d89b41116100d157806395d89b41146104c8578063977b055b146104f357806398d5fdca1461051e578063a22cb46514610549576101c2565b8063715018a61461045d5780638da5cb5b1461047457806391b7f5ed1461049f576101c2565b806334918dfd116101645780634f6ccce71161013e5780634f6ccce71461037d57806355f804b3146103ba5780636352211e146103e357806370a0823114610420576101c2565b806334918dfd146103265780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632f745c59146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612bd5565b6106db565b6040516101fb919061318e565b60405180910390f35b34801561021057600080fd5b506102196106ed565b60405161022691906131a9565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612c78565b61077f565b6040516102639190613127565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b95565b610804565b005b3480156102a157600080fd5b506102aa61091c565b6040516102b7919061348b565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612a7f565b610929565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612b95565b610989565b60405161031d919061348b565b60405180910390f35b34801561033257600080fd5b5061033b610a2e565b005b34801561034957600080fd5b50610352610ad6565b005b34801561036057600080fd5b5061037b60048036038101906103769190612a7f565b610ba1565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612c78565b610bc1565b6040516103b1919061348b565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190612c2f565b610c32565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190612c78565b610cc8565b6040516104179190613127565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190612a12565b610d7a565b604051610454919061348b565b60405180910390f35b34801561046957600080fd5b50610472610e32565b005b34801561048057600080fd5b50610489610eba565b6040516104969190613127565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190612c78565b610ee4565b005b3480156104d457600080fd5b506104dd610f6a565b6040516104ea91906131a9565b60405180910390f35b3480156104ff57600080fd5b50610508610ffc565b604051610515919061348b565b60405180910390f35b34801561052a57600080fd5b50610533611001565b604051610540919061348b565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b9190612b55565b61100b565b005b34801561057e57600080fd5b5061059960048036038101906105949190612ad2565b611021565b005b3480156105a757600080fd5b506105b0611083565b6040516105bd91906131a9565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190612c78565b611111565b6040516105fa91906131a9565b60405180910390f35b34801561060f57600080fd5b5061062a60048036038101906106259190612a3f565b6111bb565b604051610637919061318e565b60405180910390f35b34801561064c57600080fd5b5061065561124f565b604051610662919061318e565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190612a12565b611262565b005b6106ae60048036038101906106a99190612c78565b61135a565b005b3480156106bc57600080fd5b506106c56114f9565b6040516106d2919061348b565b60405180910390f35b60006106e6826114ff565b9050919050565b6060600080546106fc90613750565b80601f016020809104026020016040519081016040528092919081815260200182805461072890613750565b80156107755780601f1061074a57610100808354040283529160200191610775565b820191906000526020600020905b81548152906001019060200180831161075857829003601f168201915b5050505050905090565b600061078a82611579565b6107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c0906133ab565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080f82610cc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061340b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089f6115e5565b73ffffffffffffffffffffffffffffffffffffffff1614806108ce57506108cd816108c86115e5565b6111bb565b5b61090d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109049061330b565b60405180910390fd5b61091783836115ed565b505050565b6000600880549050905090565b61093a6109346115e5565b826116a6565b610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709061342b565b60405180910390fd5b610984838383611784565b505050565b600061099483610d7a565b82106109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc906131cb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a366115e5565b73ffffffffffffffffffffffffffffffffffffffff16610a54610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906133cb565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610ade6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610afc610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906133cb565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b9d573d6000803e3d6000fd5b5050565b610bbc83838360405180602001604052806000815250611021565b505050565b6000610bcb61091c565b8210610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c039061344b565b60405180910390fd5b60088281548110610c2057610c1f6138e9565b5b90600052602060002001549050919050565b610c3a6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610c58610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906133cb565b60405180910390fd5b80600d9080519060200190610cc4929190612826565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d689061334b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061332b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e3a6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610e58610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906133cb565b60405180910390fd5b610eb860006119eb565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eec6115e5565b73ffffffffffffffffffffffffffffffffffffffff16610f0a610eba565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f57906133cb565b60405180910390fd5b80600c8190555050565b606060018054610f7990613750565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa590613750565b8015610ff25780601f10610fc757610100808354040283529160200191610ff2565b820191906000526020600020905b815481529060010190602001808311610fd557829003601f168201915b5050505050905090565b600381565b6000600c54905090565b61101d6110166115e5565b8383611ab1565b5050565b61103261102c6115e5565b836116a6565b611071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110689061342b565b60405180910390fd5b61107d84848484611c1e565b50505050565b600b805461109090613750565b80601f01602080910402602001604051908101604052809291908181526020018280546110bc90613750565b80156111095780601f106110de57610100808354040283529160200191611109565b820191906000526020600020905b8154815290600101906020018083116110ec57829003601f168201915b505050505081565b606061111c82611579565b61115b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611152906133eb565b60405180910390fd5b6000611165611c7a565b9050600081511161118557604051806020016040528060008152506111b3565b8061118f84611d0c565b600b6040516020016111a3939291906130f6565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b61126a6115e5565b73ffffffffffffffffffffffffffffffffffffffff16611288610eba565b73ffffffffffffffffffffffffffffffffffffffff16146112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d5906133cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113459061320b565b60405180910390fd5b611357816119eb565b50565b600e60009054906101000a900460ff166113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a0906132cb565b60405180910390fd5b60038111156113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e49061346b565b60405180910390fd5b61271061140a826113fc61091c565b611e6d90919063ffffffff16565b111561144b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114429061336b565b60405180910390fd5b3461146182600c54611e8390919063ffffffff16565b11156114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499906132ab565b60405180910390fd5b60005b818110156114f55760006114b761091c565b90506127106114c461091c565b10156114e1576114e0336001836114db9190613585565b611e99565b5b5080806114ed906137b3565b9150506114a5565b5050565b61271081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611572575061157182611eb7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661166083610cc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116b182611579565b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e7906132eb565b60405180910390fd5b60006116fb83610cc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061176a57508373ffffffffffffffffffffffffffffffffffffffff166117528461077f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061177b575061177a81856111bb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117a482610cc8565b73ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f19061322b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061326b565b60405180910390fd5b611875838383611f99565b6118806000826115ed565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118d09190613666565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119279190613585565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e6838383611fa9565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b179061328b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c11919061318e565b60405180910390a3505050565b611c29848484611784565b611c3584848484611fae565b611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b906131eb565b60405180910390fd5b50505050565b6060600d8054611c8990613750565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590613750565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b5050505050905090565b60606000821415611d54576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e68565b600082905060005b60008214611d86578080611d6f906137b3565b915050600a82611d7f91906135db565b9150611d5c565b60008167ffffffffffffffff811115611da257611da1613918565b5b6040519080825280601f01601f191660200182016040528015611dd45781602001600182028036833780820191505090505b5090505b60008514611e6157600182611ded9190613666565b9150600a85611dfc91906137fc565b6030611e089190613585565b60f81b818381518110611e1e57611e1d6138e9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e5a91906135db565b9450611dd8565b8093505050505b919050565b60008183611e7b9190613585565b905092915050565b60008183611e91919061360c565b905092915050565b611eb3828260405180602001604052806000815250612145565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f8257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f925750611f91826121a0565b5b9050919050565b611fa483838361220a565b505050565b505050565b6000611fcf8473ffffffffffffffffffffffffffffffffffffffff1661231e565b15612138578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ff86115e5565b8786866040518563ffffffff1660e01b815260040161201a9493929190613142565b602060405180830381600087803b15801561203457600080fd5b505af192505050801561206557506040513d601f19601f820116820180604052508101906120629190612c02565b60015b6120e8573d8060008114612095576040519150601f19603f3d011682016040523d82523d6000602084013e61209a565b606091505b506000815114156120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906131eb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061213d565b600190505b949350505050565b61214f8383612341565b61215c6000848484611fae565b61219b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612192906131eb565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61221583838361251b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122585761225381612520565b612297565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612296576122958382612569565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122da576122d5816126d6565b612319565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123185761231782826127a7565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a89061338b565b60405180910390fd5b6123ba81611579565b156123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f19061324b565b60405180910390fd5b61240660008383611f99565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124569190613585565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251760008383611fa9565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161257684610d7a565b6125809190613666565b9050600060076000848152602001908152602001600020549050818114612665576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126ea9190613666565b905060006009600084815260200190815260200160002054905060006008838154811061271a576127196138e9565b5b90600052602060002001549050806008838154811061273c5761273b6138e9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061278b5761278a6138ba565b5b6001900381819060005260206000200160009055905550505050565b60006127b283610d7a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461283290613750565b90600052602060002090601f016020900481019282612854576000855561289b565b82601f1061286d57805160ff191683800117855561289b565b8280016001018555821561289b579182015b8281111561289a57825182559160200191906001019061287f565b5b5090506128a891906128ac565b5090565b5b808211156128c55760008160009055506001016128ad565b5090565b60006128dc6128d7846134cb565b6134a6565b9050828152602081018484840111156128f8576128f761394c565b5b61290384828561370e565b509392505050565b600061291e612919846134fc565b6134a6565b90508281526020810184848401111561293a5761293961394c565b5b61294584828561370e565b509392505050565b60008135905061295c81613f2c565b92915050565b60008135905061297181613f43565b92915050565b60008135905061298681613f5a565b92915050565b60008151905061299b81613f5a565b92915050565b600082601f8301126129b6576129b5613947565b5b81356129c68482602086016128c9565b91505092915050565b600082601f8301126129e4576129e3613947565b5b81356129f484826020860161290b565b91505092915050565b600081359050612a0c81613f71565b92915050565b600060208284031215612a2857612a27613956565b5b6000612a368482850161294d565b91505092915050565b60008060408385031215612a5657612a55613956565b5b6000612a648582860161294d565b9250506020612a758582860161294d565b9150509250929050565b600080600060608486031215612a9857612a97613956565b5b6000612aa68682870161294d565b9350506020612ab78682870161294d565b9250506040612ac8868287016129fd565b9150509250925092565b60008060008060808587031215612aec57612aeb613956565b5b6000612afa8782880161294d565b9450506020612b0b8782880161294d565b9350506040612b1c878288016129fd565b925050606085013567ffffffffffffffff811115612b3d57612b3c613951565b5b612b49878288016129a1565b91505092959194509250565b60008060408385031215612b6c57612b6b613956565b5b6000612b7a8582860161294d565b9250506020612b8b85828601612962565b9150509250929050565b60008060408385031215612bac57612bab613956565b5b6000612bba8582860161294d565b9250506020612bcb858286016129fd565b9150509250929050565b600060208284031215612beb57612bea613956565b5b6000612bf984828501612977565b91505092915050565b600060208284031215612c1857612c17613956565b5b6000612c268482850161298c565b91505092915050565b600060208284031215612c4557612c44613956565b5b600082013567ffffffffffffffff811115612c6357612c62613951565b5b612c6f848285016129cf565b91505092915050565b600060208284031215612c8e57612c8d613956565b5b6000612c9c848285016129fd565b91505092915050565b612cae8161369a565b82525050565b612cbd816136ac565b82525050565b6000612cce82613542565b612cd88185613558565b9350612ce881856020860161371d565b612cf18161395b565b840191505092915050565b6000612d078261354d565b612d118185613569565b9350612d2181856020860161371d565b612d2a8161395b565b840191505092915050565b6000612d408261354d565b612d4a818561357a565b9350612d5a81856020860161371d565b80840191505092915050565b60008154612d7381613750565b612d7d818661357a565b94506001821660008114612d985760018114612da957612ddc565b60ff19831686528186019350612ddc565b612db28561352d565b60005b83811015612dd457815481890152600182019150602081019050612db5565b838801955050505b50505092915050565b6000612df2602b83613569565b9150612dfd8261396c565b604082019050919050565b6000612e15603283613569565b9150612e20826139bb565b604082019050919050565b6000612e38602683613569565b9150612e4382613a0a565b604082019050919050565b6000612e5b602583613569565b9150612e6682613a59565b604082019050919050565b6000612e7e601c83613569565b9150612e8982613aa8565b602082019050919050565b6000612ea1602483613569565b9150612eac82613ad1565b604082019050919050565b6000612ec4601983613569565b9150612ecf82613b20565b602082019050919050565b6000612ee7601f83613569565b9150612ef282613b49565b602082019050919050565b6000612f0a601b83613569565b9150612f1582613b72565b602082019050919050565b6000612f2d602c83613569565b9150612f3882613b9b565b604082019050919050565b6000612f50603883613569565b9150612f5b82613bea565b604082019050919050565b6000612f73602a83613569565b9150612f7e82613c39565b604082019050919050565b6000612f96602983613569565b9150612fa182613c88565b604082019050919050565b6000612fb9602083613569565b9150612fc482613cd7565b602082019050919050565b6000612fdc602083613569565b9150612fe782613d00565b602082019050919050565b6000612fff602c83613569565b915061300a82613d29565b604082019050919050565b6000613022602083613569565b915061302d82613d78565b602082019050919050565b6000613045602f83613569565b915061305082613da1565b604082019050919050565b6000613068602183613569565b915061307382613df0565b604082019050919050565b600061308b603183613569565b915061309682613e3f565b604082019050919050565b60006130ae602c83613569565b91506130b982613e8e565b604082019050919050565b60006130d1602183613569565b91506130dc82613edd565b604082019050919050565b6130f081613704565b82525050565b60006131028286612d35565b915061310e8285612d35565b915061311a8284612d66565b9150819050949350505050565b600060208201905061313c6000830184612ca5565b92915050565b60006080820190506131576000830187612ca5565b6131646020830186612ca5565b61317160408301856130e7565b81810360608301526131838184612cc3565b905095945050505050565b60006020820190506131a36000830184612cb4565b92915050565b600060208201905081810360008301526131c38184612cfc565b905092915050565b600060208201905081810360008301526131e481612de5565b9050919050565b6000602082019050818103600083015261320481612e08565b9050919050565b6000602082019050818103600083015261322481612e2b565b9050919050565b6000602082019050818103600083015261324481612e4e565b9050919050565b6000602082019050818103600083015261326481612e71565b9050919050565b6000602082019050818103600083015261328481612e94565b9050919050565b600060208201905081810360008301526132a481612eb7565b9050919050565b600060208201905081810360008301526132c481612eda565b9050919050565b600060208201905081810360008301526132e481612efd565b9050919050565b6000602082019050818103600083015261330481612f20565b9050919050565b6000602082019050818103600083015261332481612f43565b9050919050565b6000602082019050818103600083015261334481612f66565b9050919050565b6000602082019050818103600083015261336481612f89565b9050919050565b6000602082019050818103600083015261338481612fac565b9050919050565b600060208201905081810360008301526133a481612fcf565b9050919050565b600060208201905081810360008301526133c481612ff2565b9050919050565b600060208201905081810360008301526133e481613015565b9050919050565b6000602082019050818103600083015261340481613038565b9050919050565b600060208201905081810360008301526134248161305b565b9050919050565b600060208201905081810360008301526134448161307e565b9050919050565b60006020820190508181036000830152613464816130a1565b9050919050565b60006020820190508181036000830152613484816130c4565b9050919050565b60006020820190506134a060008301846130e7565b92915050565b60006134b06134c1565b90506134bc8282613782565b919050565b6000604051905090565b600067ffffffffffffffff8211156134e6576134e5613918565b5b6134ef8261395b565b9050602081019050919050565b600067ffffffffffffffff82111561351757613516613918565b5b6135208261395b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061359082613704565b915061359b83613704565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135d0576135cf61382d565b5b828201905092915050565b60006135e682613704565b91506135f183613704565b9250826136015761360061385c565b5b828204905092915050565b600061361782613704565b915061362283613704565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561365b5761365a61382d565b5b828202905092915050565b600061367182613704565b915061367c83613704565b92508282101561368f5761368e61382d565b5b828203905092915050565b60006136a5826136e4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561373b578082015181840152602081019050613720565b8381111561374a576000848401525b50505050565b6000600282049050600182168061376857607f821691505b6020821081141561377c5761377b61388b565b5b50919050565b61378b8261395b565b810181811067ffffffffffffffff821117156137aa576137a9613918565b5b80604052505050565b60006137be82613704565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137f1576137f061382d565b5b600182019050919050565b600061380782613704565b915061381283613704565b9250826138225761382161385c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420313020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b613f358161369a565b8114613f4057600080fd5b50565b613f4c816136ac565b8114613f5757600080fd5b50565b613f63816136b8565b8114613f6e57600080fd5b50565b613f7a81613704565b8114613f8557600080fd5b5056fea264697066735822122024ae6e1dab55b735bc1131dab1ab3d709b30822e8ce4f06c8e2ead953cef285864736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000065461637475730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454414354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Tactus
Arg [1] : _symbol (string): TACT
Arg [2] : _initBaseURI (string):

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 5461637475730000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 5441435400000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54571:2751:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55804:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33161:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34720:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34243:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48986:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35470:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48654:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57230:89;;;;;;;;;;;;;:::i;:::-;;56008:143;;;;;;;;;;;;;:::i;:::-;;35880:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49176:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57120:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32855:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32585:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29992:103;;;;;;;;;;;;;:::i;:::-;;29341:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56159:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33330:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54699:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56266:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35013:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36136:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54791:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55169:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35239:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54931:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30250:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56361:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54742:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55804:196;55927:4;55956:36;55980:11;55956:23;:36::i;:::-;55949:43;;55804:196;;;:::o;33161:100::-;33215:13;33248:5;33241:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33161:100;:::o;34720:221::-;34796:7;34824:16;34832:7;34824;:16::i;:::-;34816:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34909:15;:24;34925:7;34909:24;;;;;;;;;;;;;;;;;;;;;34902:31;;34720:221;;;:::o;34243:411::-;34324:13;34340:23;34355:7;34340:14;:23::i;:::-;34324:39;;34388:5;34382:11;;:2;:11;;;;34374:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34482:5;34466:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34491:37;34508:5;34515:12;:10;:12::i;:::-;34491:16;:37::i;:::-;34466:62;34444:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34625:21;34634:2;34638:7;34625:8;:21::i;:::-;34313:341;34243:411;;:::o;48986:113::-;49047:7;49074:10;:17;;;;49067:24;;48986:113;:::o;35470:339::-;35665:41;35684:12;:10;:12::i;:::-;35698:7;35665:18;:41::i;:::-;35657:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35773:28;35783:4;35789:2;35793:7;35773:9;:28::i;:::-;35470:339;;;:::o;48654:256::-;48751:7;48787:23;48804:5;48787:16;:23::i;:::-;48779:5;:31;48771:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48876:12;:19;48889:5;48876:19;;;;;;;;;;;;;;;:26;48896:5;48876:26;;;;;;;;;;;;48869:33;;48654:256;;;;:::o;57230:89::-;29572:12;:10;:12::i;:::-;29561:23;;:7;:5;:7::i;:::-;:23;;;29553:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57299:12:::1;;;;;;;;;;;57298:13;57283:12;;:28;;;;;;;;;;;;;;;;;;57230:89::o:0;56008:143::-;29572:12;:10;:12::i;:::-;29561:23;;:7;:5;:7::i;:::-;:23;;;29553:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56056:15:::1;56074:21;56056:39;;56114:10;56106:28;;:37;56135:7;56106:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56045:106;56008:143::o:0;35880:185::-;36018:39;36035:4;36041:2;36045:7;36018:39;;;;;;;;;;;;:16;:39::i;:::-;35880:185;;;:::o;49176:233::-;49251:7;49287:30;:28;:30::i;:::-;49279:5;:38;49271:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49384:10;49395:5;49384:17;;;;;;;;:::i;:::-;;;;;;;;;;49377:24;;49176:233;;;:::o;57120:102::-;29572:12;:10;:12::i;:::-;29561:23;;:7;:5;:7::i;:::-;:23;;;29553:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57204:10:::1;57194:7;:20;;;;;;;;;;;;:::i;:::-;;57120:102:::0;:::o;32855:239::-;32927:7;32947:13;32963:7;:16;32971:7;32963:16;;;;;;;;;;;;;;;;;;;;;32947:32;;33015:1;32998:19;;:5;:19;;;;32990:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33081:5;33074:12;;;32855:239;;;:::o;32585:208::-;32657:7;32702:1;32685:19;;:5;:19;;;;32677:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32769:9;:16;32779:5;32769:16;;;;;;;;;;;;;;;;32762:23;;32585:208;;;:::o;29992:103::-;29572:12;:10;:12::i;:::-;29561:23;;:7;:5;:7::i;:::-;:23;;;29553:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30057:30:::1;30084:1;30057:18;:30::i;:::-;29992:103::o:0;29341:87::-;29387:7;29414:6;;;;;;;;;;;29407:13;;29341:87;:::o;56159:99::-;29572:12;:10;:12::i;:::-;29561:23;;:7;:5;:7::i;:::-;:23;;;29553:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56241:9:::1;56226:12;:24;;;;56159:99:::0;:::o;33330:104::-;33386:13;33419:7;33412:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33330:104;:::o;54699:36::-;54734:1;54699:36;:::o;56266:87::-;56307:7;56333:12;;56326:19;;56266:87;:::o;35013:155::-;35108:52;35127:12;:10;:12::i;:::-;35141:8;35151;35108:18;:52::i;:::-;35013:155;;:::o;36136:328::-;36311:41;36330:12;:10;:12::i;:::-;36344:7;36311:18;:41::i;:::-;36303:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36417:39;36431:4;36437:2;36441:7;36450:5;36417:13;:39::i;:::-;36136:328;;;;:::o;54791:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55169:423::-;55267:13;55308:16;55316:7;55308;:16::i;:::-;55292:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;55398:28;55429:10;:8;:10::i;:::-;55398:41;;55484:1;55459:14;55453:28;:32;:133;;;;;;;;;;;;;;;;;55521:14;55537:18;:7;:16;:18::i;:::-;55557:13;55504:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55453:133;55446:140;;;55169:423;;;:::o;35239:164::-;35336:4;35360:18;:25;35379:5;35360:25;;;;;;;;;;;;;;;:35;35386:8;35360:35;;;;;;;;;;;;;;;;;;;;;;;;;35353:42;;35239:164;;;;:::o;54931:31::-;;;;;;;;;;;;;:::o;30250:201::-;29572:12;:10;:12::i;:::-;29561:23;;:7;:5;:7::i;:::-;:23;;;29553:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30359:1:::1;30339:22;;:8;:22;;;;30331:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30415:28;30434:8;30415:18;:28::i;:::-;30250:201:::0;:::o;56361:643::-;56436:12;;;;;;;;;;;56428:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;54734:1;56499:14;:29;;56491:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;54779:5;56585:33;56603:14;56585:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;56577:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;56724:9;56688:32;56705:14;56688:12;;:16;;:32;;;;:::i;:::-;:45;;56680:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;56786:6;56782:215;56802:14;56798:1;:18;56782:215;;;56838:14;56855:13;:11;:13::i;:::-;56838:30;;54779:5;56887:13;:11;:13::i;:::-;:26;56883:103;;;56934:36;56944:10;56968:1;56956:9;:13;;;;:::i;:::-;56934:9;:36::i;:::-;56883:103;56823:174;56818:3;;;;;:::i;:::-;;;;56782:215;;;;56361:643;:::o;54742:42::-;54779:5;54742:42;:::o;48346:224::-;48448:4;48487:35;48472:50;;;:11;:50;;;;:90;;;;48526:36;48550:11;48526:23;:36::i;:::-;48472:90;48465:97;;48346:224;;;:::o;37974:127::-;38039:4;38091:1;38063:30;;:7;:16;38071:7;38063:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38056:37;;37974:127;;;:::o;28065:98::-;28118:7;28145:10;28138:17;;28065:98;:::o;42120:174::-;42222:2;42195:15;:24;42211:7;42195:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42278:7;42274:2;42240:46;;42249:23;42264:7;42249:14;:23::i;:::-;42240:46;;;;;;;;;;;;42120:174;;:::o;38268:348::-;38361:4;38386:16;38394:7;38386;:16::i;:::-;38378:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38462:13;38478:23;38493:7;38478:14;:23::i;:::-;38462:39;;38531:5;38520:16;;:7;:16;;;:51;;;;38564:7;38540:31;;:20;38552:7;38540:11;:20::i;:::-;:31;;;38520:51;:87;;;;38575:32;38592:5;38599:7;38575:16;:32::i;:::-;38520:87;38512:96;;;38268:348;;;;:::o;41377:625::-;41536:4;41509:31;;:23;41524:7;41509:14;:23::i;:::-;:31;;;41501:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;41615:1;41601:16;;:2;:16;;;;41593:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41671:39;41692:4;41698:2;41702:7;41671:20;:39::i;:::-;41775:29;41792:1;41796:7;41775:8;:29::i;:::-;41836:1;41817:9;:15;41827:4;41817:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41865:1;41848:9;:13;41858:2;41848:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41896:2;41877:7;:16;41885:7;41877:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41935:7;41931:2;41916:27;;41925:4;41916:27;;;;;;;;;;;;41956:38;41976:4;41982:2;41986:7;41956:19;:38::i;:::-;41377:625;;;:::o;30611:191::-;30685:16;30704:6;;;;;;;;;;;30685:25;;30730:8;30721:6;;:17;;;;;;;;;;;;;;;;;;30785:8;30754:40;;30775:8;30754:40;;;;;;;;;;;;30674:128;30611:191;:::o;42436:315::-;42591:8;42582:17;;:5;:17;;;;42574:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;42678:8;42640:18;:25;42659:5;42640:25;;;;;;;;;;;;;;;:35;42666:8;42640:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;42724:8;42702:41;;42717:5;42702:41;;;42734:8;42702:41;;;;;;:::i;:::-;;;;;;;;42436:315;;;:::o;37346:::-;37503:28;37513:4;37519:2;37523:7;37503:9;:28::i;:::-;37550:48;37573:4;37579:2;37583:7;37592:5;37550:22;:48::i;:::-;37542:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37346:315;;;;:::o;57012:100::-;57064:13;57097:7;57090:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57012:100;:::o;7392:723::-;7448:13;7678:1;7669:5;:10;7665:53;;;7696:10;;;;;;;;;;;;;;;;;;;;;7665:53;7728:12;7743:5;7728:20;;7759:14;7784:78;7799:1;7791:4;:9;7784:78;;7817:8;;;;;:::i;:::-;;;;7848:2;7840:10;;;;;:::i;:::-;;;7784:78;;;7872:19;7904:6;7894:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7872:39;;7922:154;7938:1;7929:5;:10;7922:154;;7966:1;7956:11;;;;;:::i;:::-;;;8033:2;8025:5;:10;;;;:::i;:::-;8012:2;:24;;;;:::i;:::-;7999:39;;7982:6;7989;7982:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8062:2;8053:11;;;;;:::i;:::-;;;7922:154;;;8100:6;8086:21;;;;;7392:723;;;;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;3600:::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;38958:110::-;39034:26;39044:2;39048:7;39034:26;;;;;;;;;;;;:9;:26::i;:::-;38958:110;;:::o;32216:305::-;32318:4;32370:25;32355:40;;;:11;:40;;;;:105;;;;32427:33;32412:48;;;:11;:48;;;;32355:105;:158;;;;32477:36;32501:11;32477:23;:36::i;:::-;32355:158;32335:178;;32216:305;;;:::o;55600:196::-;55743:45;55770:4;55776:2;55780:7;55743:26;:45::i;:::-;55600:196;;;:::o;45198:125::-;;;;:::o;43316:799::-;43471:4;43492:15;:2;:13;;;:15::i;:::-;43488:620;;;43544:2;43528:36;;;43565:12;:10;:12::i;:::-;43579:4;43585:7;43594:5;43528:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43524:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43787:1;43770:6;:13;:18;43766:272;;;43813:60;;;;;;;;;;:::i;:::-;;;;;;;;43766:272;43988:6;43982:13;43973:6;43969:2;43965:15;43958:38;43524:529;43661:41;;;43651:51;;;:6;:51;;;;43644:58;;;;;43488:620;44092:4;44085:11;;43316:799;;;;;;;:::o;39295:321::-;39425:18;39431:2;39435:7;39425:5;:18::i;:::-;39476:54;39507:1;39511:2;39515:7;39524:5;39476:22;:54::i;:::-;39454:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;39295:321;;;:::o;20467:157::-;20552:4;20591:25;20576:40;;;:11;:40;;;;20569:47;;20467:157;;;:::o;50022:589::-;50166:45;50193:4;50199:2;50203:7;50166:26;:45::i;:::-;50244:1;50228:18;;:4;:18;;;50224:187;;;50263:40;50295:7;50263:31;:40::i;:::-;50224:187;;;50333:2;50325:10;;:4;:10;;;50321:90;;50352:47;50385:4;50391:7;50352:32;:47::i;:::-;50321:90;50224:187;50439:1;50425:16;;:2;:16;;;50421:183;;;50458:45;50495:7;50458:36;:45::i;:::-;50421:183;;;50531:4;50525:10;;:2;:10;;;50521:83;;50552:40;50580:2;50584:7;50552:27;:40::i;:::-;50521:83;50421:183;50022:589;;;:::o;10384:326::-;10444:4;10701:1;10679:7;:19;;;:23;10672:30;;10384:326;;;:::o;39952:439::-;40046:1;40032:16;;:2;:16;;;;40024:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40105:16;40113:7;40105;:16::i;:::-;40104:17;40096:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40167:45;40196:1;40200:2;40204:7;40167:20;:45::i;:::-;40242:1;40225:9;:13;40235:2;40225:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40273:2;40254:7;:16;40262:7;40254:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40318:7;40314:2;40293:33;;40310:1;40293:33;;;;;;;;;;;;40339:44;40367:1;40371:2;40375:7;40339:19;:44::i;:::-;39952:439;;:::o;44687:126::-;;;;:::o;51334:164::-;51438:10;:17;;;;51411:15;:24;51427:7;51411:24;;;;;;;;;;;:44;;;;51466:10;51482:7;51466:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51334:164;:::o;52125:988::-;52391:22;52441:1;52416:22;52433:4;52416:16;:22::i;:::-;:26;;;;:::i;:::-;52391:51;;52453:18;52474:17;:26;52492:7;52474:26;;;;;;;;;;;;52453:47;;52621:14;52607:10;:28;52603:328;;52652:19;52674:12;:18;52687:4;52674:18;;;;;;;;;;;;;;;:34;52693:14;52674:34;;;;;;;;;;;;52652:56;;52758:11;52725:12;:18;52738:4;52725:18;;;;;;;;;;;;;;;:30;52744:10;52725:30;;;;;;;;;;;:44;;;;52875:10;52842:17;:30;52860:11;52842:30;;;;;;;;;;;:43;;;;52637:294;52603:328;53027:17;:26;53045:7;53027:26;;;;;;;;;;;53020:33;;;53071:12;:18;53084:4;53071:18;;;;;;;;;;;;;;;:34;53090:14;53071:34;;;;;;;;;;;53064:41;;;52206:907;;52125:988;;:::o;53408:1079::-;53661:22;53706:1;53686:10;:17;;;;:21;;;;:::i;:::-;53661:46;;53718:18;53739:15;:24;53755:7;53739:24;;;;;;;;;;;;53718:45;;54090:19;54112:10;54123:14;54112:26;;;;;;;;:::i;:::-;;;;;;;;;;54090:48;;54176:11;54151:10;54162;54151:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54287:10;54256:15;:28;54272:11;54256:28;;;;;;;;;;;:41;;;;54428:15;:24;54444:7;54428:24;;;;;;;;;;;54421:31;;;54463:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53479:1008;;;53408:1079;:::o;50912:221::-;50997:14;51014:20;51031:2;51014:16;:20::i;:::-;50997:37;;51072:7;51045:12;:16;51058:2;51045:16;;;;;;;;;;;;;;;:24;51062:6;51045:24;;;;;;;;;;;:34;;;;51119:6;51090:17;:26;51108:7;51090:26;;;;;;;;;;;:35;;;;50986:147;50912: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::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:::-;11021:3;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11118:93;11207:3;11118:93;:::i;:::-;11236:2;11231:3;11227:12;11220:19;;10879:366;;;:::o;11251:::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11251:366;;;:::o;11623:::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11623:366;;;:::o;11995:::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;11995:366;;;:::o;12367:::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12367:366;;;:::o;12739:::-;12881:3;12902:67;12966:2;12961:3;12902:67;:::i;:::-;12895:74;;12978:93;13067:3;12978:93;:::i;:::-;13096:2;13091:3;13087:12;13080:19;;12739:366;;;:::o;13111:::-;13253:3;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13350:93;13439:3;13350:93;:::i;:::-;13468:2;13463:3;13459:12;13452:19;;13111:366;;;:::o;13483:::-;13625:3;13646:67;13710:2;13705:3;13646:67;:::i;:::-;13639:74;;13722:93;13811:3;13722:93;:::i;:::-;13840:2;13835:3;13831:12;13824:19;;13483:366;;;:::o;13855:::-;13997:3;14018:67;14082:2;14077:3;14018:67;:::i;:::-;14011:74;;14094:93;14183:3;14094:93;:::i;:::-;14212:2;14207:3;14203:12;14196:19;;13855:366;;;:::o;14227:::-;14369:3;14390:67;14454:2;14449:3;14390:67;:::i;:::-;14383:74;;14466:93;14555:3;14466:93;:::i;:::-;14584:2;14579:3;14575:12;14568:19;;14227:366;;;:::o;14599:::-;14741:3;14762:67;14826:2;14821:3;14762:67;:::i;:::-;14755:74;;14838:93;14927:3;14838:93;:::i;:::-;14956:2;14951:3;14947:12;14940:19;;14599:366;;;:::o;14971:::-;15113:3;15134:67;15198:2;15193:3;15134:67;:::i;:::-;15127:74;;15210:93;15299:3;15210:93;:::i;:::-;15328:2;15323:3;15319:12;15312:19;;14971:366;;;:::o;15343:::-;15485:3;15506:67;15570:2;15565:3;15506:67;:::i;:::-;15499:74;;15582:93;15671:3;15582:93;:::i;:::-;15700:2;15695:3;15691:12;15684:19;;15343:366;;;:::o;15715:::-;15857:3;15878:67;15942:2;15937:3;15878:67;:::i;:::-;15871:74;;15954:93;16043:3;15954:93;:::i;:::-;16072:2;16067:3;16063:12;16056:19;;15715:366;;;:::o;16087:::-;16229:3;16250:67;16314:2;16309:3;16250:67;:::i;:::-;16243:74;;16326:93;16415:3;16326:93;:::i;:::-;16444:2;16439:3;16435:12;16428:19;;16087:366;;;:::o;16459:::-;16601:3;16622:67;16686:2;16681:3;16622:67;:::i;:::-;16615:74;;16698:93;16787:3;16698:93;:::i;:::-;16816:2;16811:3;16807:12;16800:19;;16459:366;;;:::o;16831:::-;16973:3;16994:67;17058:2;17053:3;16994:67;:::i;:::-;16987:74;;17070:93;17159:3;17070:93;:::i;:::-;17188:2;17183:3;17179:12;17172:19;;16831:366;;;:::o;17203:::-;17345:3;17366:67;17430:2;17425:3;17366:67;:::i;:::-;17359:74;;17442:93;17531:3;17442:93;:::i;:::-;17560:2;17555:3;17551:12;17544:19;;17203:366;;;:::o;17575:118::-;17662:24;17680:5;17662:24;:::i;:::-;17657:3;17650:37;17575:118;;:::o;17699:589::-;17924:3;17946:95;18037:3;18028:6;17946:95;:::i;:::-;17939:102;;18058:95;18149:3;18140:6;18058:95;:::i;:::-;18051:102;;18170:92;18258:3;18249:6;18170:92;:::i;:::-;18163:99;;18279:3;18272:10;;17699:589;;;;;;:::o;18294:222::-;18387:4;18425:2;18414:9;18410:18;18402:26;;18438:71;18506:1;18495:9;18491:17;18482:6;18438:71;:::i;:::-;18294:222;;;;:::o;18522:640::-;18717:4;18755:3;18744:9;18740:19;18732:27;;18769:71;18837:1;18826:9;18822:17;18813:6;18769:71;:::i;:::-;18850:72;18918:2;18907:9;18903:18;18894:6;18850:72;:::i;:::-;18932;19000:2;18989:9;18985:18;18976:6;18932:72;:::i;:::-;19051:9;19045:4;19041:20;19036:2;19025:9;19021:18;19014:48;19079:76;19150:4;19141:6;19079:76;:::i;:::-;19071:84;;18522:640;;;;;;;:::o;19168:210::-;19255:4;19293:2;19282:9;19278:18;19270:26;;19306:65;19368:1;19357:9;19353:17;19344:6;19306:65;:::i;:::-;19168:210;;;;:::o;19384:313::-;19497:4;19535:2;19524:9;19520:18;19512:26;;19584:9;19578:4;19574:20;19570:1;19559:9;19555:17;19548:47;19612:78;19685:4;19676:6;19612:78;:::i;:::-;19604:86;;19384:313;;;;:::o;19703:419::-;19869:4;19907:2;19896:9;19892:18;19884:26;;19956:9;19950:4;19946:20;19942:1;19931:9;19927:17;19920:47;19984:131;20110:4;19984:131;:::i;:::-;19976:139;;19703:419;;;:::o;20128:::-;20294:4;20332:2;20321:9;20317:18;20309:26;;20381:9;20375:4;20371:20;20367:1;20356:9;20352:17;20345:47;20409:131;20535:4;20409:131;:::i;:::-;20401:139;;20128:419;;;:::o;20553:::-;20719:4;20757:2;20746:9;20742:18;20734:26;;20806:9;20800:4;20796:20;20792:1;20781:9;20777:17;20770:47;20834:131;20960:4;20834:131;:::i;:::-;20826:139;;20553:419;;;:::o;20978:::-;21144:4;21182:2;21171:9;21167:18;21159:26;;21231:9;21225:4;21221:20;21217:1;21206:9;21202:17;21195:47;21259:131;21385:4;21259:131;:::i;:::-;21251:139;;20978:419;;;:::o;21403:::-;21569:4;21607:2;21596:9;21592:18;21584:26;;21656:9;21650:4;21646:20;21642:1;21631:9;21627:17;21620:47;21684:131;21810:4;21684:131;:::i;:::-;21676:139;;21403:419;;;:::o;21828:::-;21994:4;22032:2;22021:9;22017:18;22009:26;;22081:9;22075:4;22071:20;22067:1;22056:9;22052:17;22045:47;22109:131;22235:4;22109:131;:::i;:::-;22101:139;;21828:419;;;:::o;22253:::-;22419:4;22457:2;22446:9;22442:18;22434:26;;22506:9;22500:4;22496:20;22492:1;22481:9;22477:17;22470:47;22534:131;22660:4;22534:131;:::i;:::-;22526:139;;22253:419;;;:::o;22678:::-;22844:4;22882:2;22871:9;22867:18;22859:26;;22931:9;22925:4;22921:20;22917:1;22906:9;22902:17;22895:47;22959:131;23085:4;22959:131;:::i;:::-;22951:139;;22678:419;;;:::o;23103:::-;23269:4;23307:2;23296:9;23292:18;23284:26;;23356:9;23350:4;23346:20;23342:1;23331:9;23327:17;23320:47;23384:131;23510:4;23384:131;:::i;:::-;23376:139;;23103:419;;;:::o;23528:::-;23694:4;23732:2;23721:9;23717:18;23709:26;;23781:9;23775:4;23771:20;23767:1;23756:9;23752:17;23745:47;23809:131;23935:4;23809:131;:::i;:::-;23801:139;;23528:419;;;:::o;23953:::-;24119:4;24157:2;24146:9;24142:18;24134:26;;24206:9;24200:4;24196:20;24192:1;24181:9;24177:17;24170:47;24234:131;24360:4;24234:131;:::i;:::-;24226:139;;23953:419;;;:::o;24378:::-;24544:4;24582:2;24571:9;24567:18;24559:26;;24631:9;24625:4;24621:20;24617:1;24606:9;24602:17;24595:47;24659:131;24785:4;24659:131;:::i;:::-;24651:139;;24378:419;;;:::o;24803:::-;24969:4;25007:2;24996:9;24992:18;24984:26;;25056:9;25050:4;25046:20;25042:1;25031:9;25027:17;25020:47;25084:131;25210:4;25084:131;:::i;:::-;25076:139;;24803:419;;;:::o;25228:::-;25394:4;25432:2;25421:9;25417:18;25409:26;;25481:9;25475:4;25471:20;25467:1;25456:9;25452:17;25445:47;25509:131;25635:4;25509:131;:::i;:::-;25501:139;;25228:419;;;:::o;25653:::-;25819:4;25857:2;25846:9;25842:18;25834:26;;25906:9;25900:4;25896:20;25892:1;25881:9;25877:17;25870:47;25934:131;26060:4;25934:131;:::i;:::-;25926:139;;25653:419;;;:::o;26078:::-;26244:4;26282:2;26271:9;26267:18;26259:26;;26331:9;26325:4;26321:20;26317:1;26306:9;26302:17;26295:47;26359:131;26485:4;26359:131;:::i;:::-;26351:139;;26078:419;;;:::o;26503:::-;26669:4;26707:2;26696:9;26692:18;26684:26;;26756:9;26750:4;26746:20;26742:1;26731:9;26727:17;26720:47;26784:131;26910:4;26784:131;:::i;:::-;26776:139;;26503:419;;;:::o;26928:::-;27094:4;27132:2;27121:9;27117:18;27109:26;;27181:9;27175:4;27171:20;27167:1;27156:9;27152:17;27145:47;27209:131;27335:4;27209:131;:::i;:::-;27201:139;;26928:419;;;:::o;27353:::-;27519:4;27557:2;27546:9;27542:18;27534:26;;27606:9;27600:4;27596:20;27592:1;27581:9;27577:17;27570:47;27634:131;27760:4;27634:131;:::i;:::-;27626:139;;27353:419;;;:::o;27778:::-;27944:4;27982:2;27971:9;27967:18;27959:26;;28031:9;28025:4;28021:20;28017:1;28006:9;28002:17;27995:47;28059:131;28185:4;28059:131;:::i;:::-;28051:139;;27778:419;;;:::o;28203:::-;28369:4;28407:2;28396:9;28392:18;28384:26;;28456:9;28450:4;28446:20;28442:1;28431:9;28427:17;28420:47;28484:131;28610:4;28484:131;:::i;:::-;28476:139;;28203:419;;;:::o;28628:::-;28794:4;28832:2;28821:9;28817:18;28809:26;;28881:9;28875:4;28871:20;28867:1;28856:9;28852:17;28845:47;28909:131;29035:4;28909:131;:::i;:::-;28901:139;;28628:419;;;:::o;29053:222::-;29146:4;29184:2;29173:9;29169:18;29161:26;;29197:71;29265:1;29254:9;29250:17;29241:6;29197:71;:::i;:::-;29053:222;;;;:::o;29281:129::-;29315:6;29342:20;;:::i;:::-;29332:30;;29371:33;29399:4;29391:6;29371:33;:::i;:::-;29281:129;;;:::o;29416:75::-;29449:6;29482:2;29476:9;29466:19;;29416:75;:::o;29497:307::-;29558:4;29648:18;29640:6;29637:30;29634:56;;;29670:18;;:::i;:::-;29634:56;29708:29;29730:6;29708:29;:::i;:::-;29700:37;;29792:4;29786;29782:15;29774:23;;29497:307;;;:::o;29810:308::-;29872:4;29962:18;29954:6;29951:30;29948:56;;;29984:18;;:::i;:::-;29948:56;30022:29;30044:6;30022:29;:::i;:::-;30014:37;;30106:4;30100;30096:15;30088:23;;29810:308;;;:::o;30124:141::-;30173:4;30196:3;30188:11;;30219:3;30216:1;30209:14;30253:4;30250:1;30240:18;30232:26;;30124:141;;;:::o;30271:98::-;30322:6;30356:5;30350:12;30340:22;;30271:98;;;:::o;30375:99::-;30427:6;30461:5;30455:12;30445:22;;30375:99;;;:::o;30480:168::-;30563:11;30597:6;30592:3;30585:19;30637:4;30632:3;30628:14;30613:29;;30480:168;;;;:::o;30654:169::-;30738:11;30772:6;30767:3;30760:19;30812:4;30807:3;30803:14;30788:29;;30654:169;;;;:::o;30829:148::-;30931:11;30968:3;30953:18;;30829:148;;;;:::o;30983:305::-;31023:3;31042:20;31060:1;31042:20;:::i;:::-;31037:25;;31076:20;31094:1;31076:20;:::i;:::-;31071:25;;31230:1;31162:66;31158:74;31155:1;31152:81;31149:107;;;31236:18;;:::i;:::-;31149:107;31280:1;31277;31273:9;31266:16;;30983:305;;;;:::o;31294:185::-;31334:1;31351:20;31369:1;31351:20;:::i;:::-;31346:25;;31385:20;31403:1;31385:20;:::i;:::-;31380:25;;31424:1;31414:35;;31429:18;;:::i;:::-;31414:35;31471:1;31468;31464:9;31459:14;;31294:185;;;;:::o;31485:348::-;31525:7;31548:20;31566:1;31548:20;:::i;:::-;31543:25;;31582:20;31600:1;31582:20;:::i;:::-;31577:25;;31770:1;31702:66;31698:74;31695:1;31692:81;31687:1;31680:9;31673:17;31669:105;31666:131;;;31777:18;;:::i;:::-;31666:131;31825:1;31822;31818:9;31807:20;;31485:348;;;;:::o;31839:191::-;31879:4;31899:20;31917:1;31899:20;:::i;:::-;31894:25;;31933:20;31951:1;31933:20;:::i;:::-;31928:25;;31972:1;31969;31966:8;31963:34;;;31977:18;;:::i;:::-;31963:34;32022:1;32019;32015:9;32007:17;;31839:191;;;;:::o;32036:96::-;32073:7;32102:24;32120:5;32102:24;:::i;:::-;32091:35;;32036:96;;;:::o;32138:90::-;32172:7;32215:5;32208:13;32201:21;32190:32;;32138:90;;;:::o;32234:149::-;32270:7;32310:66;32303:5;32299:78;32288:89;;32234:149;;;:::o;32389:126::-;32426:7;32466:42;32459:5;32455:54;32444:65;;32389:126;;;:::o;32521:77::-;32558:7;32587:5;32576:16;;32521:77;;;:::o;32604:154::-;32688:6;32683:3;32678;32665:30;32750:1;32741:6;32736:3;32732:16;32725:27;32604:154;;;:::o;32764:307::-;32832:1;32842:113;32856:6;32853:1;32850:13;32842:113;;;32941:1;32936:3;32932:11;32926:18;32922:1;32917:3;32913:11;32906:39;32878:2;32875:1;32871:10;32866:15;;32842:113;;;32973:6;32970:1;32967:13;32964:101;;;33053:1;33044:6;33039:3;33035:16;33028:27;32964:101;32813:258;32764:307;;;:::o;33077:320::-;33121:6;33158:1;33152:4;33148:12;33138:22;;33205:1;33199:4;33195:12;33226:18;33216:81;;33282:4;33274:6;33270:17;33260:27;;33216:81;33344:2;33336:6;33333:14;33313:18;33310:38;33307:84;;;33363:18;;:::i;:::-;33307:84;33128:269;33077:320;;;:::o;33403:281::-;33486:27;33508:4;33486:27;:::i;:::-;33478:6;33474:40;33616:6;33604:10;33601:22;33580:18;33568:10;33565:34;33562:62;33559:88;;;33627:18;;:::i;:::-;33559:88;33667:10;33663:2;33656:22;33446:238;33403:281;;:::o;33690:233::-;33729:3;33752:24;33770:5;33752:24;:::i;:::-;33743:33;;33798:66;33791:5;33788:77;33785:103;;;33868:18;;:::i;:::-;33785:103;33915:1;33908:5;33904:13;33897:20;;33690:233;;;:::o;33929:176::-;33961:1;33978:20;33996:1;33978:20;:::i;:::-;33973:25;;34012:20;34030:1;34012:20;:::i;:::-;34007:25;;34051:1;34041:35;;34056:18;;:::i;:::-;34041:35;34097:1;34094;34090:9;34085:14;;33929:176;;;;:::o;34111:180::-;34159:77;34156:1;34149:88;34256:4;34253:1;34246:15;34280:4;34277:1;34270:15;34297:180;34345:77;34342:1;34335:88;34442:4;34439:1;34432:15;34466:4;34463:1;34456:15;34483:180;34531:77;34528:1;34521:88;34628:4;34625:1;34618:15;34652:4;34649:1;34642:15;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:117;35336:1;35333;35326:12;35350:117;35459:1;35456;35449:12;35473:117;35582:1;35579;35572:12;35596:117;35705:1;35702;35695:12;35719:102;35760:6;35811:2;35807:7;35802:2;35795:5;35791:14;35787:28;35777:38;;35719:102;;;:::o;35827:230::-;35967:34;35963:1;35955:6;35951:14;35944:58;36036:13;36031:2;36023:6;36019:15;36012:38;35827:230;:::o;36063:237::-;36203:34;36199:1;36191:6;36187:14;36180:58;36272:20;36267:2;36259:6;36255:15;36248:45;36063:237;:::o;36306:225::-;36446:34;36442:1;36434:6;36430:14;36423:58;36515:8;36510:2;36502:6;36498:15;36491:33;36306:225;:::o;36537:224::-;36677:34;36673:1;36665:6;36661:14;36654:58;36746:7;36741:2;36733:6;36729:15;36722:32;36537:224;:::o;36767:178::-;36907:30;36903:1;36895:6;36891:14;36884:54;36767:178;:::o;36951:223::-;37091:34;37087:1;37079:6;37075:14;37068:58;37160:6;37155:2;37147:6;37143:15;37136:31;36951:223;:::o;37180:175::-;37320:27;37316:1;37308:6;37304:14;37297:51;37180:175;:::o;37361:181::-;37501:33;37497:1;37489:6;37485:14;37478:57;37361:181;:::o;37548:177::-;37688:29;37684:1;37676:6;37672:14;37665:53;37548:177;:::o;37731:231::-;37871:34;37867:1;37859:6;37855:14;37848:58;37940:14;37935:2;37927:6;37923:15;37916:39;37731:231;:::o;37968:243::-;38108:34;38104:1;38096:6;38092:14;38085:58;38177:26;38172:2;38164:6;38160:15;38153:51;37968:243;:::o;38217:229::-;38357:34;38353:1;38345:6;38341:14;38334:58;38426:12;38421:2;38413:6;38409:15;38402:37;38217:229;:::o;38452:228::-;38592:34;38588:1;38580:6;38576:14;38569:58;38661:11;38656:2;38648:6;38644:15;38637:36;38452:228;:::o;38686:182::-;38826:34;38822:1;38814:6;38810:14;38803:58;38686:182;:::o;38874:::-;39014:34;39010:1;39002:6;38998:14;38991:58;38874:182;:::o;39062:231::-;39202:34;39198:1;39190:6;39186:14;39179:58;39271:14;39266:2;39258:6;39254:15;39247:39;39062:231;:::o;39299:182::-;39439:34;39435:1;39427:6;39423:14;39416:58;39299:182;:::o;39487:234::-;39627:34;39623:1;39615:6;39611:14;39604:58;39696:17;39691:2;39683:6;39679:15;39672:42;39487:234;:::o;39727:220::-;39867:34;39863:1;39855:6;39851:14;39844:58;39936:3;39931:2;39923:6;39919:15;39912:28;39727:220;:::o;39953:236::-;40093:34;40089:1;40081:6;40077:14;40070:58;40162:19;40157:2;40149:6;40145:15;40138:44;39953:236;:::o;40195:231::-;40335:34;40331:1;40323:6;40319:14;40312:58;40404:14;40399:2;40391:6;40387:15;40380:39;40195:231;:::o;40432:220::-;40572:34;40568:1;40560:6;40556:14;40549:58;40641:3;40636:2;40628:6;40624:15;40617:28;40432:220;:::o;40658:122::-;40731:24;40749:5;40731:24;:::i;:::-;40724:5;40721:35;40711:63;;40770:1;40767;40760:12;40711:63;40658:122;:::o;40786:116::-;40856:21;40871:5;40856:21;:::i;:::-;40849:5;40846:32;40836:60;;40892:1;40889;40882:12;40836:60;40786:116;:::o;40908:120::-;40980:23;40997:5;40980:23;:::i;:::-;40973:5;40970:34;40960:62;;41018:1;41015;41008:12;40960:62;40908:120;:::o;41034:122::-;41107:24;41125:5;41107:24;:::i;:::-;41100:5;41097:35;41087:63;;41146:1;41143;41136:12;41087:63;41034:122;:::o

Swarm Source

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