ETH Price: $3,375.85 (-1.98%)
Gas: 2 Gwei

Token

Cake eXperiment (CAKX)
 

Overview

Max Total Supply

5,575 CAKX

Holders

1,929

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
tlieberman22.eth
Balance
3 CAKX
0x729cfa0f61946c8a558da84103f332d310a9d26a
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:
Cake

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 subtraction 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/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.6.0) (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`.
     *
     * 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;

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.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 overridden 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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/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/Cake.sol


pragma solidity ^0.8.7;




contract Cake is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;

    string public baseURI;

    // Sale dates ===============================
    uint256 public publicSaleStartTimestamp = 1656514800; // June 29th 2022, 3:00 pm GMT

    // Count values =============================
    uint256 public MAX_ITEMS = 5000;
    uint256 public RESERVED = 555;
    uint256 public _mintedItems = 0;
    uint256 public _mintedReserved = 0;
    uint256 public maxMintAmount = 3; // Max items per tx

    bool public paused = false;
    string public notRevealedUri;
    bool public revealed = false;

    // Lists ====================================
    mapping(address => uint256) public buyerWallet;

    // Events ===================================
    event PublicSaleMint(address indexed _from, uint256 indexed _tokenId);

    constructor() ERC721("Cake eXperiment", "CAKX") {}

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


    // Public sale Minting =================================
    function publicSaleMint(uint256 _mintAmount) public payable {
        require(!paused, "Contract is paused");
        require(msg.sender != owner(), "Hey greedy owner, mint your own fucking reserved tokens");
        require(
            block.timestamp >= publicSaleStartTimestamp,
            "Public sale time is not active yet"
        );
                require(
            _mintAmount <= maxMintAmount,
            "Maximum only 3 mints allow per transaction"
        );
        require(buyerWallet[msg.sender].add(_mintAmount) <= maxMintAmount, "Max 3 items per wallet, Don't be greedy");
        require(
            _mintedItems.add(_mintAmount) <= MAX_ITEMS+RESERVED,
            "Purchase would exceed max supply"
        );

            for (uint256 i = 0; i < _mintAmount; i++) {
                uint256 mintIndex = _mintedItems + 1;
                require(_mintedItems < MAX_ITEMS+RESERVED, "All items sold!");
                _safeMint(msg.sender, mintIndex);
                emit PublicSaleMint(msg.sender, mintIndex);
                _mintedItems++;
            }
            updateBuyerWallet(msg.sender, buyerWallet[msg.sender] + _mintAmount);
    }

    // Admin Minting (Mint by owner) =========================
    function ownerMint(uint256 _mintAmount) public payable onlyOwner {
        require(
            _mintedReserved.add(_mintAmount) <= RESERVED,
            "Purchase would exceed max Reserved supply, don't be a greedy owner"
        );

        for (uint256 i = 0; i < _mintAmount; i++) {
            uint256 mintIndex = _mintedItems + 1;
            require(_mintedReserved < RESERVED, "All reserved items sold!");
            _safeMint(msg.sender, mintIndex);
            _mintedItems++;
            _mintedReserved++;
        }
    }

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

        if (revealed == false) {
            return notRevealedUri;
        }

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

    // Reveal Metadata of Tokens =======================
    function reveal(bool _state) public onlyOwner {
        revealed = _state;
    }

    // Set Placeholder metadata URI =======================
    function setNotRevealedURI(string memory _notRevealedURI) public {
        notRevealedUri = _notRevealedURI;
    }

    // Set public timestamp (input: timestamp in UTC) =======================
    function setPublicSaleStartTimestamp(uint256 _startTimestamp)
        external
        onlyOwner
    {
        publicSaleStartTimestamp = _startTimestamp;
    }

    // Set base URI of metadata (an IPFS URL) =======================
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    // Pause the contract which will stop minting process =======================
    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    // Add a presale user =======================
    function updateBuyerWallet(address _user, uint256 _amount) internal {
        buyerWallet[_user] = _amount;
    }

    // Get number of tokens minted by a particular address =======================
    function getMintedCountOfUserWallet(address _user)
        public
        view
        virtual
        returns (uint256)
    {
        return buyerWallet[_user];
    }

    // Withdraw the balance from samrt contract =======================
    function withdraw() external onlyOwner {
        (bool success, ) = owner().call{value: address(this).balance}("");
        require(success, "Failed to withdraw");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"PublicSaleMint","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_ITEMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintedItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintedReserved","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getMintedCountOfUserWallet","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":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"setPublicSaleStartTimestamp","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"}]

60806040526362bc68f0600c55611388600d5561022b600e556000600f55600060105560036011556000601260006101000a81548160ff0219169083151502179055506000601460006101000a81548160ff0219169083151502179055503480156200006a57600080fd5b506040518060400160405280600f81526020017f43616b65206558706572696d656e7400000000000000000000000000000000008152506040518060400160405280600481526020017f43414b58000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ef929190620001ff565b50806001908051906020019062000108929190620001ff565b5050506200012b6200011f6200013160201b60201c565b6200013960201b60201c565b62000314565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020d90620002af565b90600052602060002090601f0160209004810192826200023157600085556200027d565b82601f106200024c57805160ff19168380011785556200027d565b828001600101855582156200027d579182015b828111156200027c5782518255916020019190600101906200025f565b5b5090506200028c919062000290565b5090565b5b80821115620002ab57600081600090555060010162000291565b5090565b60006002820490506001821680620002c857607f821691505b60208210811415620002df57620002de620002e5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614b6580620003246000396000f3fe6080604052600436106102305760003560e01c80635c975abb1161012e578063aa592f25116100ab578063e8fee1051161006f578063e8fee10514610846578063e985e9c51461086f578063f19e75d4146108ac578063f2c4ce1e146108c8578063f2fde38b146108f157610230565b8063aa592f251461076e578063b3ab66b014610799578063b88d4fde146107b5578063c87b56dd146107de578063d7822c991461081b57610230565b8063715018a6116100f2578063715018a6146106af5780638da5cb5b146106c6578063940cd05b146106f157806395d89b411461071a578063a22cb4651461074557610230565b80635c975abb146105b45780636352211e146105df5780636c0360eb1461061c5780636e88f3351461064757806370a082311461067257610230565b80632f745c59116101bc57806342842e0e1161018057806342842e0e146104cf5780634f6ccce7146104f8578063518302271461053557806355f804b31461056057806357d4c4ee1461058957610230565b80632f745c59146103d65780633ccfd60b146104135780633d6147441461042a5780633dff96011461046757806341940baa1461049257610230565b8063081c8c4411610203578063081c8c4414610303578063095ea7b31461032e57806318160ddd14610357578063239c70ae1461038257806323b872dd146103ad57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613494565b61091a565b6040516102699190613af9565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613467565b610994565b005b3480156102a757600080fd5b506102b0610a2d565b6040516102bd9190613b14565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613537565b610abf565b6040516102fa9190613a92565b60405180910390f35b34801561030f57600080fd5b50610318610b44565b6040516103259190613b14565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613427565b610bd2565b005b34801561036357600080fd5b5061036c610cea565b6040516103799190613eb6565b60405180910390f35b34801561038e57600080fd5b50610397610cf7565b6040516103a49190613eb6565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613311565b610cfd565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613427565b610d5d565b60405161040a9190613eb6565b60405180910390f35b34801561041f57600080fd5b50610428610e02565b005b34801561043657600080fd5b50610451600480360381019061044c91906132a4565b610f34565b60405161045e9190613eb6565b60405180910390f35b34801561047357600080fd5b5061047c610f7d565b6040516104899190613eb6565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906132a4565b610f83565b6040516104c69190613eb6565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613311565b610f9b565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613537565b610fbb565b60405161052c9190613eb6565b60405180910390f35b34801561054157600080fd5b5061054a61102c565b6040516105579190613af9565b60405180910390f35b34801561056c57600080fd5b50610587600480360381019061058291906134ee565b61103f565b005b34801561059557600080fd5b5061059e6110d5565b6040516105ab9190613eb6565b60405180910390f35b3480156105c057600080fd5b506105c96110db565b6040516105d69190613af9565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190613537565b6110ee565b6040516106139190613a92565b60405180910390f35b34801561062857600080fd5b506106316111a0565b60405161063e9190613b14565b60405180910390f35b34801561065357600080fd5b5061065c61122e565b6040516106699190613eb6565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906132a4565b611234565b6040516106a69190613eb6565b60405180910390f35b3480156106bb57600080fd5b506106c46112ec565b005b3480156106d257600080fd5b506106db611374565b6040516106e89190613a92565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613467565b61139e565b005b34801561072657600080fd5b5061072f611437565b60405161073c9190613b14565b60405180910390f35b34801561075157600080fd5b5061076c600480360381019061076791906133e7565b6114c9565b005b34801561077a57600080fd5b506107836114df565b6040516107909190613eb6565b60405180910390f35b6107b360048036038101906107ae9190613537565b6114e5565b005b3480156107c157600080fd5b506107dc60048036038101906107d79190613364565b611874565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613537565b6118d6565b6040516108129190613b14565b60405180910390f35b34801561082757600080fd5b50610830611a2c565b60405161083d9190613eb6565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613537565b611a32565b005b34801561087b57600080fd5b50610896600480360381019061089191906132d1565b611ab8565b6040516108a39190613af9565b60405180910390f35b6108c660048036038101906108c19190613537565b611b4c565b005b3480156108d457600080fd5b506108ef60048036038101906108ea91906134ee565b611cd7565b005b3480156108fd57600080fd5b50610918600480360381019061091391906132a4565b611cf1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098d575061098c82611de9565b5b9050919050565b61099c611ecb565b73ffffffffffffffffffffffffffffffffffffffff166109ba611374565b73ffffffffffffffffffffffffffffffffffffffff1614610a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0790613db6565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060008054610a3c90614117565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6890614117565b8015610ab55780601f10610a8a57610100808354040283529160200191610ab5565b820191906000526020600020905b815481529060010190602001808311610a9857829003601f168201915b5050505050905090565b6000610aca82611ed3565b610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090613d96565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60138054610b5190614117565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7d90614117565b8015610bca5780601f10610b9f57610100808354040283529160200191610bca565b820191906000526020600020905b815481529060010190602001808311610bad57829003601f168201915b505050505081565b6000610bdd826110ee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590613df6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6d611ecb565b73ffffffffffffffffffffffffffffffffffffffff161480610c9c5750610c9b81610c96611ecb565b611ab8565b5b610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613cd6565b60405180910390fd5b610ce58383611f3f565b505050565b6000600880549050905090565b60115481565b610d0e610d08611ecb565b82611ff8565b610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613e16565b60405180910390fd5b610d588383836120d6565b505050565b6000610d6883611234565b8210610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090613b56565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e0a611ecb565b73ffffffffffffffffffffffffffffffffffffffff16610e28611374565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590613db6565b60405180910390fd5b6000610e88611374565b73ffffffffffffffffffffffffffffffffffffffff1647604051610eab90613a7d565b60006040518083038185875af1925050503d8060008114610ee8576040519150601f19603f3d011682016040523d82523d6000602084013e610eed565b606091505b5050905080610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2890613b36565b60405180910390fd5b50565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b60156020528060005260406000206000915090505481565b610fb683838360405180602001604052806000815250611874565b505050565b6000610fc5610cea565b8210611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90613e36565b60405180910390fd5b6008828154811061101a576110196142b0565b5b90600052602060002001549050919050565b601460009054906101000a900460ff1681565b611047611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611065611374565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613db6565b60405180910390fd5b80600b90805190602001906110d19291906130b8565b5050565b600d5481565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e90613d16565b60405180910390fd5b80915050919050565b600b80546111ad90614117565b80601f01602080910402602001604051908101604052809291908181526020018280546111d990614117565b80156112265780601f106111fb57610100808354040283529160200191611226565b820191906000526020600020905b81548152906001019060200180831161120957829003601f168201915b505050505081565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90613cf6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f4611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611312611374565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90613db6565b60405180910390fd5b611372600061233d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113a6611ecb565b73ffffffffffffffffffffffffffffffffffffffff166113c4611374565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190613db6565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b60606001805461144690614117565b80601f016020809104026020016040519081016040528092919081815260200182805461147290614117565b80156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b5050505050905090565b6114db6114d4611ecb565b8383612403565b5050565b600e5481565b601260009054906101000a900460ff1615611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90613e56565b60405180910390fd5b61153d611374565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290613d36565b60405180910390fd5b600c544210156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790613c56565b60405180910390fd5b601154811115611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90613e96565b60405180910390fd5b60115461168a82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461257090919063ffffffff16565b11156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290613b96565b60405180910390fd5b600e54600d546116db9190613fa6565b6116f082600f5461257090919063ffffffff16565b1115611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613d56565b60405180910390fd5b60005b8181101561181c5760006001600f5461174d9190613fa6565b9050600e54600d5461175f9190613fa6565b600f54106117a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179990613e76565b60405180910390fd5b6117ac3382612586565b803373ffffffffffffffffffffffffffffffffffffffff167f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b560405160405180910390a3600f60008154809291906118039061417a565b91905055505080806118149061417a565b915050611734565b506118713382601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c9190613fa6565b6125a4565b50565b61188561187f611ecb565b83611ff8565b6118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90613e16565b60405180910390fd5b6118d0848484846125ec565b50505050565b60606118e182611ed3565b611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790613dd6565b60405180910390fd5b60001515601460009054906101000a900460ff16151514156119ce576013805461194990614117565b80601f016020809104026020016040519081016040528092919081815260200182805461197590614117565b80156119c25780601f10611997576101008083540402835291602001916119c2565b820191906000526020600020905b8154815290600101906020018083116119a557829003601f168201915b50505050509050611a27565b60006119d8612648565b905060008151116119f85760405180602001604052806000815250611a23565b80611a02846126da565b604051602001611a13929190613a4e565b6040516020818303038152906040525b9150505b919050565b600c5481565b611a3a611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611a58611374565b73ffffffffffffffffffffffffffffffffffffffff1614611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa590613db6565b60405180910390fd5b80600c8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b54611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611b72611374565b73ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613db6565b60405180910390fd5b600e54611be08260105461257090919063ffffffff16565b1115611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1890613c96565b60405180910390fd5b60005b81811015611cd35760006001600f54611c3d9190613fa6565b9050600e5460105410611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90613cb6565b60405180910390fd5b611c8f3382612586565b600f6000815480929190611ca29061417a565b919050555060106000815480929190611cba9061417a565b9190505550508080611ccb9061417a565b915050611c24565b5050565b8060139080519060200190611ced9291906130b8565b5050565b611cf9611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611d17611374565b73ffffffffffffffffffffffffffffffffffffffff1614611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490613db6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490613bb6565b60405180910390fd5b611de68161233d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611eb457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ec45750611ec38261283b565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fb2836110ee565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061200382611ed3565b612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203990613c76565b60405180910390fd5b600061204d836110ee565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061208f575061208e8185611ab8565b5b806120cd57508373ffffffffffffffffffffffffffffffffffffffff166120b584610abf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120f6826110ee565b73ffffffffffffffffffffffffffffffffffffffff161461214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390613bd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390613c16565b60405180910390fd5b6121c78383836128a5565b6121d2600082611f3f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612222919061402d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122799190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123388383836129b9565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246990613c36565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125639190613af9565b60405180910390a3505050565b6000818361257e9190613fa6565b905092915050565b6125a08282604051806020016040528060008152506129be565b5050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6125f78484846120d6565b61260384848484612a19565b612642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263990613b76565b60405180910390fd5b50505050565b6060600b805461265790614117565b80601f016020809104026020016040519081016040528092919081815260200182805461268390614117565b80156126d05780601f106126a5576101008083540402835291602001916126d0565b820191906000526020600020905b8154815290600101906020018083116126b357829003601f168201915b5050505050905090565b60606000821415612722576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612836565b600082905060005b6000821461275457808061273d9061417a565b915050600a8261274d9190613ffc565b915061272a565b60008167ffffffffffffffff8111156127705761276f6142df565b5b6040519080825280601f01601f1916602001820160405280156127a25781602001600182028036833780820191505090505b5090505b6000851461282f576001826127bb919061402d565b9150600a856127ca91906141c3565b60306127d69190613fa6565b60f81b8183815181106127ec576127eb6142b0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128289190613ffc565b94506127a6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128b0838383612bb0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128f3576128ee81612bb5565b612932565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612931576129308382612bfe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129755761297081612d6b565b6129b4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129b3576129b28282612e3c565b5b5b505050565b505050565b6129c88383612ebb565b6129d56000848484612a19565b612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b90613b76565b60405180910390fd5b505050565b6000612a3a8473ffffffffffffffffffffffffffffffffffffffff16613095565b15612ba3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a63611ecb565b8786866040518563ffffffff1660e01b8152600401612a859493929190613aad565b602060405180830381600087803b158015612a9f57600080fd5b505af1925050508015612ad057506040513d601f19601f82011682018060405250810190612acd91906134c1565b60015b612b53573d8060008114612b00576040519150601f19603f3d011682016040523d82523d6000602084013e612b05565b606091505b50600081511415612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290613b76565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ba8565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c0b84611234565b612c15919061402d565b9050600060076000848152602001908152602001600020549050818114612cfa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d7f919061402d565b9050600060096000848152602001908152602001600020549050600060088381548110612daf57612dae6142b0565b5b906000526020600020015490508060088381548110612dd157612dd06142b0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e2057612e1f614281565b5b6001900381819060005260206000200160009055905550505050565b6000612e4783611234565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2290613d76565b60405180910390fd5b612f3481611ed3565b15612f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6b90613bf6565b60405180910390fd5b612f80600083836128a5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fd09190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613091600083836129b9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546130c490614117565b90600052602060002090601f0160209004810192826130e6576000855561312d565b82601f106130ff57805160ff191683800117855561312d565b8280016001018555821561312d579182015b8281111561312c578251825591602001919060010190613111565b5b50905061313a919061313e565b5090565b5b8082111561315757600081600090555060010161313f565b5090565b600061316e61316984613ef6565b613ed1565b90508281526020810184848401111561318a57613189614313565b5b6131958482856140d5565b509392505050565b60006131b06131ab84613f27565b613ed1565b9050828152602081018484840111156131cc576131cb614313565b5b6131d78482856140d5565b509392505050565b6000813590506131ee81614ad3565b92915050565b60008135905061320381614aea565b92915050565b60008135905061321881614b01565b92915050565b60008151905061322d81614b01565b92915050565b600082601f8301126132485761324761430e565b5b813561325884826020860161315b565b91505092915050565b600082601f8301126132765761327561430e565b5b813561328684826020860161319d565b91505092915050565b60008135905061329e81614b18565b92915050565b6000602082840312156132ba576132b961431d565b5b60006132c8848285016131df565b91505092915050565b600080604083850312156132e8576132e761431d565b5b60006132f6858286016131df565b9250506020613307858286016131df565b9150509250929050565b60008060006060848603121561332a5761332961431d565b5b6000613338868287016131df565b9350506020613349868287016131df565b925050604061335a8682870161328f565b9150509250925092565b6000806000806080858703121561337e5761337d61431d565b5b600061338c878288016131df565b945050602061339d878288016131df565b93505060406133ae8782880161328f565b925050606085013567ffffffffffffffff8111156133cf576133ce614318565b5b6133db87828801613233565b91505092959194509250565b600080604083850312156133fe576133fd61431d565b5b600061340c858286016131df565b925050602061341d858286016131f4565b9150509250929050565b6000806040838503121561343e5761343d61431d565b5b600061344c858286016131df565b925050602061345d8582860161328f565b9150509250929050565b60006020828403121561347d5761347c61431d565b5b600061348b848285016131f4565b91505092915050565b6000602082840312156134aa576134a961431d565b5b60006134b884828501613209565b91505092915050565b6000602082840312156134d7576134d661431d565b5b60006134e58482850161321e565b91505092915050565b6000602082840312156135045761350361431d565b5b600082013567ffffffffffffffff81111561352257613521614318565b5b61352e84828501613261565b91505092915050565b60006020828403121561354d5761354c61431d565b5b600061355b8482850161328f565b91505092915050565b61356d81614061565b82525050565b61357c81614073565b82525050565b600061358d82613f58565b6135978185613f6e565b93506135a78185602086016140e4565b6135b081614322565b840191505092915050565b60006135c682613f63565b6135d08185613f8a565b93506135e08185602086016140e4565b6135e981614322565b840191505092915050565b60006135ff82613f63565b6136098185613f9b565b93506136198185602086016140e4565b80840191505092915050565b6000613632601283613f8a565b915061363d82614333565b602082019050919050565b6000613655602b83613f8a565b91506136608261435c565b604082019050919050565b6000613678603283613f8a565b9150613683826143ab565b604082019050919050565b600061369b602783613f8a565b91506136a6826143fa565b604082019050919050565b60006136be602683613f8a565b91506136c982614449565b604082019050919050565b60006136e1602583613f8a565b91506136ec82614498565b604082019050919050565b6000613704601c83613f8a565b915061370f826144e7565b602082019050919050565b6000613727602483613f8a565b915061373282614510565b604082019050919050565b600061374a601983613f8a565b91506137558261455f565b602082019050919050565b600061376d602283613f8a565b915061377882614588565b604082019050919050565b6000613790602c83613f8a565b915061379b826145d7565b604082019050919050565b60006137b3604283613f8a565b91506137be82614626565b606082019050919050565b60006137d6601883613f8a565b91506137e18261469b565b602082019050919050565b60006137f9603883613f8a565b9150613804826146c4565b604082019050919050565b600061381c602a83613f8a565b915061382782614713565b604082019050919050565b600061383f602983613f8a565b915061384a82614762565b604082019050919050565b6000613862603783613f8a565b915061386d826147b1565b604082019050919050565b6000613885602083613f8a565b915061389082614800565b602082019050919050565b60006138a8602083613f8a565b91506138b382614829565b602082019050919050565b60006138cb602c83613f8a565b91506138d682614852565b604082019050919050565b60006138ee600583613f9b565b91506138f9826148a1565b600582019050919050565b6000613911602083613f8a565b915061391c826148ca565b602082019050919050565b6000613934602f83613f8a565b915061393f826148f3565b604082019050919050565b6000613957602183613f8a565b915061396282614942565b604082019050919050565b600061397a600083613f7f565b915061398582614991565b600082019050919050565b600061399d603183613f8a565b91506139a882614994565b604082019050919050565b60006139c0602c83613f8a565b91506139cb826149e3565b604082019050919050565b60006139e3601283613f8a565b91506139ee82614a32565b602082019050919050565b6000613a06600f83613f8a565b9150613a1182614a5b565b602082019050919050565b6000613a29602a83613f8a565b9150613a3482614a84565b604082019050919050565b613a48816140cb565b82525050565b6000613a5a82856135f4565b9150613a6682846135f4565b9150613a71826138e1565b91508190509392505050565b6000613a888261396d565b9150819050919050565b6000602082019050613aa76000830184613564565b92915050565b6000608082019050613ac26000830187613564565b613acf6020830186613564565b613adc6040830185613a3f565b8181036060830152613aee8184613582565b905095945050505050565b6000602082019050613b0e6000830184613573565b92915050565b60006020820190508181036000830152613b2e81846135bb565b905092915050565b60006020820190508181036000830152613b4f81613625565b9050919050565b60006020820190508181036000830152613b6f81613648565b9050919050565b60006020820190508181036000830152613b8f8161366b565b9050919050565b60006020820190508181036000830152613baf8161368e565b9050919050565b60006020820190508181036000830152613bcf816136b1565b9050919050565b60006020820190508181036000830152613bef816136d4565b9050919050565b60006020820190508181036000830152613c0f816136f7565b9050919050565b60006020820190508181036000830152613c2f8161371a565b9050919050565b60006020820190508181036000830152613c4f8161373d565b9050919050565b60006020820190508181036000830152613c6f81613760565b9050919050565b60006020820190508181036000830152613c8f81613783565b9050919050565b60006020820190508181036000830152613caf816137a6565b9050919050565b60006020820190508181036000830152613ccf816137c9565b9050919050565b60006020820190508181036000830152613cef816137ec565b9050919050565b60006020820190508181036000830152613d0f8161380f565b9050919050565b60006020820190508181036000830152613d2f81613832565b9050919050565b60006020820190508181036000830152613d4f81613855565b9050919050565b60006020820190508181036000830152613d6f81613878565b9050919050565b60006020820190508181036000830152613d8f8161389b565b9050919050565b60006020820190508181036000830152613daf816138be565b9050919050565b60006020820190508181036000830152613dcf81613904565b9050919050565b60006020820190508181036000830152613def81613927565b9050919050565b60006020820190508181036000830152613e0f8161394a565b9050919050565b60006020820190508181036000830152613e2f81613990565b9050919050565b60006020820190508181036000830152613e4f816139b3565b9050919050565b60006020820190508181036000830152613e6f816139d6565b9050919050565b60006020820190508181036000830152613e8f816139f9565b9050919050565b60006020820190508181036000830152613eaf81613a1c565b9050919050565b6000602082019050613ecb6000830184613a3f565b92915050565b6000613edb613eec565b9050613ee78282614149565b919050565b6000604051905090565b600067ffffffffffffffff821115613f1157613f106142df565b5b613f1a82614322565b9050602081019050919050565b600067ffffffffffffffff821115613f4257613f416142df565b5b613f4b82614322565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fb1826140cb565b9150613fbc836140cb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ff157613ff06141f4565b5b828201905092915050565b6000614007826140cb565b9150614012836140cb565b92508261402257614021614223565b5b828204905092915050565b6000614038826140cb565b9150614043836140cb565b925082821015614056576140556141f4565b5b828203905092915050565b600061406c826140ab565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141025780820151818401526020810190506140e7565b83811115614111576000848401525b50505050565b6000600282049050600182168061412f57607f821691505b6020821081141561414357614142614252565b5b50919050565b61415282614322565b810181811067ffffffffffffffff82111715614171576141706142df565b5b80604052505050565b6000614185826140cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141b8576141b76141f4565b5b600182019050919050565b60006141ce826140cb565b91506141d9836140cb565b9250826141e9576141e8614223565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4661696c656420746f2077697468647261770000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d61782033206974656d73207065722077616c6c65742c20446f6e277420626560008201527f2067726565647900000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5075626c69632073616c652074696d65206973206e6f7420616374697665207960008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d61782052657365727660008201527f656420737570706c792c20646f6e2774206265206120677265656479206f776e60208201527f6572000000000000000000000000000000000000000000000000000000000000604082015250565b7f416c6c207265736572766564206974656d7320736f6c64210000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f48657920677265656479206f776e65722c206d696e7420796f7572206f776e2060008201527f6675636b696e6720726573657276656420746f6b656e73000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f416c6c206974656d7320736f6c64210000000000000000000000000000000000600082015250565b7f4d6178696d756d206f6e6c792033206d696e747320616c6c6f7720706572207460008201527f72616e73616374696f6e00000000000000000000000000000000000000000000602082015250565b614adc81614061565b8114614ae757600080fd5b50565b614af381614073565b8114614afe57600080fd5b50565b614b0a8161407f565b8114614b1557600080fd5b50565b614b21816140cb565b8114614b2c57600080fd5b5056fea26469706673582212209c669fd59c622afc86bcd206c2466d5a9a20cc11c973e1cd01a6dddc9dc8d65164736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80635c975abb1161012e578063aa592f25116100ab578063e8fee1051161006f578063e8fee10514610846578063e985e9c51461086f578063f19e75d4146108ac578063f2c4ce1e146108c8578063f2fde38b146108f157610230565b8063aa592f251461076e578063b3ab66b014610799578063b88d4fde146107b5578063c87b56dd146107de578063d7822c991461081b57610230565b8063715018a6116100f2578063715018a6146106af5780638da5cb5b146106c6578063940cd05b146106f157806395d89b411461071a578063a22cb4651461074557610230565b80635c975abb146105b45780636352211e146105df5780636c0360eb1461061c5780636e88f3351461064757806370a082311461067257610230565b80632f745c59116101bc57806342842e0e1161018057806342842e0e146104cf5780634f6ccce7146104f8578063518302271461053557806355f804b31461056057806357d4c4ee1461058957610230565b80632f745c59146103d65780633ccfd60b146104135780633d6147441461042a5780633dff96011461046757806341940baa1461049257610230565b8063081c8c4411610203578063081c8c4414610303578063095ea7b31461032e57806318160ddd14610357578063239c70ae1461038257806323b872dd146103ad57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613494565b61091a565b6040516102699190613af9565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613467565b610994565b005b3480156102a757600080fd5b506102b0610a2d565b6040516102bd9190613b14565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613537565b610abf565b6040516102fa9190613a92565b60405180910390f35b34801561030f57600080fd5b50610318610b44565b6040516103259190613b14565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613427565b610bd2565b005b34801561036357600080fd5b5061036c610cea565b6040516103799190613eb6565b60405180910390f35b34801561038e57600080fd5b50610397610cf7565b6040516103a49190613eb6565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613311565b610cfd565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613427565b610d5d565b60405161040a9190613eb6565b60405180910390f35b34801561041f57600080fd5b50610428610e02565b005b34801561043657600080fd5b50610451600480360381019061044c91906132a4565b610f34565b60405161045e9190613eb6565b60405180910390f35b34801561047357600080fd5b5061047c610f7d565b6040516104899190613eb6565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906132a4565b610f83565b6040516104c69190613eb6565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613311565b610f9b565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613537565b610fbb565b60405161052c9190613eb6565b60405180910390f35b34801561054157600080fd5b5061054a61102c565b6040516105579190613af9565b60405180910390f35b34801561056c57600080fd5b50610587600480360381019061058291906134ee565b61103f565b005b34801561059557600080fd5b5061059e6110d5565b6040516105ab9190613eb6565b60405180910390f35b3480156105c057600080fd5b506105c96110db565b6040516105d69190613af9565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190613537565b6110ee565b6040516106139190613a92565b60405180910390f35b34801561062857600080fd5b506106316111a0565b60405161063e9190613b14565b60405180910390f35b34801561065357600080fd5b5061065c61122e565b6040516106699190613eb6565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906132a4565b611234565b6040516106a69190613eb6565b60405180910390f35b3480156106bb57600080fd5b506106c46112ec565b005b3480156106d257600080fd5b506106db611374565b6040516106e89190613a92565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613467565b61139e565b005b34801561072657600080fd5b5061072f611437565b60405161073c9190613b14565b60405180910390f35b34801561075157600080fd5b5061076c600480360381019061076791906133e7565b6114c9565b005b34801561077a57600080fd5b506107836114df565b6040516107909190613eb6565b60405180910390f35b6107b360048036038101906107ae9190613537565b6114e5565b005b3480156107c157600080fd5b506107dc60048036038101906107d79190613364565b611874565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613537565b6118d6565b6040516108129190613b14565b60405180910390f35b34801561082757600080fd5b50610830611a2c565b60405161083d9190613eb6565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613537565b611a32565b005b34801561087b57600080fd5b50610896600480360381019061089191906132d1565b611ab8565b6040516108a39190613af9565b60405180910390f35b6108c660048036038101906108c19190613537565b611b4c565b005b3480156108d457600080fd5b506108ef60048036038101906108ea91906134ee565b611cd7565b005b3480156108fd57600080fd5b50610918600480360381019061091391906132a4565b611cf1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098d575061098c82611de9565b5b9050919050565b61099c611ecb565b73ffffffffffffffffffffffffffffffffffffffff166109ba611374565b73ffffffffffffffffffffffffffffffffffffffff1614610a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0790613db6565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060008054610a3c90614117565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6890614117565b8015610ab55780601f10610a8a57610100808354040283529160200191610ab5565b820191906000526020600020905b815481529060010190602001808311610a9857829003601f168201915b5050505050905090565b6000610aca82611ed3565b610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090613d96565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60138054610b5190614117565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7d90614117565b8015610bca5780601f10610b9f57610100808354040283529160200191610bca565b820191906000526020600020905b815481529060010190602001808311610bad57829003601f168201915b505050505081565b6000610bdd826110ee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590613df6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6d611ecb565b73ffffffffffffffffffffffffffffffffffffffff161480610c9c5750610c9b81610c96611ecb565b611ab8565b5b610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613cd6565b60405180910390fd5b610ce58383611f3f565b505050565b6000600880549050905090565b60115481565b610d0e610d08611ecb565b82611ff8565b610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613e16565b60405180910390fd5b610d588383836120d6565b505050565b6000610d6883611234565b8210610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090613b56565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e0a611ecb565b73ffffffffffffffffffffffffffffffffffffffff16610e28611374565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590613db6565b60405180910390fd5b6000610e88611374565b73ffffffffffffffffffffffffffffffffffffffff1647604051610eab90613a7d565b60006040518083038185875af1925050503d8060008114610ee8576040519150601f19603f3d011682016040523d82523d6000602084013e610eed565b606091505b5050905080610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2890613b36565b60405180910390fd5b50565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b60156020528060005260406000206000915090505481565b610fb683838360405180602001604052806000815250611874565b505050565b6000610fc5610cea565b8210611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90613e36565b60405180910390fd5b6008828154811061101a576110196142b0565b5b90600052602060002001549050919050565b601460009054906101000a900460ff1681565b611047611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611065611374565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613db6565b60405180910390fd5b80600b90805190602001906110d19291906130b8565b5050565b600d5481565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e90613d16565b60405180910390fd5b80915050919050565b600b80546111ad90614117565b80601f01602080910402602001604051908101604052809291908181526020018280546111d990614117565b80156112265780601f106111fb57610100808354040283529160200191611226565b820191906000526020600020905b81548152906001019060200180831161120957829003601f168201915b505050505081565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90613cf6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f4611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611312611374565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90613db6565b60405180910390fd5b611372600061233d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113a6611ecb565b73ffffffffffffffffffffffffffffffffffffffff166113c4611374565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190613db6565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b60606001805461144690614117565b80601f016020809104026020016040519081016040528092919081815260200182805461147290614117565b80156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b5050505050905090565b6114db6114d4611ecb565b8383612403565b5050565b600e5481565b601260009054906101000a900460ff1615611535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152c90613e56565b60405180910390fd5b61153d611374565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290613d36565b60405180910390fd5b600c544210156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790613c56565b60405180910390fd5b601154811115611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90613e96565b60405180910390fd5b60115461168a82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461257090919063ffffffff16565b11156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290613b96565b60405180910390fd5b600e54600d546116db9190613fa6565b6116f082600f5461257090919063ffffffff16565b1115611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613d56565b60405180910390fd5b60005b8181101561181c5760006001600f5461174d9190613fa6565b9050600e54600d5461175f9190613fa6565b600f54106117a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179990613e76565b60405180910390fd5b6117ac3382612586565b803373ffffffffffffffffffffffffffffffffffffffff167f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b560405160405180910390a3600f60008154809291906118039061417a565b91905055505080806118149061417a565b915050611734565b506118713382601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c9190613fa6565b6125a4565b50565b61188561187f611ecb565b83611ff8565b6118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90613e16565b60405180910390fd5b6118d0848484846125ec565b50505050565b60606118e182611ed3565b611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790613dd6565b60405180910390fd5b60001515601460009054906101000a900460ff16151514156119ce576013805461194990614117565b80601f016020809104026020016040519081016040528092919081815260200182805461197590614117565b80156119c25780601f10611997576101008083540402835291602001916119c2565b820191906000526020600020905b8154815290600101906020018083116119a557829003601f168201915b50505050509050611a27565b60006119d8612648565b905060008151116119f85760405180602001604052806000815250611a23565b80611a02846126da565b604051602001611a13929190613a4e565b6040516020818303038152906040525b9150505b919050565b600c5481565b611a3a611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611a58611374565b73ffffffffffffffffffffffffffffffffffffffff1614611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa590613db6565b60405180910390fd5b80600c8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b54611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611b72611374565b73ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613db6565b60405180910390fd5b600e54611be08260105461257090919063ffffffff16565b1115611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1890613c96565b60405180910390fd5b60005b81811015611cd35760006001600f54611c3d9190613fa6565b9050600e5460105410611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90613cb6565b60405180910390fd5b611c8f3382612586565b600f6000815480929190611ca29061417a565b919050555060106000815480929190611cba9061417a565b9190505550508080611ccb9061417a565b915050611c24565b5050565b8060139080519060200190611ced9291906130b8565b5050565b611cf9611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611d17611374565b73ffffffffffffffffffffffffffffffffffffffff1614611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490613db6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490613bb6565b60405180910390fd5b611de68161233d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611eb457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ec45750611ec38261283b565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fb2836110ee565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061200382611ed3565b612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203990613c76565b60405180910390fd5b600061204d836110ee565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061208f575061208e8185611ab8565b5b806120cd57508373ffffffffffffffffffffffffffffffffffffffff166120b584610abf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120f6826110ee565b73ffffffffffffffffffffffffffffffffffffffff161461214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390613bd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390613c16565b60405180910390fd5b6121c78383836128a5565b6121d2600082611f3f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612222919061402d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122799190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123388383836129b9565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246990613c36565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125639190613af9565b60405180910390a3505050565b6000818361257e9190613fa6565b905092915050565b6125a08282604051806020016040528060008152506129be565b5050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6125f78484846120d6565b61260384848484612a19565b612642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263990613b76565b60405180910390fd5b50505050565b6060600b805461265790614117565b80601f016020809104026020016040519081016040528092919081815260200182805461268390614117565b80156126d05780601f106126a5576101008083540402835291602001916126d0565b820191906000526020600020905b8154815290600101906020018083116126b357829003601f168201915b5050505050905090565b60606000821415612722576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612836565b600082905060005b6000821461275457808061273d9061417a565b915050600a8261274d9190613ffc565b915061272a565b60008167ffffffffffffffff8111156127705761276f6142df565b5b6040519080825280601f01601f1916602001820160405280156127a25781602001600182028036833780820191505090505b5090505b6000851461282f576001826127bb919061402d565b9150600a856127ca91906141c3565b60306127d69190613fa6565b60f81b8183815181106127ec576127eb6142b0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128289190613ffc565b94506127a6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128b0838383612bb0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128f3576128ee81612bb5565b612932565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612931576129308382612bfe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129755761297081612d6b565b6129b4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129b3576129b28282612e3c565b5b5b505050565b505050565b6129c88383612ebb565b6129d56000848484612a19565b612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b90613b76565b60405180910390fd5b505050565b6000612a3a8473ffffffffffffffffffffffffffffffffffffffff16613095565b15612ba3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a63611ecb565b8786866040518563ffffffff1660e01b8152600401612a859493929190613aad565b602060405180830381600087803b158015612a9f57600080fd5b505af1925050508015612ad057506040513d601f19601f82011682018060405250810190612acd91906134c1565b60015b612b53573d8060008114612b00576040519150601f19603f3d011682016040523d82523d6000602084013e612b05565b606091505b50600081511415612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290613b76565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ba8565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c0b84611234565b612c15919061402d565b9050600060076000848152602001908152602001600020549050818114612cfa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d7f919061402d565b9050600060096000848152602001908152602001600020549050600060088381548110612daf57612dae6142b0565b5b906000526020600020015490508060088381548110612dd157612dd06142b0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e2057612e1f614281565b5b6001900381819060005260206000200160009055905550505050565b6000612e4783611234565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2290613d76565b60405180910390fd5b612f3481611ed3565b15612f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6b90613bf6565b60405180910390fd5b612f80600083836128a5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fd09190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613091600083836129b9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546130c490614117565b90600052602060002090601f0160209004810192826130e6576000855561312d565b82601f106130ff57805160ff191683800117855561312d565b8280016001018555821561312d579182015b8281111561312c578251825591602001919060010190613111565b5b50905061313a919061313e565b5090565b5b8082111561315757600081600090555060010161313f565b5090565b600061316e61316984613ef6565b613ed1565b90508281526020810184848401111561318a57613189614313565b5b6131958482856140d5565b509392505050565b60006131b06131ab84613f27565b613ed1565b9050828152602081018484840111156131cc576131cb614313565b5b6131d78482856140d5565b509392505050565b6000813590506131ee81614ad3565b92915050565b60008135905061320381614aea565b92915050565b60008135905061321881614b01565b92915050565b60008151905061322d81614b01565b92915050565b600082601f8301126132485761324761430e565b5b813561325884826020860161315b565b91505092915050565b600082601f8301126132765761327561430e565b5b813561328684826020860161319d565b91505092915050565b60008135905061329e81614b18565b92915050565b6000602082840312156132ba576132b961431d565b5b60006132c8848285016131df565b91505092915050565b600080604083850312156132e8576132e761431d565b5b60006132f6858286016131df565b9250506020613307858286016131df565b9150509250929050565b60008060006060848603121561332a5761332961431d565b5b6000613338868287016131df565b9350506020613349868287016131df565b925050604061335a8682870161328f565b9150509250925092565b6000806000806080858703121561337e5761337d61431d565b5b600061338c878288016131df565b945050602061339d878288016131df565b93505060406133ae8782880161328f565b925050606085013567ffffffffffffffff8111156133cf576133ce614318565b5b6133db87828801613233565b91505092959194509250565b600080604083850312156133fe576133fd61431d565b5b600061340c858286016131df565b925050602061341d858286016131f4565b9150509250929050565b6000806040838503121561343e5761343d61431d565b5b600061344c858286016131df565b925050602061345d8582860161328f565b9150509250929050565b60006020828403121561347d5761347c61431d565b5b600061348b848285016131f4565b91505092915050565b6000602082840312156134aa576134a961431d565b5b60006134b884828501613209565b91505092915050565b6000602082840312156134d7576134d661431d565b5b60006134e58482850161321e565b91505092915050565b6000602082840312156135045761350361431d565b5b600082013567ffffffffffffffff81111561352257613521614318565b5b61352e84828501613261565b91505092915050565b60006020828403121561354d5761354c61431d565b5b600061355b8482850161328f565b91505092915050565b61356d81614061565b82525050565b61357c81614073565b82525050565b600061358d82613f58565b6135978185613f6e565b93506135a78185602086016140e4565b6135b081614322565b840191505092915050565b60006135c682613f63565b6135d08185613f8a565b93506135e08185602086016140e4565b6135e981614322565b840191505092915050565b60006135ff82613f63565b6136098185613f9b565b93506136198185602086016140e4565b80840191505092915050565b6000613632601283613f8a565b915061363d82614333565b602082019050919050565b6000613655602b83613f8a565b91506136608261435c565b604082019050919050565b6000613678603283613f8a565b9150613683826143ab565b604082019050919050565b600061369b602783613f8a565b91506136a6826143fa565b604082019050919050565b60006136be602683613f8a565b91506136c982614449565b604082019050919050565b60006136e1602583613f8a565b91506136ec82614498565b604082019050919050565b6000613704601c83613f8a565b915061370f826144e7565b602082019050919050565b6000613727602483613f8a565b915061373282614510565b604082019050919050565b600061374a601983613f8a565b91506137558261455f565b602082019050919050565b600061376d602283613f8a565b915061377882614588565b604082019050919050565b6000613790602c83613f8a565b915061379b826145d7565b604082019050919050565b60006137b3604283613f8a565b91506137be82614626565b606082019050919050565b60006137d6601883613f8a565b91506137e18261469b565b602082019050919050565b60006137f9603883613f8a565b9150613804826146c4565b604082019050919050565b600061381c602a83613f8a565b915061382782614713565b604082019050919050565b600061383f602983613f8a565b915061384a82614762565b604082019050919050565b6000613862603783613f8a565b915061386d826147b1565b604082019050919050565b6000613885602083613f8a565b915061389082614800565b602082019050919050565b60006138a8602083613f8a565b91506138b382614829565b602082019050919050565b60006138cb602c83613f8a565b91506138d682614852565b604082019050919050565b60006138ee600583613f9b565b91506138f9826148a1565b600582019050919050565b6000613911602083613f8a565b915061391c826148ca565b602082019050919050565b6000613934602f83613f8a565b915061393f826148f3565b604082019050919050565b6000613957602183613f8a565b915061396282614942565b604082019050919050565b600061397a600083613f7f565b915061398582614991565b600082019050919050565b600061399d603183613f8a565b91506139a882614994565b604082019050919050565b60006139c0602c83613f8a565b91506139cb826149e3565b604082019050919050565b60006139e3601283613f8a565b91506139ee82614a32565b602082019050919050565b6000613a06600f83613f8a565b9150613a1182614a5b565b602082019050919050565b6000613a29602a83613f8a565b9150613a3482614a84565b604082019050919050565b613a48816140cb565b82525050565b6000613a5a82856135f4565b9150613a6682846135f4565b9150613a71826138e1565b91508190509392505050565b6000613a888261396d565b9150819050919050565b6000602082019050613aa76000830184613564565b92915050565b6000608082019050613ac26000830187613564565b613acf6020830186613564565b613adc6040830185613a3f565b8181036060830152613aee8184613582565b905095945050505050565b6000602082019050613b0e6000830184613573565b92915050565b60006020820190508181036000830152613b2e81846135bb565b905092915050565b60006020820190508181036000830152613b4f81613625565b9050919050565b60006020820190508181036000830152613b6f81613648565b9050919050565b60006020820190508181036000830152613b8f8161366b565b9050919050565b60006020820190508181036000830152613baf8161368e565b9050919050565b60006020820190508181036000830152613bcf816136b1565b9050919050565b60006020820190508181036000830152613bef816136d4565b9050919050565b60006020820190508181036000830152613c0f816136f7565b9050919050565b60006020820190508181036000830152613c2f8161371a565b9050919050565b60006020820190508181036000830152613c4f8161373d565b9050919050565b60006020820190508181036000830152613c6f81613760565b9050919050565b60006020820190508181036000830152613c8f81613783565b9050919050565b60006020820190508181036000830152613caf816137a6565b9050919050565b60006020820190508181036000830152613ccf816137c9565b9050919050565b60006020820190508181036000830152613cef816137ec565b9050919050565b60006020820190508181036000830152613d0f8161380f565b9050919050565b60006020820190508181036000830152613d2f81613832565b9050919050565b60006020820190508181036000830152613d4f81613855565b9050919050565b60006020820190508181036000830152613d6f81613878565b9050919050565b60006020820190508181036000830152613d8f8161389b565b9050919050565b60006020820190508181036000830152613daf816138be565b9050919050565b60006020820190508181036000830152613dcf81613904565b9050919050565b60006020820190508181036000830152613def81613927565b9050919050565b60006020820190508181036000830152613e0f8161394a565b9050919050565b60006020820190508181036000830152613e2f81613990565b9050919050565b60006020820190508181036000830152613e4f816139b3565b9050919050565b60006020820190508181036000830152613e6f816139d6565b9050919050565b60006020820190508181036000830152613e8f816139f9565b9050919050565b60006020820190508181036000830152613eaf81613a1c565b9050919050565b6000602082019050613ecb6000830184613a3f565b92915050565b6000613edb613eec565b9050613ee78282614149565b919050565b6000604051905090565b600067ffffffffffffffff821115613f1157613f106142df565b5b613f1a82614322565b9050602081019050919050565b600067ffffffffffffffff821115613f4257613f416142df565b5b613f4b82614322565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fb1826140cb565b9150613fbc836140cb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ff157613ff06141f4565b5b828201905092915050565b6000614007826140cb565b9150614012836140cb565b92508261402257614021614223565b5b828204905092915050565b6000614038826140cb565b9150614043836140cb565b925082821015614056576140556141f4565b5b828203905092915050565b600061406c826140ab565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141025780820151818401526020810190506140e7565b83811115614111576000848401525b50505050565b6000600282049050600182168061412f57607f821691505b6020821081141561414357614142614252565b5b50919050565b61415282614322565b810181811067ffffffffffffffff82111715614171576141706142df565b5b80604052505050565b6000614185826140cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141b8576141b76141f4565b5b600182019050919050565b60006141ce826140cb565b91506141d9836140cb565b9250826141e9576141e8614223565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4661696c656420746f2077697468647261770000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d61782033206974656d73207065722077616c6c65742c20446f6e277420626560008201527f2067726565647900000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5075626c69632073616c652074696d65206973206e6f7420616374697665207960008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d61782052657365727660008201527f656420737570706c792c20646f6e2774206265206120677265656479206f776e60208201527f6572000000000000000000000000000000000000000000000000000000000000604082015250565b7f416c6c207265736572766564206974656d7320736f6c64210000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f48657920677265656479206f776e65722c206d696e7420796f7572206f776e2060008201527f6675636b696e6720726573657276656420746f6b656e73000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f416c6c206974656d7320736f6c64210000000000000000000000000000000000600082015250565b7f4d6178696d756d206f6e6c792033206d696e747320616c6c6f7720706572207460008201527f72616e73616374696f6e00000000000000000000000000000000000000000000602082015250565b614adc81614061565b8114614ae757600080fd5b50565b614af381614073565b8114614afe57600080fd5b50565b614b0a8161407f565b8114614b1557600080fd5b50565b614b21816140cb565b8114614b2c57600080fd5b5056fea26469706673582212209c669fd59c622afc86bcd206c2466d5a9a20cc11c973e1cd01a6dddc9dc8d65164736f6c63430008070033

Deployed Bytecode Sourcemap

52608:5362:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46394:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57195:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33213:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34773:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53196:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34296:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47034:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53102:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35523:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46702:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57795:172;;;;;;;;;;;;;:::i;:::-;;57540:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53023:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53319:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35933:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47224:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53231:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57000:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52949:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53163:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32907:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52725:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53061:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32637:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11771:103;;;;;;;;;;;;;:::i;:::-;;11120:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56402:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33382:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35066:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52987:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53741:1195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36189:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55617:719;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52806:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56756:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35292:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55008:547;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56553:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12029:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46394:224;46496:4;46535:35;46520:50;;;:11;:50;;;;:90;;;;46574:36;46598:11;46574:23;:36::i;:::-;46520:90;46513:97;;46394:224;;;:::o;57195:79::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57260:6:::1;57251;;:15;;;;;;;;;;;;;;;;;;57195:79:::0;:::o;33213:100::-;33267:13;33300:5;33293:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33213:100;:::o;34773:221::-;34849:7;34877:16;34885:7;34877;:16::i;:::-;34869:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34962:15;:24;34978:7;34962:24;;;;;;;;;;;;;;;;;;;;;34955:31;;34773:221;;;:::o;53196:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34296:411::-;34377:13;34393:23;34408:7;34393:14;:23::i;:::-;34377:39;;34441:5;34435:11;;:2;:11;;;;34427:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34535:5;34519:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34544:37;34561:5;34568:12;:10;:12::i;:::-;34544:16;:37::i;:::-;34519:62;34497:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34678:21;34687:2;34691:7;34678:8;:21::i;:::-;34366:341;34296:411;;:::o;47034:113::-;47095:7;47122:10;:17;;;;47115:24;;47034:113;:::o;53102:32::-;;;;:::o;35523:339::-;35718:41;35737:12;:10;:12::i;:::-;35751:7;35718:18;:41::i;:::-;35710:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35826:28;35836:4;35842:2;35846:7;35826:9;:28::i;:::-;35523:339;;;:::o;46702:256::-;46799:7;46835:23;46852:5;46835:16;:23::i;:::-;46827:5;:31;46819:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46924:12;:19;46937:5;46924:19;;;;;;;;;;;;;;;:26;46944:5;46924:26;;;;;;;;;;;;46917:33;;46702:256;;;;:::o;57795:172::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57846:12:::1;57864:7;:5;:7::i;:::-;:12;;57884:21;57864:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57845:65;;;57929:7;57921:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57834:133;57795:172::o:0;57540:174::-;57656:7;57688:11;:18;57700:5;57688:18;;;;;;;;;;;;;;;;57681:25;;57540:174;;;:::o;53023:31::-;;;;:::o;53319:46::-;;;;;;;;;;;;;;;;;:::o;35933:185::-;36071:39;36088:4;36094:2;36098:7;36071:39;;;;;;;;;;;;:16;:39::i;:::-;35933:185;;;:::o;47224:233::-;47299:7;47335:30;:28;:30::i;:::-;47327:5;:38;47319:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47432:10;47443:5;47432:17;;;;;;;;:::i;:::-;;;;;;;;;;47425:24;;47224:233;;;:::o;53231:28::-;;;;;;;;;;;;;:::o;57000:104::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57085:11:::1;57075:7;:21;;;;;;;;;;;;:::i;:::-;;57000:104:::0;:::o;52949:31::-;;;;:::o;53163:26::-;;;;;;;;;;;;;:::o;32907:239::-;32979:7;32999:13;33015:7;:16;33023:7;33015:16;;;;;;;;;;;;;;;;;;;;;32999:32;;33067:1;33050:19;;:5;:19;;;;33042:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33133:5;33126:12;;;32907:239;;;:::o;52725:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53061:34::-;;;;:::o;32637:208::-;32709:7;32754:1;32737:19;;:5;:19;;;;32729:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32821:9;:16;32831:5;32821:16;;;;;;;;;;;;;;;;32814:23;;32637:208;;;:::o;11771:103::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11836:30:::1;11863:1;11836:18;:30::i;:::-;11771:103::o:0;11120:87::-;11166:7;11193:6;;;;;;;;;;;11186:13;;11120:87;:::o;56402:82::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56470:6:::1;56459:8;;:17;;;;;;;;;;;;;;;;;;56402:82:::0;:::o;33382:104::-;33438:13;33471:7;33464:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33382:104;:::o;35066:155::-;35161:52;35180:12;:10;:12::i;:::-;35194:8;35204;35161:18;:52::i;:::-;35066:155;;:::o;52987:29::-;;;;:::o;53741:1195::-;53821:6;;;;;;;;;;;53820:7;53812:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;53883:7;:5;:7::i;:::-;53869:21;;:10;:21;;;;53861:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54002:24;;53983:15;:43;;53961:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;54144:13;;54129:11;:28;;54107:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;54290:13;;54246:40;54274:11;54246;:23;54258:10;54246:23;;;;;;;;;;;;;;;;:27;;:40;;;;:::i;:::-;:57;;54238:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;54423:8;;54413:9;;:18;;;;:::i;:::-;54380:29;54397:11;54380:12;;:16;;:29;;;;:::i;:::-;:51;;54358:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;54513:9;54508:338;54532:11;54528:1;:15;54508:338;;;54569:17;54604:1;54589:12;;:16;;;;:::i;:::-;54569:36;;54657:8;;54647:9;;:18;;;;:::i;:::-;54632:12;;:33;54624:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54704:32;54714:10;54726:9;54704;:32::i;:::-;54787:9;54775:10;54760:37;;;;;;;;;;;;54816:12;;:14;;;;;;;;;:::i;:::-;;;;;;54550:296;54545:3;;;;;:::i;:::-;;;;54508:338;;;;54860:68;54878:10;54916:11;54890;:23;54902:10;54890:23;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;54860:17;:68::i;:::-;53741:1195;:::o;36189:328::-;36364:41;36383:12;:10;:12::i;:::-;36397:7;36364:18;:41::i;:::-;36356:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36470:39;36484:4;36490:2;36494:7;36503:5;36470:13;:39::i;:::-;36189:328;;;;:::o;55617:719::-;55735:13;55788:16;55796:7;55788;:16::i;:::-;55766:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;55908:5;55896:17;;:8;;;;;;;;;;;:17;;;55892:71;;;55937:14;55930:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55892:71;55975:28;56006:10;:8;:10::i;:::-;55975:41;;56078:1;56053:14;56047:28;:32;:281;;;;;;;;;;;;;;;;;56171:14;56212:18;:7;:16;:18::i;:::-;56128:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56047:281;56027:301;;;55617:719;;;;:::o;52806:52::-;;;;:::o;56756:165::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56898:15:::1;56871:24;:42;;;;56756:165:::0;:::o;35292:164::-;35389:4;35413:18;:25;35432:5;35413:25;;;;;;;;;;;;;;;:35;35439:8;35413:35;;;;;;;;;;;;;;;;;;;;;;;;;35406:42;;35292:164;;;;:::o;55008:547::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55142:8:::1;;55106:32;55126:11;55106:15;;:19;;:32;;;;:::i;:::-;:44;;55084:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;55262:9;55257:291;55281:11;55277:1;:15;55257:291;;;55314:17;55349:1;55334:12;;:16;;;;:::i;:::-;55314:36;;55391:8;;55373:15;;:26;55365:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55443:32;55453:10;55465:9;55443;:32::i;:::-;55490:12;;:14;;;;;;;;;:::i;:::-;;;;;;55519:15;;:17;;;;;;;;;:::i;:::-;;;;;;55299:249;55294:3;;;;;:::i;:::-;;;;55257:291;;;;55008:547:::0;:::o;56553:116::-;56646:15;56629:14;:32;;;;;;;;;;;;:::i;:::-;;56553:116;:::o;12029:201::-;11351:12;:10;:12::i;:::-;11340:23;;:7;:5;:7::i;:::-;:23;;;11332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12138:1:::1;12118:22;;:8;:22;;;;12110:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12194:28;12213:8;12194:18;:28::i;:::-;12029:201:::0;:::o;32268:305::-;32370:4;32422:25;32407:40;;;:11;:40;;;;:105;;;;32479:33;32464:48;;;:11;:48;;;;32407:105;:158;;;;32529:36;32553:11;32529:23;:36::i;:::-;32407:158;32387:178;;32268:305;;;:::o;9844:98::-;9897:7;9924:10;9917:17;;9844:98;:::o;38027:127::-;38092:4;38144:1;38116:30;;:7;:16;38124:7;38116:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38109:37;;38027:127;;;:::o;42173:174::-;42275:2;42248:15;:24;42264:7;42248:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42331:7;42327:2;42293:46;;42302:23;42317:7;42302:14;:23::i;:::-;42293:46;;;;;;;;;;;;42173:174;;:::o;38321:348::-;38414:4;38439:16;38447:7;38439;:16::i;:::-;38431:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38515:13;38531:23;38546:7;38531:14;:23::i;:::-;38515:39;;38584:5;38573:16;;:7;:16;;;:52;;;;38593:32;38610:5;38617:7;38593:16;:32::i;:::-;38573:52;:87;;;;38653:7;38629:31;;:20;38641:7;38629:11;:20::i;:::-;:31;;;38573:87;38565:96;;;38321:348;;;;:::o;41430:625::-;41589:4;41562:31;;:23;41577:7;41562:14;:23::i;:::-;:31;;;41554:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;41668:1;41654:16;;:2;:16;;;;41646:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41724:39;41745:4;41751:2;41755:7;41724:20;:39::i;:::-;41828:29;41845:1;41849:7;41828:8;:29::i;:::-;41889:1;41870:9;:15;41880:4;41870:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41918:1;41901:9;:13;41911:2;41901:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41949:2;41930:7;:16;41938:7;41930:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41988:7;41984:2;41969:27;;41978:4;41969:27;;;;;;;;;;;;42009:38;42029:4;42035:2;42039:7;42009:19;:38::i;:::-;41430:625;;;:::o;12390:191::-;12464:16;12483:6;;;;;;;;;;;12464:25;;12509:8;12500:6;;:17;;;;;;;;;;;;;;;;;;12564:8;12533:40;;12554:8;12533:40;;;;;;;;;;;;12453:128;12390:191;:::o;42489:315::-;42644:8;42635:17;;:5;:17;;;;42627:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;42731:8;42693:18;:25;42712:5;42693:25;;;;;;;;;;;;;;;:35;42719:8;42693:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;42777:8;42755:41;;42770:5;42755:41;;;42787:8;42755:41;;;;;;:::i;:::-;;;;;;;;42489:315;;;:::o;2876:98::-;2934:7;2965:1;2961;:5;;;;:::i;:::-;2954:12;;2876:98;;;;:::o;39011:110::-;39087:26;39097:2;39101:7;39087:26;;;;;;;;;;;;:9;:26::i;:::-;39011:110;;:::o;57333:115::-;57433:7;57412:11;:18;57424:5;57412:18;;;;;;;;;;;;;;;:28;;;;57333:115;;:::o;37399:315::-;37556:28;37566:4;37572:2;37576:7;37556:9;:28::i;:::-;37603:48;37626:4;37632:2;37636:7;37645:5;37603:22;:48::i;:::-;37595:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37399:315;;;;:::o;53561:108::-;53621:13;53654:7;53647:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53561:108;:::o;7406:723::-;7462:13;7692:1;7683:5;:10;7679:53;;;7710:10;;;;;;;;;;;;;;;;;;;;;7679:53;7742:12;7757:5;7742:20;;7773:14;7798:78;7813:1;7805:4;:9;7798:78;;7831:8;;;;;:::i;:::-;;;;7862:2;7854:10;;;;;:::i;:::-;;;7798:78;;;7886:19;7918:6;7908:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7886:39;;7936:154;7952:1;7943:5;:10;7936:154;;7980:1;7970:11;;;;;:::i;:::-;;;8047:2;8039:5;:10;;;;:::i;:::-;8026:2;:24;;;;:::i;:::-;8013:39;;7996:6;8003;7996:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8076:2;8067:11;;;;;:::i;:::-;;;7936:154;;;8114:6;8100:21;;;;;7406:723;;;;:::o;23927:157::-;24012:4;24051:25;24036:40;;;:11;:40;;;;24029:47;;23927:157;;;:::o;48070:589::-;48214:45;48241:4;48247:2;48251:7;48214:26;:45::i;:::-;48292:1;48276:18;;:4;:18;;;48272:187;;;48311:40;48343:7;48311:31;:40::i;:::-;48272:187;;;48381:2;48373:10;;:4;:10;;;48369:90;;48400:47;48433:4;48439:7;48400:32;:47::i;:::-;48369:90;48272:187;48487:1;48473:16;;:2;:16;;;48469:183;;;48506:45;48543:7;48506:36;:45::i;:::-;48469:183;;;48579:4;48573:10;;:2;:10;;;48569:83;;48600:40;48628:2;48632:7;48600:27;:40::i;:::-;48569:83;48469:183;48070:589;;;:::o;45251:125::-;;;;:::o;39348:321::-;39478:18;39484:2;39488:7;39478:5;:18::i;:::-;39529:54;39560:1;39564:2;39568:7;39577:5;39529:22;:54::i;:::-;39507:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;39348:321;;;:::o;43369:799::-;43524:4;43545:15;:2;:13;;;:15::i;:::-;43541:620;;;43597:2;43581:36;;;43618:12;:10;:12::i;:::-;43632:4;43638:7;43647:5;43581:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43577:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43840:1;43823:6;:13;:18;43819:272;;;43866:60;;;;;;;;;;:::i;:::-;;;;;;;;43819:272;44041:6;44035:13;44026:6;44022:2;44018:15;44011:38;43577:529;43714:41;;;43704:51;;;:6;:51;;;;43697:58;;;;;43541:620;44145:4;44138:11;;43369:799;;;;;;;:::o;44740:126::-;;;;:::o;49382:164::-;49486:10;:17;;;;49459:15;:24;49475:7;49459:24;;;;;;;;;;;:44;;;;49514:10;49530:7;49514:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49382:164;:::o;50173:988::-;50439:22;50489:1;50464:22;50481:4;50464:16;:22::i;:::-;:26;;;;:::i;:::-;50439:51;;50501:18;50522:17;:26;50540:7;50522:26;;;;;;;;;;;;50501:47;;50669:14;50655:10;:28;50651:328;;50700:19;50722:12;:18;50735:4;50722:18;;;;;;;;;;;;;;;:34;50741:14;50722:34;;;;;;;;;;;;50700:56;;50806:11;50773:12;:18;50786:4;50773:18;;;;;;;;;;;;;;;:30;50792:10;50773:30;;;;;;;;;;;:44;;;;50923:10;50890:17;:30;50908:11;50890:30;;;;;;;;;;;:43;;;;50685:294;50651:328;51075:17;:26;51093:7;51075:26;;;;;;;;;;;51068:33;;;51119:12;:18;51132:4;51119:18;;;;;;;;;;;;;;;:34;51138:14;51119:34;;;;;;;;;;;51112:41;;;50254:907;;50173:988;;:::o;51456:1079::-;51709:22;51754:1;51734:10;:17;;;;:21;;;;:::i;:::-;51709:46;;51766:18;51787:15;:24;51803:7;51787:24;;;;;;;;;;;;51766:45;;52138:19;52160:10;52171:14;52160:26;;;;;;;;:::i;:::-;;;;;;;;;;52138:48;;52224:11;52199:10;52210;52199:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;52335:10;52304:15;:28;52320:11;52304:28;;;;;;;;;;;:41;;;;52476:15;:24;52492:7;52476:24;;;;;;;;;;;52469:31;;;52511:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51527:1008;;;51456:1079;:::o;48960:221::-;49045:14;49062:20;49079:2;49062:16;:20::i;:::-;49045:37;;49120:7;49093:12;:16;49106:2;49093:16;;;;;;;;;;;;;;;:24;49110:6;49093:24;;;;;;;;;;;:34;;;;49167:6;49138:17;:26;49156:7;49138:26;;;;;;;;;;;:35;;;;49034:147;48960:221;;:::o;40005:439::-;40099:1;40085:16;;:2;:16;;;;40077:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40158:16;40166:7;40158;:16::i;:::-;40157:17;40149:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40220:45;40249:1;40253:2;40257:7;40220:20;:45::i;:::-;40295:1;40278:9;:13;40288:2;40278:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40326:2;40307:7;:16;40315:7;40307:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40371:7;40367:2;40346:33;;40363:1;40346:33;;;;;;;;;;;;40392:44;40420:1;40424:2;40428:7;40392:19;:44::i;:::-;40005:439;;:::o;13821:326::-;13881:4;14138:1;14116:7;:19;;;:23;14109:30;;13821:326;;;:::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:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:::-;11219:3;11240:67;11304:2;11299:3;11240:67;:::i;:::-;11233:74;;11316:93;11405:3;11316:93;:::i;:::-;11434:2;11429:3;11425:12;11418:19;;11077:366;;;:::o;11449:::-;11591:3;11612:67;11676:2;11671:3;11612:67;:::i;:::-;11605:74;;11688:93;11777:3;11688:93;:::i;:::-;11806:2;11801:3;11797:12;11790:19;;11449:366;;;:::o;11821:::-;11963:3;11984:67;12048:2;12043:3;11984:67;:::i;:::-;11977:74;;12060:93;12149:3;12060:93;:::i;:::-;12178:2;12173:3;12169:12;12162:19;;11821:366;;;:::o;12193:::-;12335:3;12356:67;12420:2;12415:3;12356:67;:::i;:::-;12349:74;;12432:93;12521:3;12432:93;:::i;:::-;12550:2;12545:3;12541:12;12534:19;;12193:366;;;:::o;12565:::-;12707:3;12728:67;12792:2;12787:3;12728:67;:::i;:::-;12721:74;;12804:93;12893:3;12804:93;:::i;:::-;12922:2;12917:3;12913:12;12906:19;;12565:366;;;:::o;12937:::-;13079:3;13100:67;13164:2;13159:3;13100:67;:::i;:::-;13093:74;;13176:93;13265:3;13176:93;:::i;:::-;13294:2;13289:3;13285:12;13278:19;;12937:366;;;:::o;13309:::-;13451:3;13472:67;13536:2;13531:3;13472:67;:::i;:::-;13465:74;;13548:93;13637:3;13548:93;:::i;:::-;13666:2;13661:3;13657:12;13650:19;;13309:366;;;:::o;13681:::-;13823:3;13844:67;13908:2;13903:3;13844:67;:::i;:::-;13837:74;;13920:93;14009:3;13920:93;:::i;:::-;14038:2;14033:3;14029:12;14022:19;;13681:366;;;:::o;14053:::-;14195:3;14216:67;14280:2;14275:3;14216:67;:::i;:::-;14209:74;;14292:93;14381:3;14292:93;:::i;:::-;14410:2;14405:3;14401:12;14394:19;;14053:366;;;:::o;14425:::-;14567:3;14588:67;14652:2;14647:3;14588:67;:::i;:::-;14581:74;;14664:93;14753:3;14664:93;:::i;:::-;14782:2;14777:3;14773:12;14766:19;;14425:366;;;:::o;14797:::-;14939:3;14960:67;15024:2;15019:3;14960:67;:::i;:::-;14953:74;;15036:93;15125:3;15036:93;:::i;:::-;15154:2;15149:3;15145:12;15138:19;;14797:366;;;:::o;15169:::-;15311:3;15332:67;15396:2;15391:3;15332:67;:::i;:::-;15325:74;;15408:93;15497:3;15408:93;:::i;:::-;15526:2;15521:3;15517:12;15510:19;;15169:366;;;:::o;15541:::-;15683:3;15704:67;15768:2;15763:3;15704:67;:::i;:::-;15697:74;;15780:93;15869:3;15780:93;:::i;:::-;15898:2;15893:3;15889:12;15882:19;;15541:366;;;:::o;15913:::-;16055:3;16076:67;16140:2;16135:3;16076:67;:::i;:::-;16069:74;;16152:93;16241:3;16152:93;:::i;:::-;16270:2;16265:3;16261:12;16254:19;;15913:366;;;:::o;16285:400::-;16445:3;16466:84;16548:1;16543:3;16466:84;:::i;:::-;16459:91;;16559:93;16648:3;16559:93;:::i;:::-;16677:1;16672:3;16668:11;16661:18;;16285:400;;;:::o;16691:366::-;16833:3;16854:67;16918:2;16913:3;16854:67;:::i;:::-;16847:74;;16930:93;17019:3;16930:93;:::i;:::-;17048:2;17043:3;17039:12;17032:19;;16691:366;;;:::o;17063:::-;17205:3;17226:67;17290:2;17285:3;17226:67;:::i;:::-;17219:74;;17302:93;17391:3;17302:93;:::i;:::-;17420:2;17415:3;17411:12;17404:19;;17063:366;;;:::o;17435:::-;17577:3;17598:67;17662:2;17657:3;17598:67;:::i;:::-;17591:74;;17674:93;17763:3;17674:93;:::i;:::-;17792:2;17787:3;17783:12;17776:19;;17435:366;;;:::o;17807:398::-;17966:3;17987:83;18068:1;18063:3;17987:83;:::i;:::-;17980:90;;18079:93;18168:3;18079:93;:::i;:::-;18197:1;18192:3;18188:11;18181:18;;17807:398;;;:::o;18211:366::-;18353:3;18374:67;18438:2;18433:3;18374:67;:::i;:::-;18367:74;;18450:93;18539:3;18450:93;:::i;:::-;18568:2;18563:3;18559:12;18552:19;;18211:366;;;:::o;18583:::-;18725:3;18746:67;18810:2;18805:3;18746:67;:::i;:::-;18739:74;;18822:93;18911:3;18822:93;:::i;:::-;18940:2;18935:3;18931:12;18924:19;;18583:366;;;:::o;18955:::-;19097:3;19118:67;19182:2;19177:3;19118:67;:::i;:::-;19111:74;;19194:93;19283:3;19194:93;:::i;:::-;19312:2;19307:3;19303:12;19296:19;;18955:366;;;:::o;19327:::-;19469:3;19490:67;19554:2;19549:3;19490:67;:::i;:::-;19483:74;;19566:93;19655:3;19566:93;:::i;:::-;19684:2;19679:3;19675:12;19668:19;;19327:366;;;:::o;19699:::-;19841:3;19862:67;19926:2;19921:3;19862:67;:::i;:::-;19855:74;;19938:93;20027:3;19938:93;:::i;:::-;20056:2;20051:3;20047:12;20040:19;;19699:366;;;:::o;20071:118::-;20158:24;20176:5;20158:24;:::i;:::-;20153:3;20146:37;20071:118;;:::o;20195:701::-;20476:3;20498:95;20589:3;20580:6;20498:95;:::i;:::-;20491:102;;20610:95;20701:3;20692:6;20610:95;:::i;:::-;20603:102;;20722:148;20866:3;20722:148;:::i;:::-;20715:155;;20887:3;20880:10;;20195:701;;;;;:::o;20902:379::-;21086:3;21108:147;21251:3;21108:147;:::i;:::-;21101:154;;21272:3;21265:10;;20902:379;;;:::o;21287:222::-;21380:4;21418:2;21407:9;21403:18;21395:26;;21431:71;21499:1;21488:9;21484:17;21475:6;21431:71;:::i;:::-;21287:222;;;;:::o;21515:640::-;21710:4;21748:3;21737:9;21733:19;21725:27;;21762:71;21830:1;21819:9;21815:17;21806:6;21762:71;:::i;:::-;21843:72;21911:2;21900:9;21896:18;21887:6;21843:72;:::i;:::-;21925;21993:2;21982:9;21978:18;21969:6;21925:72;:::i;:::-;22044:9;22038:4;22034:20;22029:2;22018:9;22014:18;22007:48;22072:76;22143:4;22134:6;22072:76;:::i;:::-;22064:84;;21515:640;;;;;;;:::o;22161:210::-;22248:4;22286:2;22275:9;22271:18;22263:26;;22299:65;22361:1;22350:9;22346:17;22337:6;22299:65;:::i;:::-;22161:210;;;;:::o;22377:313::-;22490:4;22528:2;22517:9;22513:18;22505:26;;22577:9;22571:4;22567:20;22563:1;22552:9;22548:17;22541:47;22605:78;22678:4;22669:6;22605:78;:::i;:::-;22597:86;;22377:313;;;;:::o;22696:419::-;22862:4;22900:2;22889:9;22885:18;22877:26;;22949:9;22943:4;22939:20;22935:1;22924:9;22920:17;22913:47;22977:131;23103:4;22977:131;:::i;:::-;22969:139;;22696:419;;;:::o;23121:::-;23287:4;23325:2;23314:9;23310:18;23302:26;;23374:9;23368:4;23364:20;23360:1;23349:9;23345:17;23338:47;23402:131;23528:4;23402:131;:::i;:::-;23394:139;;23121:419;;;:::o;23546:::-;23712:4;23750:2;23739:9;23735:18;23727:26;;23799:9;23793:4;23789:20;23785:1;23774:9;23770:17;23763:47;23827:131;23953:4;23827:131;:::i;:::-;23819:139;;23546:419;;;:::o;23971:::-;24137:4;24175:2;24164:9;24160:18;24152:26;;24224:9;24218:4;24214:20;24210:1;24199:9;24195:17;24188:47;24252:131;24378:4;24252:131;:::i;:::-;24244:139;;23971:419;;;:::o;24396:::-;24562:4;24600:2;24589:9;24585:18;24577:26;;24649:9;24643:4;24639:20;24635:1;24624:9;24620:17;24613:47;24677:131;24803:4;24677:131;:::i;:::-;24669:139;;24396:419;;;:::o;24821:::-;24987:4;25025:2;25014:9;25010:18;25002:26;;25074:9;25068:4;25064:20;25060:1;25049:9;25045:17;25038:47;25102:131;25228:4;25102:131;:::i;:::-;25094:139;;24821:419;;;:::o;25246:::-;25412:4;25450:2;25439:9;25435:18;25427:26;;25499:9;25493:4;25489:20;25485:1;25474:9;25470:17;25463:47;25527:131;25653:4;25527:131;:::i;:::-;25519:139;;25246:419;;;:::o;25671:::-;25837:4;25875:2;25864:9;25860:18;25852:26;;25924:9;25918:4;25914:20;25910:1;25899:9;25895:17;25888:47;25952:131;26078:4;25952:131;:::i;:::-;25944:139;;25671:419;;;:::o;26096:::-;26262:4;26300:2;26289:9;26285:18;26277:26;;26349:9;26343:4;26339:20;26335:1;26324:9;26320:17;26313:47;26377:131;26503:4;26377:131;:::i;:::-;26369:139;;26096:419;;;:::o;26521:::-;26687:4;26725:2;26714:9;26710:18;26702:26;;26774:9;26768:4;26764:20;26760:1;26749:9;26745:17;26738:47;26802:131;26928:4;26802:131;:::i;:::-;26794:139;;26521:419;;;:::o;26946:::-;27112:4;27150:2;27139:9;27135:18;27127:26;;27199:9;27193:4;27189:20;27185:1;27174:9;27170:17;27163:47;27227:131;27353:4;27227:131;:::i;:::-;27219:139;;26946:419;;;:::o;27371:::-;27537:4;27575:2;27564:9;27560:18;27552:26;;27624:9;27618:4;27614:20;27610:1;27599:9;27595:17;27588:47;27652:131;27778:4;27652:131;:::i;:::-;27644:139;;27371:419;;;:::o;27796:::-;27962:4;28000:2;27989:9;27985:18;27977:26;;28049:9;28043:4;28039:20;28035:1;28024:9;28020:17;28013:47;28077:131;28203:4;28077:131;:::i;:::-;28069:139;;27796:419;;;:::o;28221:::-;28387:4;28425:2;28414:9;28410:18;28402:26;;28474:9;28468:4;28464:20;28460:1;28449:9;28445:17;28438:47;28502:131;28628:4;28502:131;:::i;:::-;28494:139;;28221:419;;;:::o;28646:::-;28812:4;28850:2;28839:9;28835:18;28827:26;;28899:9;28893:4;28889:20;28885:1;28874:9;28870:17;28863:47;28927:131;29053:4;28927:131;:::i;:::-;28919:139;;28646:419;;;:::o;29071:::-;29237:4;29275:2;29264:9;29260:18;29252:26;;29324:9;29318:4;29314:20;29310:1;29299:9;29295:17;29288:47;29352:131;29478:4;29352:131;:::i;:::-;29344:139;;29071:419;;;:::o;29496:::-;29662:4;29700:2;29689:9;29685:18;29677:26;;29749:9;29743:4;29739:20;29735:1;29724:9;29720:17;29713:47;29777:131;29903:4;29777:131;:::i;:::-;29769:139;;29496:419;;;:::o;29921:::-;30087:4;30125:2;30114:9;30110:18;30102:26;;30174:9;30168:4;30164:20;30160:1;30149:9;30145:17;30138:47;30202:131;30328:4;30202:131;:::i;:::-;30194:139;;29921:419;;;:::o;30346:::-;30512:4;30550:2;30539:9;30535:18;30527:26;;30599:9;30593:4;30589:20;30585:1;30574:9;30570:17;30563:47;30627:131;30753:4;30627:131;:::i;:::-;30619:139;;30346:419;;;:::o;30771:::-;30937:4;30975:2;30964:9;30960:18;30952:26;;31024:9;31018:4;31014:20;31010:1;30999:9;30995:17;30988:47;31052:131;31178:4;31052:131;:::i;:::-;31044:139;;30771:419;;;:::o;31196:::-;31362:4;31400:2;31389:9;31385:18;31377:26;;31449:9;31443:4;31439:20;31435:1;31424:9;31420:17;31413:47;31477:131;31603:4;31477:131;:::i;:::-;31469:139;;31196:419;;;:::o;31621:::-;31787:4;31825:2;31814:9;31810:18;31802:26;;31874:9;31868:4;31864:20;31860:1;31849:9;31845:17;31838:47;31902:131;32028:4;31902:131;:::i;:::-;31894:139;;31621:419;;;:::o;32046:::-;32212:4;32250:2;32239:9;32235:18;32227:26;;32299:9;32293:4;32289:20;32285:1;32274:9;32270:17;32263:47;32327:131;32453:4;32327:131;:::i;:::-;32319:139;;32046:419;;;:::o;32471:::-;32637:4;32675:2;32664:9;32660:18;32652:26;;32724:9;32718:4;32714:20;32710:1;32699:9;32695:17;32688:47;32752:131;32878:4;32752:131;:::i;:::-;32744:139;;32471:419;;;:::o;32896:::-;33062:4;33100:2;33089:9;33085:18;33077:26;;33149:9;33143:4;33139:20;33135:1;33124:9;33120:17;33113:47;33177:131;33303:4;33177:131;:::i;:::-;33169:139;;32896:419;;;:::o;33321:::-;33487:4;33525:2;33514:9;33510:18;33502:26;;33574:9;33568:4;33564:20;33560:1;33549:9;33545:17;33538:47;33602:131;33728:4;33602:131;:::i;:::-;33594:139;;33321:419;;;:::o;33746:::-;33912:4;33950:2;33939:9;33935:18;33927:26;;33999:9;33993:4;33989:20;33985:1;33974:9;33970:17;33963:47;34027:131;34153:4;34027:131;:::i;:::-;34019:139;;33746:419;;;:::o;34171:::-;34337:4;34375:2;34364:9;34360:18;34352:26;;34424:9;34418:4;34414:20;34410:1;34399:9;34395:17;34388:47;34452:131;34578:4;34452:131;:::i;:::-;34444:139;;34171:419;;;:::o;34596:222::-;34689:4;34727:2;34716:9;34712:18;34704:26;;34740:71;34808:1;34797:9;34793:17;34784:6;34740:71;:::i;:::-;34596:222;;;;:::o;34824:129::-;34858:6;34885:20;;:::i;:::-;34875:30;;34914:33;34942:4;34934:6;34914:33;:::i;:::-;34824:129;;;:::o;34959:75::-;34992:6;35025:2;35019:9;35009:19;;34959:75;:::o;35040:307::-;35101:4;35191:18;35183:6;35180:30;35177:56;;;35213:18;;:::i;:::-;35177:56;35251:29;35273:6;35251:29;:::i;:::-;35243:37;;35335:4;35329;35325:15;35317:23;;35040:307;;;:::o;35353:308::-;35415:4;35505:18;35497:6;35494:30;35491:56;;;35527:18;;:::i;:::-;35491:56;35565:29;35587:6;35565:29;:::i;:::-;35557:37;;35649:4;35643;35639:15;35631:23;;35353:308;;;:::o;35667:98::-;35718:6;35752:5;35746:12;35736:22;;35667:98;;;:::o;35771:99::-;35823:6;35857:5;35851:12;35841:22;;35771:99;;;:::o;35876:168::-;35959:11;35993:6;35988:3;35981:19;36033:4;36028:3;36024:14;36009:29;;35876:168;;;;:::o;36050:147::-;36151:11;36188:3;36173:18;;36050:147;;;;:::o;36203:169::-;36287:11;36321:6;36316:3;36309:19;36361:4;36356:3;36352:14;36337:29;;36203:169;;;;:::o;36378:148::-;36480:11;36517:3;36502:18;;36378:148;;;;:::o;36532:305::-;36572:3;36591:20;36609:1;36591:20;:::i;:::-;36586:25;;36625:20;36643:1;36625:20;:::i;:::-;36620:25;;36779:1;36711:66;36707:74;36704:1;36701:81;36698:107;;;36785:18;;:::i;:::-;36698:107;36829:1;36826;36822:9;36815:16;;36532:305;;;;:::o;36843:185::-;36883:1;36900:20;36918:1;36900:20;:::i;:::-;36895:25;;36934:20;36952:1;36934:20;:::i;:::-;36929:25;;36973:1;36963:35;;36978:18;;:::i;:::-;36963:35;37020:1;37017;37013:9;37008:14;;36843:185;;;;:::o;37034:191::-;37074:4;37094:20;37112:1;37094:20;:::i;:::-;37089:25;;37128:20;37146:1;37128:20;:::i;:::-;37123:25;;37167:1;37164;37161:8;37158:34;;;37172:18;;:::i;:::-;37158:34;37217:1;37214;37210:9;37202:17;;37034:191;;;;:::o;37231:96::-;37268:7;37297:24;37315:5;37297:24;:::i;:::-;37286:35;;37231:96;;;:::o;37333:90::-;37367:7;37410:5;37403:13;37396:21;37385:32;;37333:90;;;:::o;37429:149::-;37465:7;37505:66;37498:5;37494:78;37483:89;;37429:149;;;:::o;37584:126::-;37621:7;37661:42;37654:5;37650:54;37639:65;;37584:126;;;:::o;37716:77::-;37753:7;37782:5;37771:16;;37716:77;;;:::o;37799:154::-;37883:6;37878:3;37873;37860:30;37945:1;37936:6;37931:3;37927:16;37920:27;37799:154;;;:::o;37959:307::-;38027:1;38037:113;38051:6;38048:1;38045:13;38037:113;;;38136:1;38131:3;38127:11;38121:18;38117:1;38112:3;38108:11;38101:39;38073:2;38070:1;38066:10;38061:15;;38037:113;;;38168:6;38165:1;38162:13;38159:101;;;38248:1;38239:6;38234:3;38230:16;38223:27;38159:101;38008:258;37959:307;;;:::o;38272:320::-;38316:6;38353:1;38347:4;38343:12;38333:22;;38400:1;38394:4;38390:12;38421:18;38411:81;;38477:4;38469:6;38465:17;38455:27;;38411:81;38539:2;38531:6;38528:14;38508:18;38505:38;38502:84;;;38558:18;;:::i;:::-;38502:84;38323:269;38272:320;;;:::o;38598:281::-;38681:27;38703:4;38681:27;:::i;:::-;38673:6;38669:40;38811:6;38799:10;38796:22;38775:18;38763:10;38760:34;38757:62;38754:88;;;38822:18;;:::i;:::-;38754:88;38862:10;38858:2;38851:22;38641:238;38598:281;;:::o;38885:233::-;38924:3;38947:24;38965:5;38947:24;:::i;:::-;38938:33;;38993:66;38986:5;38983:77;38980:103;;;39063:18;;:::i;:::-;38980:103;39110:1;39103:5;39099:13;39092:20;;38885:233;;;:::o;39124:176::-;39156:1;39173:20;39191:1;39173:20;:::i;:::-;39168:25;;39207:20;39225:1;39207:20;:::i;:::-;39202:25;;39246:1;39236:35;;39251:18;;:::i;:::-;39236:35;39292:1;39289;39285:9;39280:14;;39124:176;;;;:::o;39306:180::-;39354:77;39351:1;39344:88;39451:4;39448:1;39441:15;39475:4;39472:1;39465:15;39492:180;39540:77;39537:1;39530:88;39637:4;39634:1;39627:15;39661:4;39658:1;39651:15;39678:180;39726:77;39723:1;39716:88;39823:4;39820:1;39813:15;39847:4;39844:1;39837:15;39864:180;39912:77;39909:1;39902:88;40009:4;40006:1;39999:15;40033:4;40030:1;40023:15;40050:180;40098:77;40095:1;40088:88;40195:4;40192:1;40185:15;40219:4;40216:1;40209:15;40236:180;40284:77;40281:1;40274:88;40381:4;40378:1;40371:15;40405:4;40402:1;40395:15;40422:117;40531:1;40528;40521:12;40545:117;40654:1;40651;40644:12;40668:117;40777:1;40774;40767:12;40791:117;40900:1;40897;40890:12;40914:102;40955:6;41006:2;41002:7;40997:2;40990:5;40986:14;40982:28;40972:38;;40914:102;;;:::o;41022:168::-;41162:20;41158:1;41150:6;41146:14;41139:44;41022:168;:::o;41196:230::-;41336:34;41332:1;41324:6;41320:14;41313:58;41405:13;41400:2;41392:6;41388:15;41381:38;41196:230;:::o;41432:237::-;41572:34;41568:1;41560:6;41556:14;41549:58;41641:20;41636:2;41628:6;41624:15;41617:45;41432:237;:::o;41675:226::-;41815:34;41811:1;41803:6;41799:14;41792:58;41884:9;41879:2;41871:6;41867:15;41860:34;41675:226;:::o;41907:225::-;42047:34;42043:1;42035:6;42031:14;42024:58;42116:8;42111:2;42103:6;42099:15;42092:33;41907:225;:::o;42138:224::-;42278:34;42274:1;42266:6;42262:14;42255:58;42347:7;42342:2;42334:6;42330:15;42323:32;42138:224;:::o;42368:178::-;42508:30;42504:1;42496:6;42492:14;42485:54;42368:178;:::o;42552:223::-;42692:34;42688:1;42680:6;42676:14;42669:58;42761:6;42756:2;42748:6;42744:15;42737:31;42552:223;:::o;42781:175::-;42921:27;42917:1;42909:6;42905:14;42898:51;42781:175;:::o;42962:221::-;43102:34;43098:1;43090:6;43086:14;43079:58;43171:4;43166:2;43158:6;43154:15;43147:29;42962:221;:::o;43189:231::-;43329:34;43325:1;43317:6;43313:14;43306:58;43398:14;43393:2;43385:6;43381:15;43374:39;43189:231;:::o;43426:290::-;43566:34;43562:1;43554:6;43550:14;43543:58;43635:34;43630:2;43622:6;43618:15;43611:59;43704:4;43699:2;43691:6;43687:15;43680:29;43426:290;:::o;43722:174::-;43862:26;43858:1;43850:6;43846:14;43839:50;43722:174;:::o;43902:243::-;44042:34;44038:1;44030:6;44026:14;44019:58;44111:26;44106:2;44098:6;44094:15;44087:51;43902:243;:::o;44151:229::-;44291:34;44287:1;44279:6;44275:14;44268:58;44360:12;44355:2;44347:6;44343:15;44336:37;44151:229;:::o;44386:228::-;44526:34;44522:1;44514:6;44510:14;44503:58;44595:11;44590:2;44582:6;44578:15;44571:36;44386:228;:::o;44620:242::-;44760:34;44756:1;44748:6;44744:14;44737:58;44829:25;44824:2;44816:6;44812:15;44805:50;44620:242;:::o;44868:182::-;45008:34;45004:1;44996:6;44992:14;44985:58;44868:182;:::o;45056:::-;45196:34;45192:1;45184:6;45180:14;45173:58;45056:182;:::o;45244:231::-;45384:34;45380:1;45372:6;45368:14;45361:58;45453:14;45448:2;45440:6;45436:15;45429:39;45244:231;:::o;45481:155::-;45621:7;45617:1;45609:6;45605:14;45598:31;45481:155;:::o;45642:182::-;45782:34;45778:1;45770:6;45766:14;45759:58;45642:182;:::o;45830:234::-;45970:34;45966:1;45958:6;45954:14;45947:58;46039:17;46034:2;46026:6;46022:15;46015:42;45830:234;:::o;46070:220::-;46210:34;46206:1;46198:6;46194:14;46187:58;46279:3;46274:2;46266:6;46262:15;46255:28;46070:220;:::o;46296:114::-;;:::o;46416:236::-;46556:34;46552:1;46544:6;46540:14;46533:58;46625:19;46620:2;46612:6;46608:15;46601:44;46416:236;:::o;46658:231::-;46798:34;46794:1;46786:6;46782:14;46775:58;46867:14;46862:2;46854:6;46850:15;46843:39;46658:231;:::o;46895:168::-;47035:20;47031:1;47023:6;47019:14;47012:44;46895:168;:::o;47069:165::-;47209:17;47205:1;47197:6;47193:14;47186:41;47069:165;:::o;47240:229::-;47380:34;47376:1;47368:6;47364:14;47357:58;47449:12;47444:2;47436:6;47432:15;47425:37;47240:229;:::o;47475:122::-;47548:24;47566:5;47548:24;:::i;:::-;47541:5;47538:35;47528:63;;47587:1;47584;47577:12;47528:63;47475:122;:::o;47603:116::-;47673:21;47688:5;47673:21;:::i;:::-;47666:5;47663:32;47653:60;;47709:1;47706;47699:12;47653:60;47603:116;:::o;47725:120::-;47797:23;47814:5;47797:23;:::i;:::-;47790:5;47787:34;47777:62;;47835:1;47832;47825:12;47777:62;47725:120;:::o;47851:122::-;47924:24;47942:5;47924:24;:::i;:::-;47917:5;47914:35;47904:63;;47963:1;47960;47953:12;47904:63;47851:122;:::o

Swarm Source

ipfs://9c669fd59c622afc86bcd206c2466d5a9a20cc11c973e1cd01a6dddc9dc8d651
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.