ETH Price: $3,416.21 (+4.05%)

Shizuka (SHIZ)
 

Overview

TokenID

958

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
Shizuka

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// 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 v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









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

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

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

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

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

    // The number of tokens burned.
    uint128 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

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

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

            uint256 updatedIndex = startTokenId;

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

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

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

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/Shizuka.sol

/**
* SPDX-License-Identifier: UNLICENSED
*
*   ______________  _____               ______
*   __  ___/___  /_ ___(_)__________  _____  /________ _
*   _____ \ __  __ \__  / ___  /_  / / /__  //_/_  __ `/
*   ____/ / _  / / /_  /  __  /_/ /_/ / _  ,<   / /_/ /
*   /____/  /_/ /_/ /_/   _____/\__,_/  /_/|_|  \__,_/
*
*                 -- Shizuka NFT --
*
*   @author hemlock_dev@
*   @date   Feb 2022
*
*   Used for minting Shizuka NFT, based on the ERC721A standard
*   Coded with ♥ in rainy Vancouver, BC
*/
pragma solidity 0.8.4;






contract Shizuka is Ownable, ERC721A, ReentrancyGuard {

    uint256 public immutable maxBatchSize;
    uint256 public immutable amountForDevs;
    uint256 public immutable collectionSize;

    struct SaleConfig {
        uint32 allowlistSaleStartTime;
        uint32 publicSaleStartTime;
        uint32 mintEndTime;
        uint64 mintPrice;
        uint32 publicSaleKey;
    }

    SaleConfig public saleConfig;

    mapping(address => uint256) public _allowlistClaimed;

    constructor(
        uint256 maxBatchSize_,
        uint256 collectionSize_,
        uint256 amountForDevs_,
        uint32 publicSaleKey_,
        uint64 mintPriceWei_,
        uint32 allowlistSaleStartTime_,
        uint32 publicSaleStartTime_,
        uint32 mintEndTime_
    ) ERC721A("Shizuka", "SHIZ") {
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
        require(amountForDevs_ <= collectionSize_, "CollectionSizeTooSmall");
        amountForDevs = amountForDevs_;
        saleConfig = SaleConfig(
            allowlistSaleStartTime_,
            publicSaleStartTime_,
            mintEndTime_,
            mintPriceWei_,
            publicSaleKey_
        );
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "CallerIsAnotherContract");
        _;
    }

    function allowlistMint(bytes32 hash, bytes calldata signature, uint256 quantity, uint256 whitelistLimit)
    external
    payable
    nonReentrant
    callerIsUser
    {
        require(_verify(hash, signature), "InvalidSignature");
        require(_hashRegisterForAllowlistWithAmount(msg.sender, whitelistLimit) == hash, "InvalidHash");
        require(_allowlistClaimed[msg.sender] + quantity <= whitelistLimit, "MintAmountGreaterThanAllowed");

        SaleConfig memory config = saleConfig;
        uint256 allowlistPrice = uint256(config.mintPrice);
        uint256 allowlistSaleStartTime = uint256(config.allowlistSaleStartTime);
        uint256 saleEndTime = uint256(config.mintEndTime);
        require(isAllowlistSaleOn(allowlistSaleStartTime, saleEndTime), "AllowlistSaleOffline");

        _allowlistClaimed[msg.sender] += quantity;
        _validateMint(allowlistPrice, quantity);
        _safeMint(msg.sender, quantity);
    }

    function _hashRegisterForAllowlistWithAmount(address _address, uint256 amount) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(amount, _address));
    }

    function _verify(bytes32 hash, bytes memory signature) internal view returns (bool) {
        return (_recover(hash, signature) == owner());
    }

    function _recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        bytes32 messageDigest = keccak256(abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                hash
        ));
        return ECDSA.recover(messageDigest, signature);
    }

    function publicSaleMint(uint256 quantity, uint256 callerPublicSaleKey)
    external
    payable
    nonReentrant
    callerIsUser
    {
        SaleConfig memory config = saleConfig;
        uint256 publicSaleKey = uint256(config.publicSaleKey);
        uint256 publicPrice = uint256(config.mintPrice);
        uint256 publicSaleStartTime = uint256(config.publicSaleStartTime);
        uint256 publicSaleEndTime = uint256(config.mintEndTime);

        require(publicSaleKey == callerPublicSaleKey, "BadPublicKey");
        require(isPublicSaleOn(publicSaleKey, publicSaleStartTime, publicSaleEndTime), "PublicSaleOffline");

        _validateMint(publicPrice, quantity);
        _safeMint(msg.sender, quantity);
    }

    function _validateMint(uint256 price, uint256 quantity) private {
        require(msg.value >= (price * quantity), "NotEnoughEth");
        require(quantity <= maxBatchSize, "MintAmountGreaterThanAllowed");
        require(totalSupply() + quantity <= collectionSize, "MaxSupplyReached");
    }

    function isPublicSaleOn(
        uint256 publicSaleKey,
        uint256 publicSaleStartTime,
        uint256 mintEndTime
    ) public view returns (bool) {
        return
        publicSaleKey != 0 &&
        block.timestamp >= publicSaleStartTime &&
        block.timestamp < mintEndTime;
    }

    function isAllowlistSaleOn(
        uint256 allowlistSaleStartTime,
        uint256 mintEndTime
    ) public view returns (bool) {
        return
        block.timestamp >= allowlistSaleStartTime &&
        block.timestamp < mintEndTime;
    }

    function setAllowlistSaleStartTime(uint32 timestamp) external onlyOwner {
        saleConfig.allowlistSaleStartTime = timestamp;
    }

    function setPublicSaleStartTime(uint32 timestamp) external onlyOwner {
        saleConfig.publicSaleStartTime = timestamp;
    }

    function setPublicSaleKey(uint32 key) external onlyOwner {
        saleConfig.publicSaleKey = key;
    }

    function setMintEndTime(uint32 timestamp) external onlyOwner {
        saleConfig.mintEndTime = timestamp;
    }

    function setMintPrice(uint64 price) external onlyOwner {
        saleConfig.mintPrice = price;
    }

    function devMint(uint256 quantity) external onlyOwner {
        require(totalSupply() + quantity <= collectionSize, "MaxSupplyReached");
        require(numberMinted(msg.sender) + quantity <= amountForDevs, "MaxDevMintReached");
        uint256 numChunks = quantity / maxBatchSize;
        for (uint256 i = 0; i < numChunks; i++) {
            _safeMint(msg.sender, maxBatchSize);
        }
    }

    // Used for reveal : set base uri to ipfs link
    string private _baseTokenURI;

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

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

    function withdrawMoney() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "TransactionFailure");
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"},{"internalType":"uint32","name":"publicSaleKey_","type":"uint32"},{"internalType":"uint64","name":"mintPriceWei_","type":"uint64"},{"internalType":"uint32","name":"allowlistSaleStartTime_","type":"uint32"},{"internalType":"uint32","name":"publicSaleStartTime_","type":"uint32"},{"internalType":"uint32","name":"mintEndTime_","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_allowlistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"whitelistLimit","type":"uint256"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"amountForDevs","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":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"allowlistSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"mintEndTime","type":"uint256"}],"name":"isAllowlistSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicSaleKey","type":"uint256"},{"internalType":"uint256","name":"publicSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"mintEndTime","type":"uint256"}],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"callerPublicSaleKey","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint32","name":"allowlistSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"mintEndTime","type":"uint32"},{"internalType":"uint64","name":"mintPrice","type":"uint64"},{"internalType":"uint32","name":"publicSaleKey","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setAllowlistSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setMintEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"price","type":"uint64"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"key","type":"uint32"}],"name":"setPublicSaleKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setPublicSaleStartTime","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":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040523480156200001157600080fd5b5060405162005e0e38038062005e0e833981810160405281019062000037919062000445565b6040518060400160405280600781526020017f5368697a756b61000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5348495a00000000000000000000000000000000000000000000000000000000815250620000c3620000b76200028460201b60201c565b6200028c60201b60201c565b8160029080519060200190620000db92919062000350565b508060039080519060200190620000f492919062000350565b505050600160088190555087608081815250508660c081815250508686111562000155576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014c906200052f565b60405180910390fd5b8560a081815250506040518060a001604052808463ffffffff1681526020018363ffffffff1681526020018263ffffffff1681526020018567ffffffffffffffff1681526020018663ffffffff16815250600960008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555090505050505050505050506200066c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200035e9062000590565b90600052602060002090601f016020900481019282620003825760008555620003ce565b82601f106200039d57805160ff1916838001178555620003ce565b82800160010185558215620003ce579182015b82811115620003cd578251825591602001919060010190620003b0565b5b509050620003dd9190620003e1565b5090565b5b80821115620003fc576000816000905550600101620003e2565b5090565b60008151905062000411816200061e565b92915050565b600081519050620004288162000638565b92915050565b6000815190506200043f8162000652565b92915050565b600080600080600080600080610100898b0312156200046357600080fd5b6000620004738b828c0162000400565b9850506020620004868b828c0162000400565b9750506040620004998b828c0162000400565b9650506060620004ac8b828c0162000417565b9550506080620004bf8b828c016200042e565b94505060a0620004d28b828c0162000417565b93505060c0620004e58b828c0162000417565b92505060e0620004f88b828c0162000417565b9150509295985092959890939650565b60006200051760168362000551565b91506200052482620005f5565b602082019050919050565b600060208201905081810360008301526200054a8162000508565b9050919050565b600082825260208201905092915050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b60006002820490506001821680620005a957607f821691505b60208210811415620005c057620005bf620005c6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f436f6c6c656374696f6e53697a65546f6f536d616c6c00000000000000000000600082015250565b620006298162000562565b81146200063557600080fd5b50565b62000643816200056c565b81146200064f57600080fd5b50565b6200065d816200057c565b81146200066957600080fd5b50565b60805160a05160c051615748620006c66000396000818161104a015281816111f8015261340f0152600081816110bf0152612535015260008181610cff015281816111370152818161117401526133ac01526157486000f3fe6080604052600436106102255760003560e01c806369dfeb9a11610123578063ac446002116100ab578063dc33e6811161006f578063dc33e68114610830578063dd98c69f1461086d578063e985e9c514610889578063f2fde38b146108c6578063fbe1aa51146108ef57610225565b8063ac4460021461076e578063b88d4fde14610785578063c87b56dd146107ae578063cb91d8b3146107eb578063d6c6a4cc1461080757610225565b806390028083116100f2578063900280831461068557806390aa0b0f146106ae5780639231ab2a146106dd57806395d89b411461071a578063a22cb4651461074557610225565b806369dfeb9a146105dd57806370a0823114610606578063715018a6146106435780638da5cb5b1461065a57610225565b806332c314e1116101b15780634f6ccce7116101755780634f6ccce7146104d457806355f804b31461051157806358180e341461053a5780635fd84c28146105775780636352211e146105a057610225565b806332c314e1146103f1578063375a069a1461041a578063422030ba1461044357806342842e0e1461048057806345c0f533146104a957610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd14610323578063249b00a11461034c5780632913daa0146103895780632f745c59146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190614402565b61091a565b60405161025e9190614b0d565b60405180910390f35b34801561027357600080fd5b5061027c610a64565b6040516102899190614b6d565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190614499565b610af6565b6040516102c69190614aa6565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190614346565b610b72565b005b34801561030457600080fd5b5061030d610c7d565b60405161031a9190614dea565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190614240565b610cd5565b005b34801561035857600080fd5b50610373600480360381019061036e91906141db565b610ce5565b6040516103809190614dea565b60405180910390f35b34801561039557600080fd5b5061039e610cfd565b6040516103ab9190614dea565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190614346565b610d21565b6040516103e89190614dea565b60405180910390f35b3480156103fd57600080fd5b506104186004803603810190610413919061454d565b610f29565b005b34801561042657600080fd5b50610441600480360381019061043c9190614499565b610fcc565b005b34801561044f57600080fd5b5061046a600480360381019061046591906144fe565b6111b0565b6040516104779190614b0d565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190614240565b6111d6565b005b3480156104b557600080fd5b506104be6111f6565b6040516104cb9190614dea565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190614499565b61121a565b6040516105089190614dea565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190614454565b61138d565b005b34801561054657600080fd5b50610561600480360381019061055c91906144c2565b61141f565b60405161056e9190614b0d565b60405180910390f35b34801561058357600080fd5b5061059e6004803603810190610599919061454d565b611438565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190614499565b6114db565b6040516105d49190614aa6565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190614576565b6114f1565b005b34801561061257600080fd5b5061062d600480360381019061062891906141db565b61159c565b60405161063a9190614dea565b60405180910390f35b34801561064f57600080fd5b5061065861166c565b005b34801561066657600080fd5b5061066f6116f4565b60405161067c9190614aa6565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a7919061454d565b61171d565b005b3480156106ba57600080fd5b506106c36117c0565b6040516106d4959493929190614e05565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190614499565b611838565b6040516107119190614dcf565b60405180910390f35b34801561072657600080fd5b5061072f611850565b60405161073c9190614b6d565b60405180910390f35b34801561075157600080fd5b5061076c6004803603810190610767919061430a565b6118e2565b005b34801561077a57600080fd5b50610783611a5a565b005b34801561079157600080fd5b506107ac60048036038101906107a7919061428f565b611b85565b005b3480156107ba57600080fd5b506107d560048036038101906107d09190614499565b611bd8565b6040516107e29190614b6d565b60405180910390f35b610805600480360381019061080091906144c2565b611c77565b005b34801561081357600080fd5b5061082e6004803603810190610829919061454d565b611eff565b005b34801561083c57600080fd5b50610857600480360381019061085291906141db565b611fa2565b6040516108649190614dea565b60405180910390f35b61088760048036038101906108829190614382565b611fb4565b005b34801561089557600080fd5b506108b060048036038101906108ab9190614204565b6123a7565b6040516108bd9190614b0d565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906141db565b61243b565b005b3480156108fb57600080fd5b50610904612533565b6040516109119190614dea565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4d57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5d5750610a5c82612557565b5b9050919050565b606060028054610a7390615102565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90615102565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b5050505050905090565b6000610b01826125c1565b610b37576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7d826114db565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610be5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0461262a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c365750610c3481610c2f61262a565b6123a7565b155b15610c6d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c78838383612632565b505050565b6000600160109054906101000a90046fffffffffffffffffffffffffffffffff16600160009054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610ce08383836126e4565b505050565b600a6020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610d2c8361159c565b8210610d64576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f1d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e7c5750610f10565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ebc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f0e5786841415610f05578195505050505050610f23565b83806001019450505b505b8080600101915050610d9f565b50600080fd5b92915050565b610f3161262a565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90614d0f565b60405180910390fd5b80600960000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b610fd461262a565b73ffffffffffffffffffffffffffffffffffffffff16610ff26116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90614d0f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611072610c7d565b61107c9190614efc565b11156110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b490614baf565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816110e833611fa2565b6110f29190614efc565b1115611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90614daf565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000826111619190614f52565b905060005b818110156111ab57611198337f0000000000000000000000000000000000000000000000000000000000000000612c03565b80806111a390615165565b915050611166565b505050565b60008084141580156111c25750824210155b80156111cd57508142105b90509392505050565b6111f183838360405180602001604052806000815250611b85565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611355576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611347578583141561133e5781945050505050611388565b82806001019350505b508080600101915050611254565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61139561262a565b73ffffffffffffffffffffffffffffffffffffffff166113b36116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614d0f565b60405180910390fd5b8181600b919061141a929190613f51565b505050565b600082421015801561143057508142105b905092915050565b61144061262a565b73ffffffffffffffffffffffffffffffffffffffff1661145e6116f4565b73ffffffffffffffffffffffffffffffffffffffff16146114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90614d0f565b60405180910390fd5b80600960000160046101000a81548163ffffffff021916908363ffffffff16021790555050565b60006114e682612c21565b600001519050919050565b6114f961262a565b73ffffffffffffffffffffffffffffffffffffffff166115176116f4565b73ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614d0f565b60405180910390fd5b806009600001600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611604576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61167461262a565b73ffffffffffffffffffffffffffffffffffffffff166116926116f4565b73ffffffffffffffffffffffffffffffffffffffff16146116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df90614d0f565b60405180910390fd5b6116f26000612ecb565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61172561262a565b73ffffffffffffffffffffffffffffffffffffffff166117436116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614d0f565b60405180910390fd5b80600960000160146101000a81548163ffffffff021916908363ffffffff16021790555050565b60098060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16908060000160089054906101000a900463ffffffff169080600001600c9054906101000a900467ffffffffffffffff16908060000160149054906101000a900463ffffffff16905085565b611840613fd7565b61184982612c21565b9050919050565b60606003805461185f90615102565b80601f016020809104026020016040519081016040528092919081815260200182805461188b90615102565b80156118d85780601f106118ad576101008083540402835291602001916118d8565b820191906000526020600020905b8154815290600101906020018083116118bb57829003601f168201915b5050505050905090565b6118ea61262a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561194f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061195c61262a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a0961262a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a4e9190614b0d565b60405180910390a35050565b611a6261262a565b73ffffffffffffffffffffffffffffffffffffffff16611a806116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd90614d0f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611afc90614a65565b60006040518083038185875af1925050503d8060008114611b39576040519150601f19603f3d011682016040523d82523d6000602084013e611b3e565b606091505b5050905080611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614caf565b60405180910390fd5b50565b611b908484846126e4565b611b9c84848484612f8f565b611bd2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611be3826125c1565b611c19576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2361311d565b9050600081511415611c445760405180602001604052806000815250611c6f565b80611c4e846131af565b604051602001611c5f929190614a1b565b6040516020818303038152906040525b915050919050565b60026008541415611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490614d6f565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90614d8f565b60405180910390fd5b600060096040518060a00160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000816080015163ffffffff1690506000826060015167ffffffffffffffff1690506000836020015163ffffffff1690506000846040015163ffffffff169050858414611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790614c0f565b60405180910390fd5b611e9b8483836111b0565b611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed190614c6f565b60405180910390fd5b611ee4838861335c565b611eee3388612c03565b505050505060016008819055505050565b611f0761262a565b73ffffffffffffffffffffffffffffffffffffffff16611f256116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614d0f565b60405180910390fd5b80600960000160086101000a81548163ffffffff021916908363ffffffff16021790555050565b6000611fad82613486565b9050919050565b60026008541415611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff190614d6f565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614d8f565b60405180910390fd5b6120be8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613556565b6120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490614c4f565b60405180910390fd5b84612108338361359f565b14612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f90614d4f565b60405180910390fd5b8082600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121949190614efc565b11156121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614cef565b60405180910390fd5b600060096040518060a00160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000816060015167ffffffffffffffff1690506000826000015163ffffffff1690506000836040015163ffffffff1690506122eb828261141f565b61232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232190614bcf565b60405180910390fd5b85600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123799190614efc565b9250508190555061238a838761335c565b6123943387612c03565b5050505060016008819055505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61244361262a565b73ffffffffffffffffffffffffffffffffffffffff166124616116f4565b73ffffffffffffffffffffffffffffffffffffffff16146124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae90614d0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e90614c2f565b60405180910390fd5b61253081612ecb565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612623575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126ef82612c21565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661271661262a565b73ffffffffffffffffffffffffffffffffffffffff1614806127495750612748826000015161274361262a565b6123a7565b5b8061278e575061275761262a565b73ffffffffffffffffffffffffffffffffffffffff1661277684610af6565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127c7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612830576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612897576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a485858560016135d2565b6128b46000848460000151612632565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b9357600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612b925782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfc85858560016135d8565b5050505050565b612c1d8282604051806020016040528060008152506135de565b5050565b612c29613fd7565b6000829050600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612e94576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d76578092505050612ec6565b5b600115612e9157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e8c578092505050612ec6565b612d77565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612fb08473ffffffffffffffffffffffffffffffffffffffff166135f0565b15613110578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fd961262a565b8786866040518563ffffffff1660e01b8152600401612ffb9493929190614ac1565b602060405180830381600087803b15801561301557600080fd5b505af192505050801561304657506040513d601f19601f82011682018060405250810190613043919061442b565b60015b6130c0573d8060008114613076576040519150601f19603f3d011682016040523d82523d6000602084013e61307b565b606091505b506000815114156130b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613115565b600190505b949350505050565b6060600b805461312c90615102565b80601f016020809104026020016040519081016040528092919081815260200182805461315890615102565b80156131a55780601f1061317a576101008083540402835291602001916131a5565b820191906000526020600020905b81548152906001019060200180831161318857829003601f168201915b5050505050905090565b606060008214156131f7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613357565b600082905060005b6000821461322957808061321290615165565b915050600a826132229190614f52565b91506131ff565b60008167ffffffffffffffff81111561326b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561329d5781602001600182028036833780820191505090505b5090505b60008514613350576001826132b69190614fdd565b9150600a856132c591906151e6565b60306132d19190614efc565b60f81b81838151811061330d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133499190614f52565b94506132a1565b8093505050505b919050565b80826133689190614f83565b3410156133aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a190614d2f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081111561340d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340490614cef565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081613437610c7d565b6134419190614efc565b1115613482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347990614baf565b60405180910390fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ee576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60006135606116f4565b73ffffffffffffffffffffffffffffffffffffffff166135808484613613565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600081836040516020016135b4929190614a7a565b60405160208183030381529060405280519060200120905092915050565b50505050565b50505050565b6135eb8383836001613652565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080836040516020016136279190614a3f565b60405160208183030381529060405280519060200120905061364981846139ea565b91505092915050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136ee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613729576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61373660008683876135d2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561399b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561394f575061394d6000888488612f8f565b155b15613986576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506138d4565b5080600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506139e360008683876135d8565b5050505050565b60008060006139f98585613a11565b91509150613a0681613a94565b819250505092915050565b600080604183511415613a535760008060006020860151925060408601519150606086015160001a9050613a4787828585613de5565b94509450505050613a8d565b604083511415613a84576000806020850151915060408501519050613a79868383613ef2565b935093505050613a8d565b60006002915091505b9250929050565b60006004811115613ace577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613b07577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613b1257613de2565b60016004811115613b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613b85577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bbd90614b8f565b60405180910390fd5b60026004811115613c00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c7190614bef565b60405180910390fd5b60036004811115613cb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2590614c8f565b60405180910390fd5b600480811115613d67577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613da0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd890614ccf565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613e20576000600391509150613ee9565b601b8560ff1614158015613e385750601c8560ff1614155b15613e4a576000600491509150613ee9565b600060018787878760405160008152602001604052604051613e6f9493929190614b28565b6020604051602081039080840390855afa158015613e91573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613ee057600060019250925050613ee9565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613f359190614efc565b9050613f4387828885613de5565b935093505050935093915050565b828054613f5d90615102565b90600052602060002090601f016020900481019282613f7f5760008555613fc6565b82601f10613f9857803560ff1916838001178555613fc6565b82800160010185558215613fc6579182015b82811115613fc5578235825591602001919060010190613faa565b5b509050613fd3919061401a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561403357600081600090555060010161401b565b5090565b600061404a61404584614e7d565b614e58565b90508281526020810184848401111561406257600080fd5b61406d8482856150c0565b509392505050565b60008135905061408481615671565b92915050565b60008135905061409981615688565b92915050565b6000813590506140ae8161569f565b92915050565b6000813590506140c3816156b6565b92915050565b6000815190506140d8816156b6565b92915050565b60008083601f8401126140f057600080fd5b8235905067ffffffffffffffff81111561410957600080fd5b60208301915083600182028301111561412157600080fd5b9250929050565b600082601f83011261413957600080fd5b8135614149848260208601614037565b91505092915050565b60008083601f84011261416457600080fd5b8235905067ffffffffffffffff81111561417d57600080fd5b60208301915083600182028301111561419557600080fd5b9250929050565b6000813590506141ab816156cd565b92915050565b6000813590506141c0816156e4565b92915050565b6000813590506141d5816156fb565b92915050565b6000602082840312156141ed57600080fd5b60006141fb84828501614075565b91505092915050565b6000806040838503121561421757600080fd5b600061422585828601614075565b925050602061423685828601614075565b9150509250929050565b60008060006060848603121561425557600080fd5b600061426386828701614075565b935050602061427486828701614075565b92505060406142858682870161419c565b9150509250925092565b600080600080608085870312156142a557600080fd5b60006142b387828801614075565b94505060206142c487828801614075565b93505060406142d58782880161419c565b925050606085013567ffffffffffffffff8111156142f257600080fd5b6142fe87828801614128565b91505092959194509250565b6000806040838503121561431d57600080fd5b600061432b85828601614075565b925050602061433c8582860161408a565b9150509250929050565b6000806040838503121561435957600080fd5b600061436785828601614075565b92505060206143788582860161419c565b9150509250929050565b60008060008060006080868803121561439a57600080fd5b60006143a88882890161409f565b955050602086013567ffffffffffffffff8111156143c557600080fd5b6143d1888289016140de565b945094505060406143e48882890161419c565b92505060606143f58882890161419c565b9150509295509295909350565b60006020828403121561441457600080fd5b6000614422848285016140b4565b91505092915050565b60006020828403121561443d57600080fd5b600061444b848285016140c9565b91505092915050565b6000806020838503121561446757600080fd5b600083013567ffffffffffffffff81111561448157600080fd5b61448d85828601614152565b92509250509250929050565b6000602082840312156144ab57600080fd5b60006144b98482850161419c565b91505092915050565b600080604083850312156144d557600080fd5b60006144e38582860161419c565b92505060206144f48582860161419c565b9150509250929050565b60008060006060848603121561451357600080fd5b60006145218682870161419c565b93505060206145328682870161419c565b92505060406145438682870161419c565b9150509250925092565b60006020828403121561455f57600080fd5b600061456d848285016141b1565b91505092915050565b60006020828403121561458857600080fd5b6000614596848285016141c6565b91505092915050565b6145a881615011565b82525050565b6145b781615011565b82525050565b6145ce6145c982615011565b6151ae565b82525050565b6145dd81615023565b82525050565b6145ec81615023565b82525050565b6145fb8161502f565b82525050565b61461261460d8261502f565b6151c0565b82525050565b600061462382614eae565b61462d8185614ec4565b935061463d8185602086016150cf565b614646816152d3565b840191505092915050565b600061465c82614eb9565b6146668185614ee0565b93506146768185602086016150cf565b61467f816152d3565b840191505092915050565b600061469582614eb9565b61469f8185614ef1565b93506146af8185602086016150cf565b80840191505092915050565b60006146c8601883614ee0565b91506146d3826152f1565b602082019050919050565b60006146eb601083614ee0565b91506146f68261531a565b602082019050919050565b600061470e601483614ee0565b915061471982615343565b602082019050919050565b6000614731601f83614ee0565b915061473c8261536c565b602082019050919050565b6000614754601c83614ef1565b915061475f82615395565b601c82019050919050565b6000614777600c83614ee0565b9150614782826153be565b602082019050919050565b600061479a602683614ee0565b91506147a5826153e7565b604082019050919050565b60006147bd601083614ee0565b91506147c882615436565b602082019050919050565b60006147e0601183614ee0565b91506147eb8261545f565b602082019050919050565b6000614803602283614ee0565b915061480e82615488565b604082019050919050565b6000614826601283614ee0565b9150614831826154d7565b602082019050919050565b6000614849602283614ee0565b915061485482615500565b604082019050919050565b600061486c601c83614ee0565b91506148778261554f565b602082019050919050565b600061488f602083614ee0565b915061489a82615578565b602082019050919050565b60006148b2600c83614ee0565b91506148bd826155a1565b602082019050919050565b60006148d5600083614ed5565b91506148e0826155ca565b600082019050919050565b60006148f8600b83614ee0565b9150614903826155cd565b602082019050919050565b600061491b601f83614ee0565b9150614926826155f6565b602082019050919050565b600061493e601783614ee0565b91506149498261561f565b602082019050919050565b6000614961601183614ee0565b915061496c82615648565b602082019050919050565b60608201600082015161498d600085018261459f565b5060208201516149a060208501826149ee565b5060408201516149b360408501826145d4565b50505050565b6149c281615085565b82525050565b6149d96149d482615085565b6151dc565b82525050565b6149e88161508f565b82525050565b6149f78161509f565b82525050565b614a068161509f565b82525050565b614a15816150b3565b82525050565b6000614a27828561468a565b9150614a33828461468a565b91508190509392505050565b6000614a4a82614747565b9150614a568284614601565b60208201915081905092915050565b6000614a70826148c8565b9150819050919050565b6000614a8682856149c8565b602082019150614a9682846145bd565b6014820191508190509392505050565b6000602082019050614abb60008301846145ae565b92915050565b6000608082019050614ad660008301876145ae565b614ae360208301866145ae565b614af060408301856149b9565b8181036060830152614b028184614618565b905095945050505050565b6000602082019050614b2260008301846145e3565b92915050565b6000608082019050614b3d60008301876145f2565b614b4a6020830186614a0c565b614b5760408301856145f2565b614b6460608301846145f2565b95945050505050565b60006020820190508181036000830152614b878184614651565b905092915050565b60006020820190508181036000830152614ba8816146bb565b9050919050565b60006020820190508181036000830152614bc8816146de565b9050919050565b60006020820190508181036000830152614be881614701565b9050919050565b60006020820190508181036000830152614c0881614724565b9050919050565b60006020820190508181036000830152614c288161476a565b9050919050565b60006020820190508181036000830152614c488161478d565b9050919050565b60006020820190508181036000830152614c68816147b0565b9050919050565b60006020820190508181036000830152614c88816147d3565b9050919050565b60006020820190508181036000830152614ca8816147f6565b9050919050565b60006020820190508181036000830152614cc881614819565b9050919050565b60006020820190508181036000830152614ce88161483c565b9050919050565b60006020820190508181036000830152614d088161485f565b9050919050565b60006020820190508181036000830152614d2881614882565b9050919050565b60006020820190508181036000830152614d48816148a5565b9050919050565b60006020820190508181036000830152614d68816148eb565b9050919050565b60006020820190508181036000830152614d888161490e565b9050919050565b60006020820190508181036000830152614da881614931565b9050919050565b60006020820190508181036000830152614dc881614954565b9050919050565b6000606082019050614de46000830184614977565b92915050565b6000602082019050614dff60008301846149b9565b92915050565b600060a082019050614e1a60008301886149df565b614e2760208301876149df565b614e3460408301866149df565b614e4160608301856149fd565b614e4e60808301846149df565b9695505050505050565b6000614e62614e73565b9050614e6e8282615134565b919050565b6000604051905090565b600067ffffffffffffffff821115614e9857614e976152a4565b5b614ea1826152d3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f0782615085565b9150614f1283615085565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f4757614f46615217565b5b828201905092915050565b6000614f5d82615085565b9150614f6883615085565b925082614f7857614f77615246565b5b828204905092915050565b6000614f8e82615085565b9150614f9983615085565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fd257614fd1615217565b5b828202905092915050565b6000614fe882615085565b9150614ff383615085565b92508282101561500657615005615217565b5b828203905092915050565b600061501c82615065565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156150ed5780820151818401526020810190506150d2565b838111156150fc576000848401525b50505050565b6000600282049050600182168061511a57607f821691505b6020821081141561512e5761512d615275565b5b50919050565b61513d826152d3565b810181811067ffffffffffffffff8211171561515c5761515b6152a4565b5b80604052505050565b600061517082615085565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151a3576151a2615217565b5b600182019050919050565b60006151b9826151ca565b9050919050565b6000819050919050565b60006151d5826152e4565b9050919050565b6000819050919050565b60006151f182615085565b91506151fc83615085565b92508261520c5761520b615246565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d6178537570706c795265616368656400000000000000000000000000000000600082015250565b7f416c6c6f776c69737453616c654f66666c696e65000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4261645075626c69634b65790000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69645369676e617475726500000000000000000000000000000000600082015250565b7f5075626c696353616c654f66666c696e65000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e4661696c7572650000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74416d6f756e74477265617465725468616e416c6c6f77656400000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f74456e6f7567684574680000000000000000000000000000000000000000600082015250565b50565b7f496e76616c696448617368000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f43616c6c65724973416e6f74686572436f6e7472616374000000000000000000600082015250565b7f4d61784465764d696e7452656163686564000000000000000000000000000000600082015250565b61567a81615011565b811461568557600080fd5b50565b61569181615023565b811461569c57600080fd5b50565b6156a88161502f565b81146156b357600080fd5b50565b6156bf81615039565b81146156ca57600080fd5b50565b6156d681615085565b81146156e157600080fd5b50565b6156ed8161508f565b81146156f857600080fd5b50565b6157048161509f565b811461570f57600080fd5b5056fea2646970667358221220ec386747b33cad7040990992a0887a3c4c94944c2e93ce4cbd448c014cfe11bc64736f6c63430008040033000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000022b8000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aa535d3d0c000000000000000000000000000000000000000000000000000000000000621d37d000000000000000000000000000000000000000000000000000000000621e895000000000000000000000000000000000000000000000000000000000621fdad0

Deployed Bytecode

0x6080604052600436106102255760003560e01c806369dfeb9a11610123578063ac446002116100ab578063dc33e6811161006f578063dc33e68114610830578063dd98c69f1461086d578063e985e9c514610889578063f2fde38b146108c6578063fbe1aa51146108ef57610225565b8063ac4460021461076e578063b88d4fde14610785578063c87b56dd146107ae578063cb91d8b3146107eb578063d6c6a4cc1461080757610225565b806390028083116100f2578063900280831461068557806390aa0b0f146106ae5780639231ab2a146106dd57806395d89b411461071a578063a22cb4651461074557610225565b806369dfeb9a146105dd57806370a0823114610606578063715018a6146106435780638da5cb5b1461065a57610225565b806332c314e1116101b15780634f6ccce7116101755780634f6ccce7146104d457806355f804b31461051157806358180e341461053a5780635fd84c28146105775780636352211e146105a057610225565b806332c314e1146103f1578063375a069a1461041a578063422030ba1461044357806342842e0e1461048057806345c0f533146104a957610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd14610323578063249b00a11461034c5780632913daa0146103895780632f745c59146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190614402565b61091a565b60405161025e9190614b0d565b60405180910390f35b34801561027357600080fd5b5061027c610a64565b6040516102899190614b6d565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190614499565b610af6565b6040516102c69190614aa6565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190614346565b610b72565b005b34801561030457600080fd5b5061030d610c7d565b60405161031a9190614dea565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190614240565b610cd5565b005b34801561035857600080fd5b50610373600480360381019061036e91906141db565b610ce5565b6040516103809190614dea565b60405180910390f35b34801561039557600080fd5b5061039e610cfd565b6040516103ab9190614dea565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190614346565b610d21565b6040516103e89190614dea565b60405180910390f35b3480156103fd57600080fd5b506104186004803603810190610413919061454d565b610f29565b005b34801561042657600080fd5b50610441600480360381019061043c9190614499565b610fcc565b005b34801561044f57600080fd5b5061046a600480360381019061046591906144fe565b6111b0565b6040516104779190614b0d565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190614240565b6111d6565b005b3480156104b557600080fd5b506104be6111f6565b6040516104cb9190614dea565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190614499565b61121a565b6040516105089190614dea565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190614454565b61138d565b005b34801561054657600080fd5b50610561600480360381019061055c91906144c2565b61141f565b60405161056e9190614b0d565b60405180910390f35b34801561058357600080fd5b5061059e6004803603810190610599919061454d565b611438565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190614499565b6114db565b6040516105d49190614aa6565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190614576565b6114f1565b005b34801561061257600080fd5b5061062d600480360381019061062891906141db565b61159c565b60405161063a9190614dea565b60405180910390f35b34801561064f57600080fd5b5061065861166c565b005b34801561066657600080fd5b5061066f6116f4565b60405161067c9190614aa6565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a7919061454d565b61171d565b005b3480156106ba57600080fd5b506106c36117c0565b6040516106d4959493929190614e05565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190614499565b611838565b6040516107119190614dcf565b60405180910390f35b34801561072657600080fd5b5061072f611850565b60405161073c9190614b6d565b60405180910390f35b34801561075157600080fd5b5061076c6004803603810190610767919061430a565b6118e2565b005b34801561077a57600080fd5b50610783611a5a565b005b34801561079157600080fd5b506107ac60048036038101906107a7919061428f565b611b85565b005b3480156107ba57600080fd5b506107d560048036038101906107d09190614499565b611bd8565b6040516107e29190614b6d565b60405180910390f35b610805600480360381019061080091906144c2565b611c77565b005b34801561081357600080fd5b5061082e6004803603810190610829919061454d565b611eff565b005b34801561083c57600080fd5b50610857600480360381019061085291906141db565b611fa2565b6040516108649190614dea565b60405180910390f35b61088760048036038101906108829190614382565b611fb4565b005b34801561089557600080fd5b506108b060048036038101906108ab9190614204565b6123a7565b6040516108bd9190614b0d565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906141db565b61243b565b005b3480156108fb57600080fd5b50610904612533565b6040516109119190614dea565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4d57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5d5750610a5c82612557565b5b9050919050565b606060028054610a7390615102565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90615102565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b5050505050905090565b6000610b01826125c1565b610b37576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7d826114db565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610be5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0461262a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c365750610c3481610c2f61262a565b6123a7565b155b15610c6d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c78838383612632565b505050565b6000600160109054906101000a90046fffffffffffffffffffffffffffffffff16600160009054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610ce08383836126e4565b505050565b600a6020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000281565b6000610d2c8361159c565b8210610d64576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f1d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e7c5750610f10565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ebc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f0e5786841415610f05578195505050505050610f23565b83806001019450505b505b8080600101915050610d9f565b50600080fd5b92915050565b610f3161262a565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90614d0f565b60405180910390fd5b80600960000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b610fd461262a565b73ffffffffffffffffffffffffffffffffffffffff16610ff26116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90614d0f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000022b881611072610c7d565b61107c9190614efc565b11156110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b490614baf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000007d816110e833611fa2565b6110f29190614efc565b1115611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90614daf565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000002826111619190614f52565b905060005b818110156111ab57611198337f0000000000000000000000000000000000000000000000000000000000000002612c03565b80806111a390615165565b915050611166565b505050565b60008084141580156111c25750824210155b80156111cd57508142105b90509392505050565b6111f183838360405180602001604052806000815250611b85565b505050565b7f00000000000000000000000000000000000000000000000000000000000022b881565b600080600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611355576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611347578583141561133e5781945050505050611388565b82806001019350505b508080600101915050611254565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61139561262a565b73ffffffffffffffffffffffffffffffffffffffff166113b36116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614d0f565b60405180910390fd5b8181600b919061141a929190613f51565b505050565b600082421015801561143057508142105b905092915050565b61144061262a565b73ffffffffffffffffffffffffffffffffffffffff1661145e6116f4565b73ffffffffffffffffffffffffffffffffffffffff16146114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90614d0f565b60405180910390fd5b80600960000160046101000a81548163ffffffff021916908363ffffffff16021790555050565b60006114e682612c21565b600001519050919050565b6114f961262a565b73ffffffffffffffffffffffffffffffffffffffff166115176116f4565b73ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614d0f565b60405180910390fd5b806009600001600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611604576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61167461262a565b73ffffffffffffffffffffffffffffffffffffffff166116926116f4565b73ffffffffffffffffffffffffffffffffffffffff16146116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df90614d0f565b60405180910390fd5b6116f26000612ecb565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61172561262a565b73ffffffffffffffffffffffffffffffffffffffff166117436116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614d0f565b60405180910390fd5b80600960000160146101000a81548163ffffffff021916908363ffffffff16021790555050565b60098060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16908060000160089054906101000a900463ffffffff169080600001600c9054906101000a900467ffffffffffffffff16908060000160149054906101000a900463ffffffff16905085565b611840613fd7565b61184982612c21565b9050919050565b60606003805461185f90615102565b80601f016020809104026020016040519081016040528092919081815260200182805461188b90615102565b80156118d85780601f106118ad576101008083540402835291602001916118d8565b820191906000526020600020905b8154815290600101906020018083116118bb57829003601f168201915b5050505050905090565b6118ea61262a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561194f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061195c61262a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a0961262a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a4e9190614b0d565b60405180910390a35050565b611a6261262a565b73ffffffffffffffffffffffffffffffffffffffff16611a806116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd90614d0f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611afc90614a65565b60006040518083038185875af1925050503d8060008114611b39576040519150601f19603f3d011682016040523d82523d6000602084013e611b3e565b606091505b5050905080611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614caf565b60405180910390fd5b50565b611b908484846126e4565b611b9c84848484612f8f565b611bd2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611be3826125c1565b611c19576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2361311d565b9050600081511415611c445760405180602001604052806000815250611c6f565b80611c4e846131af565b604051602001611c5f929190614a1b565b6040516020818303038152906040525b915050919050565b60026008541415611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490614d6f565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90614d8f565b60405180910390fd5b600060096040518060a00160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000816080015163ffffffff1690506000826060015167ffffffffffffffff1690506000836020015163ffffffff1690506000846040015163ffffffff169050858414611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790614c0f565b60405180910390fd5b611e9b8483836111b0565b611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed190614c6f565b60405180910390fd5b611ee4838861335c565b611eee3388612c03565b505050505060016008819055505050565b611f0761262a565b73ffffffffffffffffffffffffffffffffffffffff16611f256116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614d0f565b60405180910390fd5b80600960000160086101000a81548163ffffffff021916908363ffffffff16021790555050565b6000611fad82613486565b9050919050565b60026008541415611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff190614d6f565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614d8f565b60405180910390fd5b6120be8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613556565b6120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490614c4f565b60405180910390fd5b84612108338361359f565b14612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f90614d4f565b60405180910390fd5b8082600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121949190614efc565b11156121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614cef565b60405180910390fd5b600060096040518060a00160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000816060015167ffffffffffffffff1690506000826000015163ffffffff1690506000836040015163ffffffff1690506122eb828261141f565b61232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232190614bcf565b60405180910390fd5b85600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123799190614efc565b9250508190555061238a838761335c565b6123943387612c03565b5050505060016008819055505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61244361262a565b73ffffffffffffffffffffffffffffffffffffffff166124616116f4565b73ffffffffffffffffffffffffffffffffffffffff16146124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae90614d0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e90614c2f565b60405180910390fd5b61253081612ecb565b50565b7f000000000000000000000000000000000000000000000000000000000000007d81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612623575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126ef82612c21565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661271661262a565b73ffffffffffffffffffffffffffffffffffffffff1614806127495750612748826000015161274361262a565b6123a7565b5b8061278e575061275761262a565b73ffffffffffffffffffffffffffffffffffffffff1661277684610af6565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127c7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612830576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612897576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a485858560016135d2565b6128b46000848460000151612632565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b9357600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612b925782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfc85858560016135d8565b5050505050565b612c1d8282604051806020016040528060008152506135de565b5050565b612c29613fd7565b6000829050600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612e94576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d76578092505050612ec6565b5b600115612e9157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e8c578092505050612ec6565b612d77565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612fb08473ffffffffffffffffffffffffffffffffffffffff166135f0565b15613110578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fd961262a565b8786866040518563ffffffff1660e01b8152600401612ffb9493929190614ac1565b602060405180830381600087803b15801561301557600080fd5b505af192505050801561304657506040513d601f19601f82011682018060405250810190613043919061442b565b60015b6130c0573d8060008114613076576040519150601f19603f3d011682016040523d82523d6000602084013e61307b565b606091505b506000815114156130b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613115565b600190505b949350505050565b6060600b805461312c90615102565b80601f016020809104026020016040519081016040528092919081815260200182805461315890615102565b80156131a55780601f1061317a576101008083540402835291602001916131a5565b820191906000526020600020905b81548152906001019060200180831161318857829003601f168201915b5050505050905090565b606060008214156131f7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613357565b600082905060005b6000821461322957808061321290615165565b915050600a826132229190614f52565b91506131ff565b60008167ffffffffffffffff81111561326b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561329d5781602001600182028036833780820191505090505b5090505b60008514613350576001826132b69190614fdd565b9150600a856132c591906151e6565b60306132d19190614efc565b60f81b81838151811061330d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133499190614f52565b94506132a1565b8093505050505b919050565b80826133689190614f83565b3410156133aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a190614d2f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000281111561340d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340490614cef565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000022b881613437610c7d565b6134419190614efc565b1115613482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347990614baf565b60405180910390fd5b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ee576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60006135606116f4565b73ffffffffffffffffffffffffffffffffffffffff166135808484613613565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600081836040516020016135b4929190614a7a565b60405160208183030381529060405280519060200120905092915050565b50505050565b50505050565b6135eb8383836001613652565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080836040516020016136279190614a3f565b60405160208183030381529060405280519060200120905061364981846139ea565b91505092915050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136ee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613729576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61373660008683876135d2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561399b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561394f575061394d6000888488612f8f565b155b15613986576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506138d4565b5080600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506139e360008683876135d8565b5050505050565b60008060006139f98585613a11565b91509150613a0681613a94565b819250505092915050565b600080604183511415613a535760008060006020860151925060408601519150606086015160001a9050613a4787828585613de5565b94509450505050613a8d565b604083511415613a84576000806020850151915060408501519050613a79868383613ef2565b935093505050613a8d565b60006002915091505b9250929050565b60006004811115613ace577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613b07577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613b1257613de2565b60016004811115613b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613b85577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bbd90614b8f565b60405180910390fd5b60026004811115613c00577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c7190614bef565b60405180910390fd5b60036004811115613cb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2590614c8f565b60405180910390fd5b600480811115613d67577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613da0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd890614ccf565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613e20576000600391509150613ee9565b601b8560ff1614158015613e385750601c8560ff1614155b15613e4a576000600491509150613ee9565b600060018787878760405160008152602001604052604051613e6f9493929190614b28565b6020604051602081039080840390855afa158015613e91573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613ee057600060019250925050613ee9565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613f359190614efc565b9050613f4387828885613de5565b935093505050935093915050565b828054613f5d90615102565b90600052602060002090601f016020900481019282613f7f5760008555613fc6565b82601f10613f9857803560ff1916838001178555613fc6565b82800160010185558215613fc6579182015b82811115613fc5578235825591602001919060010190613faa565b5b509050613fd3919061401a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561403357600081600090555060010161401b565b5090565b600061404a61404584614e7d565b614e58565b90508281526020810184848401111561406257600080fd5b61406d8482856150c0565b509392505050565b60008135905061408481615671565b92915050565b60008135905061409981615688565b92915050565b6000813590506140ae8161569f565b92915050565b6000813590506140c3816156b6565b92915050565b6000815190506140d8816156b6565b92915050565b60008083601f8401126140f057600080fd5b8235905067ffffffffffffffff81111561410957600080fd5b60208301915083600182028301111561412157600080fd5b9250929050565b600082601f83011261413957600080fd5b8135614149848260208601614037565b91505092915050565b60008083601f84011261416457600080fd5b8235905067ffffffffffffffff81111561417d57600080fd5b60208301915083600182028301111561419557600080fd5b9250929050565b6000813590506141ab816156cd565b92915050565b6000813590506141c0816156e4565b92915050565b6000813590506141d5816156fb565b92915050565b6000602082840312156141ed57600080fd5b60006141fb84828501614075565b91505092915050565b6000806040838503121561421757600080fd5b600061422585828601614075565b925050602061423685828601614075565b9150509250929050565b60008060006060848603121561425557600080fd5b600061426386828701614075565b935050602061427486828701614075565b92505060406142858682870161419c565b9150509250925092565b600080600080608085870312156142a557600080fd5b60006142b387828801614075565b94505060206142c487828801614075565b93505060406142d58782880161419c565b925050606085013567ffffffffffffffff8111156142f257600080fd5b6142fe87828801614128565b91505092959194509250565b6000806040838503121561431d57600080fd5b600061432b85828601614075565b925050602061433c8582860161408a565b9150509250929050565b6000806040838503121561435957600080fd5b600061436785828601614075565b92505060206143788582860161419c565b9150509250929050565b60008060008060006080868803121561439a57600080fd5b60006143a88882890161409f565b955050602086013567ffffffffffffffff8111156143c557600080fd5b6143d1888289016140de565b945094505060406143e48882890161419c565b92505060606143f58882890161419c565b9150509295509295909350565b60006020828403121561441457600080fd5b6000614422848285016140b4565b91505092915050565b60006020828403121561443d57600080fd5b600061444b848285016140c9565b91505092915050565b6000806020838503121561446757600080fd5b600083013567ffffffffffffffff81111561448157600080fd5b61448d85828601614152565b92509250509250929050565b6000602082840312156144ab57600080fd5b60006144b98482850161419c565b91505092915050565b600080604083850312156144d557600080fd5b60006144e38582860161419c565b92505060206144f48582860161419c565b9150509250929050565b60008060006060848603121561451357600080fd5b60006145218682870161419c565b93505060206145328682870161419c565b92505060406145438682870161419c565b9150509250925092565b60006020828403121561455f57600080fd5b600061456d848285016141b1565b91505092915050565b60006020828403121561458857600080fd5b6000614596848285016141c6565b91505092915050565b6145a881615011565b82525050565b6145b781615011565b82525050565b6145ce6145c982615011565b6151ae565b82525050565b6145dd81615023565b82525050565b6145ec81615023565b82525050565b6145fb8161502f565b82525050565b61461261460d8261502f565b6151c0565b82525050565b600061462382614eae565b61462d8185614ec4565b935061463d8185602086016150cf565b614646816152d3565b840191505092915050565b600061465c82614eb9565b6146668185614ee0565b93506146768185602086016150cf565b61467f816152d3565b840191505092915050565b600061469582614eb9565b61469f8185614ef1565b93506146af8185602086016150cf565b80840191505092915050565b60006146c8601883614ee0565b91506146d3826152f1565b602082019050919050565b60006146eb601083614ee0565b91506146f68261531a565b602082019050919050565b600061470e601483614ee0565b915061471982615343565b602082019050919050565b6000614731601f83614ee0565b915061473c8261536c565b602082019050919050565b6000614754601c83614ef1565b915061475f82615395565b601c82019050919050565b6000614777600c83614ee0565b9150614782826153be565b602082019050919050565b600061479a602683614ee0565b91506147a5826153e7565b604082019050919050565b60006147bd601083614ee0565b91506147c882615436565b602082019050919050565b60006147e0601183614ee0565b91506147eb8261545f565b602082019050919050565b6000614803602283614ee0565b915061480e82615488565b604082019050919050565b6000614826601283614ee0565b9150614831826154d7565b602082019050919050565b6000614849602283614ee0565b915061485482615500565b604082019050919050565b600061486c601c83614ee0565b91506148778261554f565b602082019050919050565b600061488f602083614ee0565b915061489a82615578565b602082019050919050565b60006148b2600c83614ee0565b91506148bd826155a1565b602082019050919050565b60006148d5600083614ed5565b91506148e0826155ca565b600082019050919050565b60006148f8600b83614ee0565b9150614903826155cd565b602082019050919050565b600061491b601f83614ee0565b9150614926826155f6565b602082019050919050565b600061493e601783614ee0565b91506149498261561f565b602082019050919050565b6000614961601183614ee0565b915061496c82615648565b602082019050919050565b60608201600082015161498d600085018261459f565b5060208201516149a060208501826149ee565b5060408201516149b360408501826145d4565b50505050565b6149c281615085565b82525050565b6149d96149d482615085565b6151dc565b82525050565b6149e88161508f565b82525050565b6149f78161509f565b82525050565b614a068161509f565b82525050565b614a15816150b3565b82525050565b6000614a27828561468a565b9150614a33828461468a565b91508190509392505050565b6000614a4a82614747565b9150614a568284614601565b60208201915081905092915050565b6000614a70826148c8565b9150819050919050565b6000614a8682856149c8565b602082019150614a9682846145bd565b6014820191508190509392505050565b6000602082019050614abb60008301846145ae565b92915050565b6000608082019050614ad660008301876145ae565b614ae360208301866145ae565b614af060408301856149b9565b8181036060830152614b028184614618565b905095945050505050565b6000602082019050614b2260008301846145e3565b92915050565b6000608082019050614b3d60008301876145f2565b614b4a6020830186614a0c565b614b5760408301856145f2565b614b6460608301846145f2565b95945050505050565b60006020820190508181036000830152614b878184614651565b905092915050565b60006020820190508181036000830152614ba8816146bb565b9050919050565b60006020820190508181036000830152614bc8816146de565b9050919050565b60006020820190508181036000830152614be881614701565b9050919050565b60006020820190508181036000830152614c0881614724565b9050919050565b60006020820190508181036000830152614c288161476a565b9050919050565b60006020820190508181036000830152614c488161478d565b9050919050565b60006020820190508181036000830152614c68816147b0565b9050919050565b60006020820190508181036000830152614c88816147d3565b9050919050565b60006020820190508181036000830152614ca8816147f6565b9050919050565b60006020820190508181036000830152614cc881614819565b9050919050565b60006020820190508181036000830152614ce88161483c565b9050919050565b60006020820190508181036000830152614d088161485f565b9050919050565b60006020820190508181036000830152614d2881614882565b9050919050565b60006020820190508181036000830152614d48816148a5565b9050919050565b60006020820190508181036000830152614d68816148eb565b9050919050565b60006020820190508181036000830152614d888161490e565b9050919050565b60006020820190508181036000830152614da881614931565b9050919050565b60006020820190508181036000830152614dc881614954565b9050919050565b6000606082019050614de46000830184614977565b92915050565b6000602082019050614dff60008301846149b9565b92915050565b600060a082019050614e1a60008301886149df565b614e2760208301876149df565b614e3460408301866149df565b614e4160608301856149fd565b614e4e60808301846149df565b9695505050505050565b6000614e62614e73565b9050614e6e8282615134565b919050565b6000604051905090565b600067ffffffffffffffff821115614e9857614e976152a4565b5b614ea1826152d3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f0782615085565b9150614f1283615085565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f4757614f46615217565b5b828201905092915050565b6000614f5d82615085565b9150614f6883615085565b925082614f7857614f77615246565b5b828204905092915050565b6000614f8e82615085565b9150614f9983615085565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fd257614fd1615217565b5b828202905092915050565b6000614fe882615085565b9150614ff383615085565b92508282101561500657615005615217565b5b828203905092915050565b600061501c82615065565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156150ed5780820151818401526020810190506150d2565b838111156150fc576000848401525b50505050565b6000600282049050600182168061511a57607f821691505b6020821081141561512e5761512d615275565b5b50919050565b61513d826152d3565b810181811067ffffffffffffffff8211171561515c5761515b6152a4565b5b80604052505050565b600061517082615085565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151a3576151a2615217565b5b600182019050919050565b60006151b9826151ca565b9050919050565b6000819050919050565b60006151d5826152e4565b9050919050565b6000819050919050565b60006151f182615085565b91506151fc83615085565b92508261520c5761520b615246565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4d6178537570706c795265616368656400000000000000000000000000000000600082015250565b7f416c6c6f776c69737453616c654f66666c696e65000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4261645075626c69634b65790000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69645369676e617475726500000000000000000000000000000000600082015250565b7f5075626c696353616c654f66666c696e65000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e4661696c7572650000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74416d6f756e74477265617465725468616e416c6c6f77656400000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f74456e6f7567684574680000000000000000000000000000000000000000600082015250565b50565b7f496e76616c696448617368000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f43616c6c65724973416e6f74686572436f6e7472616374000000000000000000600082015250565b7f4d61784465764d696e7452656163686564000000000000000000000000000000600082015250565b61567a81615011565b811461568557600080fd5b50565b61569181615023565b811461569c57600080fd5b50565b6156a88161502f565b81146156b357600080fd5b50565b6156bf81615039565b81146156ca57600080fd5b50565b6156d681615085565b81146156e157600080fd5b50565b6156ed8161508f565b81146156f857600080fd5b50565b6157048161509f565b811461570f57600080fd5b5056fea2646970667358221220ec386747b33cad7040990992a0887a3c4c94944c2e93ce4cbd448c014cfe11bc64736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000022b8000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aa535d3d0c000000000000000000000000000000000000000000000000000000000000621d37d000000000000000000000000000000000000000000000000000000000621e895000000000000000000000000000000000000000000000000000000000621fdad0

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 2
Arg [1] : collectionSize_ (uint256): 8888
Arg [2] : amountForDevs_ (uint256): 125
Arg [3] : publicSaleKey_ (uint32): 0
Arg [4] : mintPriceWei_ (uint64): 120000000000000000
Arg [5] : allowlistSaleStartTime_ (uint32): 1646082000
Arg [6] : publicSaleStartTime_ (uint32): 1646168400
Arg [7] : mintEndTime_ (uint32): 1646254800

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [1] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [2] : 000000000000000000000000000000000000000000000000000000000000007d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 00000000000000000000000000000000000000000000000001aa535d3d0c0000
Arg [5] : 00000000000000000000000000000000000000000000000000000000621d37d0
Arg [6] : 00000000000000000000000000000000000000000000000000000000621e8950
Arg [7] : 00000000000000000000000000000000000000000000000000000000621fdad0


Deployed Bytecode Sourcemap

59164:6425:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42102:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44712:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46215:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45778:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39339:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47072:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59599:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59227:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40925:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63758:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64386:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63188:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47313:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59316:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39912:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65008:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63500:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63902:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44521:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64276:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42538:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17023:103;;;;;;;;;;;;;:::i;:::-;;16372:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64040:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59562:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;65431:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44881:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46491:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65122:180;;;;;;;;;;;;;:::i;:::-;;47569:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45056:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62141:734;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64154:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65310:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60519:958;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46841:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17281:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59271:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42102:372;42204:4;42256:25;42241:40;;;:11;:40;;;;:105;;;;42313:33;42298:48;;;:11;:48;;;;42241:105;:172;;;;42378:35;42363:50;;;:11;:50;;;;42241:172;:225;;;;42430:36;42454:11;42430:23;:36::i;:::-;42241:225;42221:245;;42102:372;;;:::o;44712:100::-;44766:13;44799:5;44792:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44712:100;:::o;46215:204::-;46283:7;46308:16;46316:7;46308;:16::i;:::-;46303:64;;46333:34;;;;;;;;;;;;;;46303:64;46387:15;:24;46403:7;46387:24;;;;;;;;;;;;;;;;;;;;;46380:31;;46215:204;;;:::o;45778:371::-;45851:13;45867:24;45883:7;45867:15;:24::i;:::-;45851:40;;45912:5;45906:11;;:2;:11;;;45902:48;;;45926:24;;;;;;;;;;;;;;45902:48;45983:5;45967:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;45993:37;46010:5;46017:12;:10;:12::i;:::-;45993:16;:37::i;:::-;45992:38;45967:63;45963:138;;;46054:35;;;;;;;;;;;;;;45963:138;46113:28;46122:2;46126:7;46135:5;46113:8;:28::i;:::-;45778:371;;;:::o;39339:280::-;39392:7;39584:12;;;;;;;;;;;39568:13;;;;;;;;;;;:28;39561:35;;;;39339:280;:::o;47072:170::-;47206:28;47216:4;47222:2;47226:7;47206:9;:28::i;:::-;47072:170;;;:::o;59599:52::-;;;;;;;;;;;;;;;;;:::o;59227:37::-;;;:::o;40925:1105::-;41014:7;41047:16;41057:5;41047:9;:16::i;:::-;41038:5;:25;41034:61;;41072:23;;;;;;;;;;;;;;41034:61;41106:22;41131:13;;;;;;;;;;;41106:38;;;;41155:19;41185:25;41386:9;41381:557;41401:14;41397:1;:18;41381:557;;;41441:31;41475:11;:14;41487:1;41475:14;;;;;;;;;;;41441:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41512:9;:16;;;41508:73;;;41553:8;;;41508:73;41629:1;41603:28;;:9;:14;;;:28;;;41599:111;;41676:9;:14;;;41656:34;;41599:111;41753:5;41732:26;;:17;:26;;;41728:195;;;41802:5;41787:11;:20;41783:85;;;41843:1;41836:8;;;;;;;;;41783:85;41890:13;;;;;;;41728:195;41381:557;;41417:3;;;;;;;41381:557;;;;42014:8;;;40925:1105;;;;;:::o;63758:136::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63877:9:::1;63841:10;:33;;;:45;;;;;;;;;;;;;;;;;;63758:136:::0;:::o;64386:403::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64487:14:::1;64475:8;64459:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;64451:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64580:13;64568:8;64541:24;64554:10;64541:12;:24::i;:::-;:35;;;;:::i;:::-;:52;;64533:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;64626:17;64657:12;64646:8;:23;;;;:::i;:::-;64626:43;;64685:9;64680:102;64704:9;64700:1;:13;64680:102;;;64735:35;64745:10;64757:12;64735:9;:35::i;:::-;64715:3;;;;;:::i;:::-;;;;64680:102;;;;16663:1;64386:403:::0;:::o;63188:304::-;63340:4;63390:1;63373:13;:18;;:69;;;;;63423:19;63404:15;:38;;63373:69;:111;;;;;63473:11;63455:15;:29;63373:111;63357:127;;63188:304;;;;;:::o;47313:185::-;47451:39;47468:4;47474:2;47478:7;47451:39;;;;;;;;;;;;:16;:39::i;:::-;47313:185;;;:::o;59316:39::-;;;:::o;39912:713::-;39979:7;39999:22;40024:13;;;;;;;;;;;39999:38;;;;40048:19;40243:9;40238:328;40258:14;40254:1;:18;40238:328;;;40298:31;40332:11;:14;40344:1;40332:14;;;;;;;;;;;40298:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40370:9;:16;;;40365:186;;40430:5;40415:11;:20;40411:85;;;40471:1;40464:8;;;;;;;;40411:85;40518:13;;;;;;;40365:186;40238:328;40274:3;;;;;;;40238:328;;;;40594:23;;;;;;;;;;;;;;39912:713;;;;:::o;65008:106::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65099:7:::1;;65083:13;:23;;;;;;;:::i;:::-;;65008:106:::0;;:::o;63500:250::-;63626:4;63678:22;63659:15;:41;;:83;;;;;63731:11;63713:15;:29;63659:83;63643:99;;63500:250;;;;:::o;63902:130::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64015:9:::1;63982:10;:30;;;:42;;;;;;;;;;;;;;;;;;63902:130:::0;:::o;44521:124::-;44585:7;44612:20;44624:7;44612:11;:20::i;:::-;:25;;;44605:32;;44521:124;;;:::o;64276:102::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64365:5:::1;64342:10;:20;;;:28;;;;;;;;;;;;;;;;;;64276:102:::0;:::o;42538:206::-;42602:7;42643:1;42626:19;;:5;:19;;;42622:60;;;42654:28;;;;;;;;;;;;;;42622:60;42708:12;:19;42721:5;42708:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42700:36;;42693:43;;42538:206;;;:::o;17023:103::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17088:30:::1;17115:1;17088:18;:30::i;:::-;17023:103::o:0;16372:87::-;16418:7;16445:6;;;;;;;;;;;16438:13;;16372:87;:::o;64040:106::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64135:3:::1;64108:10;:24;;;:30;;;;;;;;;;;;;;;;;;64040:106:::0;:::o;59562:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65431:155::-;65512:21;;:::i;:::-;65558:20;65570:7;65558:11;:20::i;:::-;65551:27;;65431:155;;;:::o;44881:104::-;44937:13;44970:7;44963:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44881:104;:::o;46491:279::-;46594:12;:10;:12::i;:::-;46582:24;;:8;:24;;;46578:54;;;46615:17;;;;;;;;;;;;;;46578:54;46690:8;46645:18;:32;46664:12;:10;:12::i;:::-;46645:32;;;;;;;;;;;;;;;:42;46678:8;46645:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46743:8;46714:48;;46729:12;:10;:12::i;:::-;46714:48;;;46753:8;46714:48;;;;;;:::i;:::-;;;;;;;;46491:279;;:::o;65122:180::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65178:12:::1;65196:10;:15;;65219:21;65196:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65177:68;;;65264:7;65256:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;16663:1;65122:180::o:0;47569:342::-;47736:28;47746:4;47752:2;47756:7;47736:9;:28::i;:::-;47780:48;47803:4;47809:2;47813:7;47822:5;47780:22;:48::i;:::-;47775:129;;47852:40;;;;;;;;;;;;;;47775:129;47569:342;;;;:::o;45056:318::-;45129:13;45160:16;45168:7;45160;:16::i;:::-;45155:59;;45185:29;;;;;;;;;;;;;;45155:59;45227:21;45251:10;:8;:10::i;:::-;45227:34;;45304:1;45285:7;45279:21;:26;;:87;;;;;;;;;;;;;;;;;45332:7;45341:18;:7;:16;:18::i;:::-;45315:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45279:87;45272:94;;;45056:318;;;:::o;62141:734::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;60453:10:::1;60440:23;;:9;:23;;;60432:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62291:24:::2;62318:10;62291:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;62339:21;62371:6;:20;;;62363:29;;62339:53;;62403:19;62433:6;:16;;;62425:25;;62403:47;;62461:27;62499:6;:26;;;62491:35;;62461:65;;62537:25;62573:6;:18;;;62565:27;;62537:55;;62630:19;62613:13;:36;62605:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62685:69;62700:13;62715:19;62736:17;62685:14;:69::i;:::-;62677:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;62789:36;62803:11;62816:8;62789:13;:36::i;:::-;62836:31;62846:10;62858:8;62836:9;:31::i;:::-;60502:1;;;;;1768::::0;2722:7;:22;;;;62141:734;;:::o;64154:114::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64251:9:::1;64226:10;:22;;;:34;;;;;;;;;;;;;;;;;;64154:114:::0;:::o;65310:113::-;65368:7;65395:20;65409:5;65395:13;:20::i;:::-;65388:27;;65310:113;;;:::o;60519:958::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;60453:10:::1;60440:23;;:9;:23;;;60432:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60711:24:::2;60719:4;60725:9;;60711:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:24::i;:::-;60703:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60842:4;60775:63;60811:10;60823:14;60775:35;:63::i;:::-;:71;60767:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;60925:14;60913:8;60881:17;:29;60899:10;60881:29;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:58;;60873:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;60985:24;61012:10;60985:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;61033:22;61066:6;:16;;;61058:25;;61033:50;;61094:30;61135:6;:29;;;61127:38;;61094:71;;61176:19;61206:6;:18;;;61198:27;;61176:49;;61244:54;61262:22;61286:11;61244:17;:54::i;:::-;61236:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;61369:8;61336:17;:29;61354:10;61336:29;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;61388:39;61402:14;61418:8;61388:13;:39::i;:::-;61438:31;61448:10;61460:8;61438:9;:31::i;:::-;60502:1;;;;1768::::0;2722:7;:22;;;;60519:958;;;;;:::o;46841:164::-;46938:4;46962:18;:25;46981:5;46962:25;;;;;;;;;;;;;;;:35;46988:8;46962:35;;;;;;;;;;;;;;;;;;;;;;;;;46955:42;;46841:164;;;;:::o;17281:201::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17390:1:::1;17370:22;;:8;:22;;;;17362:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17446:28;17465:8;17446:18;:28::i;:::-;17281:201:::0;:::o;59271:38::-;;;:::o;29156:157::-;29241:4;29280:25;29265:40;;;:11;:40;;;;29258:47;;29156:157;;;:::o;48166:144::-;48223:4;48257:13;;;;;;;;;;;48247:23;;:7;:23;:55;;;;;48275:11;:20;48287:7;48275:20;;;;;;;;;;;:27;;;;;;;;;;;;48274:28;48247:55;48240:62;;48166:144;;;:::o;15096:98::-;15149:7;15176:10;15169:17;;15096:98;:::o;55382:196::-;55524:2;55497:15;:24;55513:7;55497:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55562:7;55558:2;55542:28;;55551:5;55542:28;;;;;;;;;;;;55382:196;;;:::o;50883:2112::-;50998:35;51036:20;51048:7;51036:11;:20::i;:::-;50998:58;;51069:22;51111:13;:18;;;51095:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;51146:50;51163:13;:18;;;51183:12;:10;:12::i;:::-;51146:16;:50::i;:::-;51095:101;:154;;;;51237:12;:10;:12::i;:::-;51213:36;;:20;51225:7;51213:11;:20::i;:::-;:36;;;51095:154;51069:181;;51268:17;51263:66;;51294:35;;;;;;;;;;;;;;51263:66;51366:4;51344:26;;:13;:18;;;:26;;;51340:67;;51379:28;;;;;;;;;;;;;;51340:67;51436:1;51422:16;;:2;:16;;;51418:52;;;51447:23;;;;;;;;;;;;;;51418:52;51483:43;51505:4;51511:2;51515:7;51524:1;51483:21;:43::i;:::-;51591:49;51608:1;51612:7;51621:13;:18;;;51591:8;:49::i;:::-;51966:1;51936:12;:18;51949:4;51936:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52010:1;51982:12;:16;51995:2;51982:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52056:2;52028:11;:20;52040:7;52028:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;52118:15;52073:11;:20;52085:7;52073:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;52386:19;52418:1;52408:7;:11;52386:33;;52479:1;52438:43;;:11;:24;52450:11;52438:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;52434:445;;;52663:13;;;;;;;;;;;52649:27;;:11;:27;52645:219;;;52733:13;:18;;;52701:11;:24;52713:11;52701:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;52816:13;:28;;;52774:11;:24;52786:11;52774:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;52645:219;52434:445;50883:2112;52926:7;52922:2;52907:27;;52916:4;52907:27;;;;;;;;;;;;52945:42;52966:4;52972:2;52976:7;52985:1;52945:20;:42::i;:::-;50883:2112;;;;;:::o;48318:104::-;48387:27;48397:2;48401:8;48387:27;;;;;;;;;;;;:9;:27::i;:::-;48318:104;;:::o;43376:1083::-;43437:21;;:::i;:::-;43471:12;43486:7;43471:22;;43542:13;;;;;;;;;;;43535:20;;:4;:20;43531:861;;;43576:31;43610:11;:17;43622:4;43610:17;;;;;;;;;;;43576:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43651:9;:16;;;43646:731;;43722:1;43696:28;;:9;:14;;;:28;;;43692:101;;43760:9;43753:16;;;;;;43692:101;44097:261;44104:4;44097:261;;;44137:6;;;;;;;;44182:11;:17;44194:4;44182:17;;;;;;;;;;;44170:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44256:1;44230:28;;:9;:14;;;:28;;;44226:109;;44298:9;44291:16;;;;;;44226:109;44097:261;;;43646:731;43531:861;;44420:31;;;;;;;;;;;;;;43376:1083;;;;:::o;17642:191::-;17716:16;17735:6;;;;;;;;;;;17716:25;;17761:8;17752:6;;:17;;;;;;;;;;;;;;;;;;17816:8;17785:40;;17806:8;17785:40;;;;;;;;;;;;17642:191;;:::o;56143:790::-;56298:4;56319:15;:2;:13;;;:15::i;:::-;56315:611;;;56371:2;56355:36;;;56392:12;:10;:12::i;:::-;56406:4;56412:7;56421:5;56355:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56351:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56618:1;56601:6;:13;:18;56597:259;;;56651:40;;;;;;;;;;;;;;56597:259;56806:6;56800:13;56791:6;56787:2;56783:15;56776:38;56351:520;56488:45;;;56478:55;;;:6;:55;;;;56471:62;;;;;56315:611;56910:4;56903:11;;56143:790;;;;;;;:::o;64886:114::-;64946:13;64979;64972:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64886:114;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;62883:297::-;62988:8;62980:5;:16;;;;:::i;:::-;62966:9;:31;;62958:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;63045:12;63033:8;:24;;63025:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63137:14;63125:8;63109:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;63101:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62883:297;;:::o;42752:207::-;42813:7;42854:1;42837:19;;:5;:19;;;42833:59;;;42865:27;;;;;;;;;;;;;;42833:59;42918:12;:19;42931:5;42918:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;42910:41;;42903:48;;42752:207;;;:::o;61675:148::-;61753:4;61807:7;:5;:7::i;:::-;61778:36;;:25;61787:4;61793:9;61778:8;:25::i;:::-;:36;;;61770:45;;61675:148;;;;:::o;61485:182::-;61587:7;61641:6;61649:8;61624:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61614:45;;;;;;61607:52;;61485:182;;;;:::o;57581:159::-;;;;;:::o;58399:158::-;;;;;:::o;48785:163::-;48908:32;48914:2;48918:8;48928:5;48935:4;48908:5;:32::i;:::-;48785:163;;;:::o;19073:326::-;19133:4;19390:1;19368:7;:19;;;:23;19361:30;;19073:326;;;:::o;61831:302::-;61910:7;61930:21;62052:4;61964:103;;;;;;;;:::i;:::-;;;;;;;;;;;;;61954:114;;;;;;61930:138;;62086:39;62100:13;62115:9;62086:13;:39::i;:::-;62079:46;;;61831:302;;;;:::o;49207:1422::-;49346:20;49369:13;;;;;;;;;;;49346:36;;;;49411:1;49397:16;;:2;:16;;;49393:48;;;49422:19;;;;;;;;;;;;;;49393:48;49468:1;49456:8;:13;49452:44;;;49478:18;;;;;;;;;;;;;;49452:44;49509:61;49539:1;49543:2;49547:12;49561:8;49509:21;:61::i;:::-;49883:8;49848:12;:16;49861:2;49848:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49947:8;49907:12;:16;49920:2;49907:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50006:2;49973:11;:25;49985:12;49973:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;50073:15;50023:11;:25;50035:12;50023:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;50106:20;50129:12;50106:35;;50163:9;50158:328;50178:8;50174:1;:12;50158:328;;;50242:12;50238:2;50217:38;;50234:1;50217:38;;;;;;;;;;;;50278:4;:68;;;;;50287:59;50318:1;50322:2;50326:12;50340:5;50287:22;:59::i;:::-;50286:60;50278:68;50274:164;;;50378:40;;;;;;;;;;;;;;50274:164;50456:14;;;;;;;50188:3;;;;;;;50158:328;;;;50526:12;50502:13;;:37;;;;;;;;;;;;;;;;;;49207:1422;50561:60;50590:1;50594:2;50598:12;50612:8;50561:20;:60::i;:::-;49207:1422;;;;;:::o;9300:231::-;9378:7;9399:17;9418:18;9440:27;9451:4;9457:9;9440:10;:27::i;:::-;9398:69;;;;9478:18;9490:5;9478:11;:18::i;:::-;9514:9;9507:16;;;;9300:231;;;;:::o;7190:1308::-;7271:7;7280:12;7525:2;7505:9;:16;:22;7501:990;;;7544:9;7568;7592:7;7801:4;7790:9;7786:20;7780:27;7775:32;;7851:4;7840:9;7836:20;7830:27;7825:32;;7909:4;7898:9;7894:20;7888:27;7885:1;7880:36;7875:41;;7952:25;7963:4;7969:1;7972;7975;7952:10;:25::i;:::-;7945:32;;;;;;;;;7501:990;8019:2;7999:9;:16;:22;7995:496;;;8038:9;8062:10;8274:4;8263:9;8259:20;8253:27;8248:32;;8325:4;8314:9;8310:20;8304:27;8298:33;;8367:23;8378:4;8384:1;8387:2;8367:10;:23::i;:::-;8360:30;;;;;;;;7995:496;8439:1;8443:35;8423:56;;;;7190:1308;;;;;;:::o;5461:643::-;5539:20;5530:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;5526:571;;;5576:7;;5526:571;5637:29;5628:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;5624:473;;;5683:34;;;;;;;;;;:::i;:::-;;;;;;;;5624:473;5748:35;5739:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;5735:362;;;5800:41;;;;;;;;;;:::i;:::-;;;;;;;;5735:362;5872:30;5863:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;5859:238;;;5919:44;;;;;;;;;;:::i;:::-;;;;;;;;5859:238;5994:30;5985:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;5981:116;;;6041:44;;;;;;;;;;:::i;:::-;;;;;;;;5981:116;5461:643;;:::o;10752:1632::-;10883:7;10892:12;11817:66;11812:1;11804:10;;:79;11800:163;;;11916:1;11920:30;11900:51;;;;;;11800:163;11982:2;11977:1;:7;;;;:18;;;;;11993:2;11988:1;:7;;;;11977:18;11973:102;;;12028:1;12032:30;12012:51;;;;;;11973:102;12172:14;12189:24;12199:4;12205:1;12208;12211;12189:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12172:41;;12246:1;12228:20;;:6;:20;;;12224:103;;;12281:1;12285:29;12265:50;;;;;;;12224:103;12347:6;12355:20;12339:37;;;;;10752:1632;;;;;;;;:::o;9794:344::-;9908:7;9917:12;9942:9;9967:66;9959:75;;9954:2;:80;9942:92;;10045:7;10084:2;10077:3;10070:2;10062:11;;:18;;10061:25;;;;:::i;:::-;10045:42;;10105:25;10116:4;10122:1;10125;10128;10105:10;:25::i;:::-;10098:32;;;;;;9794:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:139::-;686:5;724:6;711:20;702:29;;740:33;767:5;740:33;:::i;:::-;692:87;;;;:::o;785:137::-;830:5;868:6;855:20;846:29;;884:32;910:5;884:32;:::i;:::-;836:86;;;;:::o;928:141::-;984:5;1015:6;1009:13;1000:22;;1031:32;1057:5;1031:32;:::i;:::-;990:79;;;;:::o;1088:351::-;1145:8;1155:6;1205:3;1198:4;1190:6;1186:17;1182:27;1172:2;;1223:1;1220;1213:12;1172:2;1259:6;1246:20;1236:30;;1289:18;1281:6;1278:30;1275:2;;;1321:1;1318;1311:12;1275:2;1358:4;1350:6;1346:17;1334:29;;1412:3;1404:4;1396:6;1392:17;1382:8;1378:32;1375:41;1372:2;;;1429:1;1426;1419:12;1372:2;1162:277;;;;;:::o;1458:271::-;1513:5;1562:3;1555:4;1547:6;1543:17;1539:27;1529:2;;1580:1;1577;1570:12;1529:2;1620:6;1607:20;1645:78;1719:3;1711:6;1704:4;1696:6;1692:17;1645:78;:::i;:::-;1636:87;;1519:210;;;;;:::o;1749:352::-;1807:8;1817:6;1867:3;1860:4;1852:6;1848:17;1844:27;1834:2;;1885:1;1882;1875:12;1834:2;1921:6;1908:20;1898:30;;1951:18;1943:6;1940:30;1937:2;;;1983:1;1980;1973:12;1937:2;2020:4;2012:6;2008:17;1996:29;;2074:3;2066:4;2058:6;2054:17;2044:8;2040:32;2037:41;2034:2;;;2091:1;2088;2081:12;2034:2;1824:277;;;;;:::o;2107:139::-;2153:5;2191:6;2178:20;2169:29;;2207:33;2234:5;2207:33;:::i;:::-;2159:87;;;;:::o;2252:137::-;2297:5;2335:6;2322:20;2313:29;;2351:32;2377:5;2351:32;:::i;:::-;2303:86;;;;:::o;2395:137::-;2440:5;2478:6;2465:20;2456:29;;2494:32;2520:5;2494:32;:::i;:::-;2446:86;;;;:::o;2538:262::-;2597:6;2646:2;2634:9;2625:7;2621:23;2617:32;2614:2;;;2662:1;2659;2652:12;2614:2;2705:1;2730:53;2775:7;2766:6;2755:9;2751:22;2730:53;:::i;:::-;2720:63;;2676:117;2604:196;;;;:::o;2806:407::-;2874:6;2882;2931:2;2919:9;2910:7;2906:23;2902:32;2899:2;;;2947:1;2944;2937:12;2899:2;2990:1;3015:53;3060:7;3051:6;3040:9;3036:22;3015:53;:::i;:::-;3005:63;;2961:117;3117:2;3143:53;3188:7;3179:6;3168:9;3164:22;3143:53;:::i;:::-;3133:63;;3088:118;2889:324;;;;;:::o;3219:552::-;3296:6;3304;3312;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3377:1;3374;3367:12;3329:2;3420:1;3445:53;3490:7;3481:6;3470:9;3466:22;3445:53;:::i;:::-;3435:63;;3391:117;3547:2;3573:53;3618:7;3609:6;3598:9;3594:22;3573:53;:::i;:::-;3563:63;;3518:118;3675:2;3701:53;3746:7;3737:6;3726:9;3722:22;3701:53;:::i;:::-;3691:63;;3646:118;3319:452;;;;;:::o;3777:809::-;3872:6;3880;3888;3896;3945:3;3933:9;3924:7;3920:23;3916:33;3913:2;;;3962:1;3959;3952:12;3913:2;4005:1;4030:53;4075:7;4066:6;4055:9;4051:22;4030:53;:::i;:::-;4020:63;;3976:117;4132:2;4158:53;4203:7;4194:6;4183:9;4179:22;4158:53;:::i;:::-;4148:63;;4103:118;4260:2;4286:53;4331:7;4322:6;4311:9;4307:22;4286:53;:::i;:::-;4276:63;;4231:118;4416:2;4405:9;4401:18;4388:32;4447:18;4439:6;4436:30;4433:2;;;4479:1;4476;4469:12;4433:2;4507:62;4561:7;4552:6;4541:9;4537:22;4507:62;:::i;:::-;4497:72;;4359:220;3903:683;;;;;;;:::o;4592:401::-;4657:6;4665;4714:2;4702:9;4693:7;4689:23;4685:32;4682:2;;;4730:1;4727;4720:12;4682:2;4773:1;4798:53;4843:7;4834:6;4823:9;4819:22;4798:53;:::i;:::-;4788:63;;4744:117;4900:2;4926:50;4968:7;4959:6;4948:9;4944:22;4926:50;:::i;:::-;4916:60;;4871:115;4672:321;;;;;:::o;4999:407::-;5067:6;5075;5124:2;5112:9;5103:7;5099:23;5095:32;5092:2;;;5140:1;5137;5130:12;5092:2;5183:1;5208:53;5253:7;5244:6;5233:9;5229:22;5208:53;:::i;:::-;5198:63;;5154:117;5310:2;5336:53;5381:7;5372:6;5361:9;5357:22;5336:53;:::i;:::-;5326:63;;5281:118;5082:324;;;;;:::o;5412:829::-;5509:6;5517;5525;5533;5541;5590:3;5578:9;5569:7;5565:23;5561:33;5558:2;;;5607:1;5604;5597:12;5558:2;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5805:2;5794:9;5790:18;5777:32;5836:18;5828:6;5825:30;5822:2;;;5868:1;5865;5858:12;5822:2;5904:64;5960:7;5951:6;5940:9;5936:22;5904:64;:::i;:::-;5886:82;;;;5748:230;6017:2;6043:53;6088:7;6079:6;6068:9;6064:22;6043:53;:::i;:::-;6033:63;;5988:118;6145:2;6171:53;6216:7;6207:6;6196:9;6192:22;6171:53;:::i;:::-;6161:63;;6116:118;5548:693;;;;;;;;:::o;6247:260::-;6305:6;6354:2;6342:9;6333:7;6329:23;6325:32;6322:2;;;6370:1;6367;6360:12;6322:2;6413:1;6438:52;6482:7;6473:6;6462:9;6458:22;6438:52;:::i;:::-;6428:62;;6384:116;6312:195;;;;:::o;6513:282::-;6582:6;6631:2;6619:9;6610:7;6606:23;6602:32;6599:2;;;6647:1;6644;6637:12;6599:2;6690:1;6715:63;6770:7;6761:6;6750:9;6746:22;6715:63;:::i;:::-;6705:73;;6661:127;6589:206;;;;:::o;6801:395::-;6872:6;6880;6929:2;6917:9;6908:7;6904:23;6900:32;6897:2;;;6945:1;6942;6935:12;6897:2;7016:1;7005:9;7001:17;6988:31;7046:18;7038:6;7035:30;7032:2;;;7078:1;7075;7068:12;7032:2;7114:65;7171:7;7162:6;7151:9;7147:22;7114:65;:::i;:::-;7096:83;;;;6959:230;6887:309;;;;;:::o;7202:262::-;7261:6;7310:2;7298:9;7289:7;7285:23;7281:32;7278:2;;;7326:1;7323;7316:12;7278:2;7369:1;7394:53;7439:7;7430:6;7419:9;7415:22;7394:53;:::i;:::-;7384:63;;7340:117;7268:196;;;;:::o;7470:407::-;7538:6;7546;7595:2;7583:9;7574:7;7570:23;7566:32;7563:2;;;7611:1;7608;7601:12;7563:2;7654:1;7679:53;7724:7;7715:6;7704:9;7700:22;7679:53;:::i;:::-;7669:63;;7625:117;7781:2;7807:53;7852:7;7843:6;7832:9;7828:22;7807:53;:::i;:::-;7797:63;;7752:118;7553:324;;;;;:::o;7883:552::-;7960:6;7968;7976;8025:2;8013:9;8004:7;8000:23;7996:32;7993:2;;;8041:1;8038;8031:12;7993:2;8084:1;8109:53;8154:7;8145:6;8134:9;8130:22;8109:53;:::i;:::-;8099:63;;8055:117;8211:2;8237:53;8282:7;8273:6;8262:9;8258:22;8237:53;:::i;:::-;8227:63;;8182:118;8339:2;8365:53;8410:7;8401:6;8390:9;8386:22;8365:53;:::i;:::-;8355:63;;8310:118;7983:452;;;;;:::o;8441:260::-;8499:6;8548:2;8536:9;8527:7;8523:23;8519:32;8516:2;;;8564:1;8561;8554:12;8516:2;8607:1;8632:52;8676:7;8667:6;8656:9;8652:22;8632:52;:::i;:::-;8622:62;;8578:116;8506:195;;;;:::o;8707:260::-;8765:6;8814:2;8802:9;8793:7;8789:23;8785:32;8782:2;;;8830:1;8827;8820:12;8782:2;8873:1;8898:52;8942:7;8933:6;8922:9;8918:22;8898:52;:::i;:::-;8888:62;;8844:116;8772:195;;;;:::o;8973:108::-;9050:24;9068:5;9050:24;:::i;:::-;9045:3;9038:37;9028:53;;:::o;9087:118::-;9174:24;9192:5;9174:24;:::i;:::-;9169:3;9162:37;9152:53;;:::o;9211:157::-;9316:45;9336:24;9354:5;9336:24;:::i;:::-;9316:45;:::i;:::-;9311:3;9304:58;9294:74;;:::o;9374:99::-;9445:21;9460:5;9445:21;:::i;:::-;9440:3;9433:34;9423:50;;:::o;9479:109::-;9560:21;9575:5;9560:21;:::i;:::-;9555:3;9548:34;9538:50;;:::o;9594:118::-;9681:24;9699:5;9681:24;:::i;:::-;9676:3;9669:37;9659:53;;:::o;9718:157::-;9823:45;9843:24;9861:5;9843:24;:::i;:::-;9823:45;:::i;:::-;9818:3;9811:58;9801:74;;:::o;9881:360::-;9967:3;9995:38;10027:5;9995:38;:::i;:::-;10049:70;10112:6;10107:3;10049:70;:::i;:::-;10042:77;;10128:52;10173:6;10168:3;10161:4;10154:5;10150:16;10128:52;:::i;:::-;10205:29;10227:6;10205:29;:::i;:::-;10200:3;10196:39;10189:46;;9971:270;;;;;:::o;10247:364::-;10335:3;10363:39;10396:5;10363:39;:::i;:::-;10418:71;10482:6;10477:3;10418:71;:::i;:::-;10411:78;;10498:52;10543:6;10538:3;10531:4;10524:5;10520:16;10498:52;:::i;:::-;10575:29;10597:6;10575:29;:::i;:::-;10570:3;10566:39;10559:46;;10339:272;;;;;:::o;10617:377::-;10723:3;10751:39;10784:5;10751:39;:::i;:::-;10806:89;10888:6;10883:3;10806:89;:::i;:::-;10799:96;;10904:52;10949:6;10944:3;10937:4;10930:5;10926:16;10904:52;:::i;:::-;10981:6;10976:3;10972:16;10965:23;;10727:267;;;;;:::o;11000:366::-;11142:3;11163:67;11227:2;11222:3;11163:67;:::i;:::-;11156:74;;11239:93;11328:3;11239:93;:::i;:::-;11357:2;11352:3;11348:12;11341:19;;11146:220;;;:::o;11372:366::-;11514:3;11535:67;11599:2;11594:3;11535:67;:::i;:::-;11528:74;;11611:93;11700:3;11611:93;:::i;:::-;11729:2;11724:3;11720:12;11713:19;;11518:220;;;:::o;11744:366::-;11886:3;11907:67;11971:2;11966:3;11907:67;:::i;:::-;11900:74;;11983:93;12072:3;11983:93;:::i;:::-;12101:2;12096:3;12092:12;12085:19;;11890:220;;;:::o;12116:366::-;12258:3;12279:67;12343:2;12338:3;12279:67;:::i;:::-;12272:74;;12355:93;12444:3;12355:93;:::i;:::-;12473:2;12468:3;12464:12;12457:19;;12262:220;;;:::o;12488:402::-;12648:3;12669:85;12751:2;12746:3;12669:85;:::i;:::-;12662:92;;12763:93;12852:3;12763:93;:::i;:::-;12881:2;12876:3;12872:12;12865:19;;12652:238;;;:::o;12896:366::-;13038:3;13059:67;13123:2;13118:3;13059:67;:::i;:::-;13052:74;;13135:93;13224:3;13135:93;:::i;:::-;13253:2;13248:3;13244:12;13237:19;;13042:220;;;:::o;13268:366::-;13410:3;13431:67;13495:2;13490:3;13431:67;:::i;:::-;13424:74;;13507:93;13596:3;13507:93;:::i;:::-;13625:2;13620:3;13616:12;13609:19;;13414:220;;;:::o;13640:366::-;13782:3;13803:67;13867:2;13862:3;13803:67;:::i;:::-;13796:74;;13879:93;13968:3;13879:93;:::i;:::-;13997:2;13992:3;13988:12;13981:19;;13786:220;;;:::o;14012:366::-;14154:3;14175:67;14239:2;14234:3;14175:67;:::i;:::-;14168:74;;14251:93;14340:3;14251:93;:::i;:::-;14369:2;14364:3;14360:12;14353:19;;14158:220;;;:::o;14384:366::-;14526:3;14547:67;14611:2;14606:3;14547:67;:::i;:::-;14540:74;;14623:93;14712:3;14623:93;:::i;:::-;14741:2;14736:3;14732:12;14725:19;;14530:220;;;:::o;14756:366::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14902:220;;;:::o;15128:366::-;15270:3;15291:67;15355:2;15350:3;15291:67;:::i;:::-;15284:74;;15367:93;15456:3;15367:93;:::i;:::-;15485:2;15480:3;15476:12;15469:19;;15274:220;;;:::o;15500:366::-;15642:3;15663:67;15727:2;15722:3;15663:67;:::i;:::-;15656:74;;15739:93;15828:3;15739:93;:::i;:::-;15857:2;15852:3;15848:12;15841:19;;15646:220;;;:::o;15872:366::-;16014:3;16035:67;16099:2;16094:3;16035:67;:::i;:::-;16028:74;;16111:93;16200:3;16111:93;:::i;:::-;16229:2;16224:3;16220:12;16213:19;;16018:220;;;:::o;16244:366::-;16386:3;16407:67;16471:2;16466:3;16407:67;:::i;:::-;16400:74;;16483:93;16572:3;16483:93;:::i;:::-;16601:2;16596:3;16592:12;16585:19;;16390:220;;;:::o;16616:398::-;16775:3;16796:83;16877:1;16872:3;16796:83;:::i;:::-;16789:90;;16888:93;16977:3;16888:93;:::i;:::-;17006:1;17001:3;16997:11;16990:18;;16779:235;;;:::o;17020:366::-;17162:3;17183:67;17247:2;17242:3;17183:67;:::i;:::-;17176:74;;17259:93;17348:3;17259:93;:::i;:::-;17377:2;17372:3;17368:12;17361:19;;17166:220;;;:::o;17392:366::-;17534:3;17555:67;17619:2;17614:3;17555:67;:::i;:::-;17548:74;;17631:93;17720:3;17631:93;:::i;:::-;17749:2;17744:3;17740:12;17733:19;;17538:220;;;:::o;17764:366::-;17906:3;17927:67;17991:2;17986:3;17927:67;:::i;:::-;17920:74;;18003:93;18092:3;18003:93;:::i;:::-;18121:2;18116:3;18112:12;18105:19;;17910:220;;;:::o;18136:366::-;18278:3;18299:67;18363:2;18358:3;18299:67;:::i;:::-;18292:74;;18375:93;18464:3;18375:93;:::i;:::-;18493:2;18488:3;18484:12;18477:19;;18282:220;;;:::o;18578:699::-;18739:4;18734:3;18730:14;18826:4;18819:5;18815:16;18809:23;18845:63;18902:4;18897:3;18893:14;18879:12;18845:63;:::i;:::-;18754:164;19010:4;19003:5;18999:16;18993:23;19029:61;19084:4;19079:3;19075:14;19061:12;19029:61;:::i;:::-;18928:172;19184:4;19177:5;19173:16;19167:23;19203:57;19254:4;19249:3;19245:14;19231:12;19203:57;:::i;:::-;19110:160;18708:569;;;:::o;19283:118::-;19370:24;19388:5;19370:24;:::i;:::-;19365:3;19358:37;19348:53;;:::o;19407:157::-;19512:45;19532:24;19550:5;19532:24;:::i;:::-;19512:45;:::i;:::-;19507:3;19500:58;19490:74;;:::o;19570:115::-;19655:23;19672:5;19655:23;:::i;:::-;19650:3;19643:36;19633:52;;:::o;19691:105::-;19766:23;19783:5;19766:23;:::i;:::-;19761:3;19754:36;19744:52;;:::o;19802:115::-;19887:23;19904:5;19887:23;:::i;:::-;19882:3;19875:36;19865:52;;:::o;19923:112::-;20006:22;20022:5;20006:22;:::i;:::-;20001:3;19994:35;19984:51;;:::o;20041:435::-;20221:3;20243:95;20334:3;20325:6;20243:95;:::i;:::-;20236:102;;20355:95;20446:3;20437:6;20355:95;:::i;:::-;20348:102;;20467:3;20460:10;;20225:251;;;;;:::o;20482:522::-;20695:3;20717:148;20861:3;20717:148;:::i;:::-;20710:155;;20875:75;20946:3;20937:6;20875:75;:::i;:::-;20975:2;20970:3;20966:12;20959:19;;20995:3;20988:10;;20699:305;;;;:::o;21010:379::-;21194:3;21216:147;21359:3;21216:147;:::i;:::-;21209:154;;21380:3;21373:10;;21198:191;;;:::o;21395:397::-;21535:3;21550:75;21621:3;21612:6;21550:75;:::i;:::-;21650:2;21645:3;21641:12;21634:19;;21663:75;21734:3;21725:6;21663:75;:::i;:::-;21763:2;21758:3;21754:12;21747:19;;21783:3;21776:10;;21539:253;;;;;:::o;21798:222::-;21891:4;21929:2;21918:9;21914:18;21906:26;;21942:71;22010:1;21999:9;21995:17;21986:6;21942:71;:::i;:::-;21896:124;;;;:::o;22026:640::-;22221:4;22259:3;22248:9;22244:19;22236:27;;22273:71;22341:1;22330:9;22326:17;22317:6;22273:71;:::i;:::-;22354:72;22422:2;22411:9;22407:18;22398:6;22354:72;:::i;:::-;22436;22504:2;22493:9;22489:18;22480:6;22436:72;:::i;:::-;22555:9;22549:4;22545:20;22540:2;22529:9;22525:18;22518:48;22583:76;22654:4;22645:6;22583:76;:::i;:::-;22575:84;;22226:440;;;;;;;:::o;22672:210::-;22759:4;22797:2;22786:9;22782:18;22774:26;;22810:65;22872:1;22861:9;22857:17;22848:6;22810:65;:::i;:::-;22764:118;;;;:::o;22888:545::-;23061:4;23099:3;23088:9;23084:19;23076:27;;23113:71;23181:1;23170:9;23166:17;23157:6;23113:71;:::i;:::-;23194:68;23258:2;23247:9;23243:18;23234:6;23194:68;:::i;:::-;23272:72;23340:2;23329:9;23325:18;23316:6;23272:72;:::i;:::-;23354;23422:2;23411:9;23407:18;23398:6;23354:72;:::i;:::-;23066:367;;;;;;;:::o;23439:313::-;23552:4;23590:2;23579:9;23575:18;23567:26;;23639:9;23633:4;23629:20;23625:1;23614:9;23610:17;23603:47;23667:78;23740:4;23731:6;23667:78;:::i;:::-;23659:86;;23557:195;;;;:::o;23758:419::-;23924:4;23962:2;23951:9;23947:18;23939:26;;24011:9;24005:4;24001:20;23997:1;23986:9;23982:17;23975:47;24039:131;24165:4;24039:131;:::i;:::-;24031:139;;23929:248;;;:::o;24183:419::-;24349:4;24387:2;24376:9;24372:18;24364:26;;24436:9;24430:4;24426:20;24422:1;24411:9;24407:17;24400:47;24464:131;24590:4;24464:131;:::i;:::-;24456:139;;24354:248;;;:::o;24608:419::-;24774:4;24812:2;24801:9;24797:18;24789:26;;24861:9;24855:4;24851:20;24847:1;24836:9;24832:17;24825:47;24889:131;25015:4;24889:131;:::i;:::-;24881:139;;24779:248;;;:::o;25033:419::-;25199:4;25237:2;25226:9;25222:18;25214:26;;25286:9;25280:4;25276:20;25272:1;25261:9;25257:17;25250:47;25314:131;25440:4;25314:131;:::i;:::-;25306:139;;25204:248;;;:::o;25458:419::-;25624:4;25662:2;25651:9;25647:18;25639:26;;25711:9;25705:4;25701:20;25697:1;25686:9;25682:17;25675:47;25739:131;25865:4;25739:131;:::i;:::-;25731:139;;25629:248;;;:::o;25883:419::-;26049:4;26087:2;26076:9;26072:18;26064:26;;26136:9;26130:4;26126:20;26122:1;26111:9;26107:17;26100:47;26164:131;26290:4;26164:131;:::i;:::-;26156:139;;26054:248;;;:::o;26308:419::-;26474:4;26512:2;26501:9;26497:18;26489:26;;26561:9;26555:4;26551:20;26547:1;26536:9;26532:17;26525:47;26589:131;26715:4;26589:131;:::i;:::-;26581:139;;26479:248;;;:::o;26733:419::-;26899:4;26937:2;26926:9;26922:18;26914:26;;26986:9;26980:4;26976:20;26972:1;26961:9;26957:17;26950:47;27014:131;27140:4;27014:131;:::i;:::-;27006:139;;26904:248;;;:::o;27158:419::-;27324:4;27362:2;27351:9;27347:18;27339:26;;27411:9;27405:4;27401:20;27397:1;27386:9;27382:17;27375:47;27439:131;27565:4;27439:131;:::i;:::-;27431:139;;27329:248;;;:::o;27583:419::-;27749:4;27787:2;27776:9;27772:18;27764:26;;27836:9;27830:4;27826:20;27822:1;27811:9;27807:17;27800:47;27864:131;27990:4;27864:131;:::i;:::-;27856:139;;27754:248;;;:::o;28008:419::-;28174:4;28212:2;28201:9;28197:18;28189:26;;28261:9;28255:4;28251:20;28247:1;28236:9;28232:17;28225:47;28289:131;28415:4;28289:131;:::i;:::-;28281:139;;28179:248;;;:::o;28433:419::-;28599:4;28637:2;28626:9;28622:18;28614:26;;28686:9;28680:4;28676:20;28672:1;28661:9;28657:17;28650:47;28714:131;28840:4;28714:131;:::i;:::-;28706:139;;28604:248;;;:::o;28858:419::-;29024:4;29062:2;29051:9;29047:18;29039:26;;29111:9;29105:4;29101:20;29097:1;29086:9;29082:17;29075:47;29139:131;29265:4;29139:131;:::i;:::-;29131:139;;29029:248;;;:::o;29283:419::-;29449:4;29487:2;29476:9;29472:18;29464:26;;29536:9;29530:4;29526:20;29522:1;29511:9;29507:17;29500:47;29564:131;29690:4;29564:131;:::i;:::-;29556:139;;29454:248;;;:::o;29708:419::-;29874:4;29912:2;29901:9;29897:18;29889:26;;29961:9;29955:4;29951:20;29947:1;29936:9;29932:17;29925:47;29989:131;30115:4;29989:131;:::i;:::-;29981:139;;29879:248;;;:::o;30133:419::-;30299:4;30337:2;30326:9;30322:18;30314:26;;30386:9;30380:4;30376:20;30372:1;30361:9;30357:17;30350:47;30414:131;30540:4;30414:131;:::i;:::-;30406:139;;30304:248;;;:::o;30558:419::-;30724:4;30762:2;30751:9;30747:18;30739:26;;30811:9;30805:4;30801:20;30797:1;30786:9;30782:17;30775:47;30839:131;30965:4;30839:131;:::i;:::-;30831:139;;30729:248;;;:::o;30983:419::-;31149:4;31187:2;31176:9;31172:18;31164:26;;31236:9;31230:4;31226:20;31222:1;31211:9;31207:17;31200:47;31264:131;31390:4;31264:131;:::i;:::-;31256:139;;31154:248;;;:::o;31408:350::-;31565:4;31603:2;31592:9;31588:18;31580:26;;31616:135;31748:1;31737:9;31733:17;31724:6;31616:135;:::i;:::-;31570:188;;;;:::o;31764:222::-;31857:4;31895:2;31884:9;31880:18;31872:26;;31908:71;31976:1;31965:9;31961:17;31952:6;31908:71;:::i;:::-;31862:124;;;;:::o;31992:644::-;32187:4;32225:3;32214:9;32210:19;32202:27;;32239:69;32305:1;32294:9;32290:17;32281:6;32239:69;:::i;:::-;32318:70;32384:2;32373:9;32369:18;32360:6;32318:70;:::i;:::-;32398;32464:2;32453:9;32449:18;32440:6;32398:70;:::i;:::-;32478;32544:2;32533:9;32529:18;32520:6;32478:70;:::i;:::-;32558:71;32624:3;32613:9;32609:19;32600:6;32558:71;:::i;:::-;32192:444;;;;;;;;:::o;32642:129::-;32676:6;32703:20;;:::i;:::-;32693:30;;32732:33;32760:4;32752:6;32732:33;:::i;:::-;32683:88;;;:::o;32777:75::-;32810:6;32843:2;32837:9;32827:19;;32817:35;:::o;32858:307::-;32919:4;33009:18;33001:6;32998:30;32995:2;;;33031:18;;:::i;:::-;32995:2;33069:29;33091:6;33069:29;:::i;:::-;33061:37;;33153:4;33147;33143:15;33135:23;;32924:241;;;:::o;33171:98::-;33222:6;33256:5;33250:12;33240:22;;33229:40;;;:::o;33275:99::-;33327:6;33361:5;33355:12;33345:22;;33334:40;;;:::o;33380:168::-;33463:11;33497:6;33492:3;33485:19;33537:4;33532:3;33528:14;33513:29;;33475:73;;;;:::o;33554:147::-;33655:11;33692:3;33677:18;;33667:34;;;;:::o;33707:169::-;33791:11;33825:6;33820:3;33813:19;33865:4;33860:3;33856:14;33841:29;;33803:73;;;;:::o;33882:148::-;33984:11;34021:3;34006:18;;33996:34;;;;:::o;34036:305::-;34076:3;34095:20;34113:1;34095:20;:::i;:::-;34090:25;;34129:20;34147:1;34129:20;:::i;:::-;34124:25;;34283:1;34215:66;34211:74;34208:1;34205:81;34202:2;;;34289:18;;:::i;:::-;34202:2;34333:1;34330;34326:9;34319:16;;34080:261;;;;:::o;34347:185::-;34387:1;34404:20;34422:1;34404:20;:::i;:::-;34399:25;;34438:20;34456:1;34438:20;:::i;:::-;34433:25;;34477:1;34467:2;;34482:18;;:::i;:::-;34467:2;34524:1;34521;34517:9;34512:14;;34389:143;;;;:::o;34538:348::-;34578:7;34601:20;34619:1;34601:20;:::i;:::-;34596:25;;34635:20;34653:1;34635:20;:::i;:::-;34630:25;;34823:1;34755:66;34751:74;34748:1;34745:81;34740:1;34733:9;34726:17;34722:105;34719:2;;;34830:18;;:::i;:::-;34719:2;34878:1;34875;34871:9;34860:20;;34586:300;;;;:::o;34892:191::-;34932:4;34952:20;34970:1;34952:20;:::i;:::-;34947:25;;34986:20;35004:1;34986:20;:::i;:::-;34981:25;;35025:1;35022;35019:8;35016:2;;;35030:18;;:::i;:::-;35016:2;35075:1;35072;35068:9;35060:17;;34937:146;;;;:::o;35089:96::-;35126:7;35155:24;35173:5;35155:24;:::i;:::-;35144:35;;35134:51;;;:::o;35191:90::-;35225:7;35268:5;35261:13;35254:21;35243:32;;35233:48;;;:::o;35287:77::-;35324:7;35353:5;35342:16;;35332:32;;;:::o;35370:149::-;35406:7;35446:66;35439:5;35435:78;35424:89;;35414:105;;;:::o;35525:126::-;35562:7;35602:42;35595:5;35591:54;35580:65;;35570:81;;;:::o;35657:77::-;35694:7;35723:5;35712:16;;35702:32;;;:::o;35740:93::-;35776:7;35816:10;35809:5;35805:22;35794:33;;35784:49;;;:::o;35839:101::-;35875:7;35915:18;35908:5;35904:30;35893:41;;35883:57;;;:::o;35946:86::-;35981:7;36021:4;36014:5;36010:16;35999:27;;35989:43;;;:::o;36038:154::-;36122:6;36117:3;36112;36099:30;36184:1;36175:6;36170:3;36166:16;36159:27;36089:103;;;:::o;36198:307::-;36266:1;36276:113;36290:6;36287:1;36284:13;36276:113;;;36375:1;36370:3;36366:11;36360:18;36356:1;36351:3;36347:11;36340:39;36312:2;36309:1;36305:10;36300:15;;36276:113;;;36407:6;36404:1;36401:13;36398:2;;;36487:1;36478:6;36473:3;36469:16;36462:27;36398:2;36247:258;;;;:::o;36511:320::-;36555:6;36592:1;36586:4;36582:12;36572:22;;36639:1;36633:4;36629:12;36660:18;36650:2;;36716:4;36708:6;36704:17;36694:27;;36650:2;36778;36770:6;36767:14;36747:18;36744:38;36741:2;;;36797:18;;:::i;:::-;36741:2;36562:269;;;;:::o;36837:281::-;36920:27;36942:4;36920:27;:::i;:::-;36912:6;36908:40;37050:6;37038:10;37035:22;37014:18;37002:10;36999:34;36996:62;36993:2;;;37061:18;;:::i;:::-;36993:2;37101:10;37097:2;37090:22;36880:238;;;:::o;37124:233::-;37163:3;37186:24;37204:5;37186:24;:::i;:::-;37177:33;;37232:66;37225:5;37222:77;37219:2;;;37302:18;;:::i;:::-;37219:2;37349:1;37342:5;37338:13;37331:20;;37167:190;;;:::o;37363:100::-;37402:7;37431:26;37451:5;37431:26;:::i;:::-;37420:37;;37410:53;;;:::o;37469:79::-;37508:7;37537:5;37526:16;;37516:32;;;:::o;37554:94::-;37593:7;37622:20;37636:5;37622:20;:::i;:::-;37611:31;;37601:47;;;:::o;37654:79::-;37693:7;37722:5;37711:16;;37701:32;;;:::o;37739:176::-;37771:1;37788:20;37806:1;37788:20;:::i;:::-;37783:25;;37822:20;37840:1;37822:20;:::i;:::-;37817:25;;37861:1;37851:2;;37866:18;;:::i;:::-;37851:2;37907:1;37904;37900:9;37895:14;;37773:142;;;;:::o;37921:180::-;37969:77;37966:1;37959:88;38066:4;38063:1;38056:15;38090:4;38087:1;38080:15;38107:180;38155:77;38152:1;38145:88;38252:4;38249:1;38242:15;38276:4;38273:1;38266:15;38293:180;38341:77;38338:1;38331:88;38438:4;38435:1;38428:15;38462:4;38459:1;38452:15;38479:180;38527:77;38524:1;38517:88;38624:4;38621:1;38614:15;38648:4;38645:1;38638:15;38665:102;38706:6;38757:2;38753:7;38748:2;38741:5;38737:14;38733:28;38723:38;;38713:54;;;:::o;38773:94::-;38806:8;38854:5;38850:2;38846:14;38825:35;;38815:52;;;:::o;38873:174::-;39013:26;39009:1;39001:6;38997:14;38990:50;38979:68;:::o;39053:166::-;39193:18;39189:1;39181:6;39177:14;39170:42;39159:60;:::o;39225:170::-;39365:22;39361:1;39353:6;39349:14;39342:46;39331:64;:::o;39401:181::-;39541:33;39537:1;39529:6;39525:14;39518:57;39507:75;:::o;39588:214::-;39728:66;39724:1;39716:6;39712:14;39705:90;39694:108;:::o;39808:162::-;39948:14;39944:1;39936:6;39932:14;39925:38;39914:56;:::o;39976:225::-;40116:34;40112:1;40104:6;40100:14;40093:58;40185:8;40180:2;40172:6;40168:15;40161:33;40082:119;:::o;40207:166::-;40347:18;40343:1;40335:6;40331:14;40324:42;40313:60;:::o;40379:167::-;40519:19;40515:1;40507:6;40503:14;40496:43;40485:61;:::o;40552:221::-;40692:34;40688:1;40680:6;40676:14;40669:58;40761:4;40756:2;40748:6;40744:15;40737:29;40658:115;:::o;40779:168::-;40919:20;40915:1;40907:6;40903:14;40896:44;40885:62;:::o;40953:221::-;41093:34;41089:1;41081:6;41077:14;41070:58;41162:4;41157:2;41149:6;41145:15;41138:29;41059:115;:::o;41180:178::-;41320:30;41316:1;41308:6;41304:14;41297:54;41286:72;:::o;41364:182::-;41504:34;41500:1;41492:6;41488:14;41481:58;41470:76;:::o;41552:162::-;41692:14;41688:1;41680:6;41676:14;41669:38;41658:56;:::o;41720:114::-;41826:8;:::o;41840:161::-;41980:13;41976:1;41968:6;41964:14;41957:37;41946:55;:::o;42007:181::-;42147:33;42143:1;42135:6;42131:14;42124:57;42113:75;:::o;42194:173::-;42334:25;42330:1;42322:6;42318:14;42311:49;42300:67;:::o;42373:167::-;42513:19;42509:1;42501:6;42497:14;42490:43;42479:61;:::o;42546:122::-;42619:24;42637:5;42619:24;:::i;:::-;42612:5;42609:35;42599:2;;42658:1;42655;42648:12;42599:2;42589:79;:::o;42674:116::-;42744:21;42759:5;42744:21;:::i;:::-;42737:5;42734:32;42724:2;;42780:1;42777;42770:12;42724:2;42714:76;:::o;42796:122::-;42869:24;42887:5;42869:24;:::i;:::-;42862:5;42859:35;42849:2;;42908:1;42905;42898:12;42849:2;42839:79;:::o;42924:120::-;42996:23;43013:5;42996:23;:::i;:::-;42989:5;42986:34;42976:2;;43034:1;43031;43024:12;42976:2;42966:78;:::o;43050:122::-;43123:24;43141:5;43123:24;:::i;:::-;43116:5;43113:35;43103:2;;43162:1;43159;43152:12;43103:2;43093:79;:::o;43178:120::-;43250:23;43267:5;43250:23;:::i;:::-;43243:5;43240:34;43230:2;;43288:1;43285;43278:12;43230:2;43220:78;:::o;43304:120::-;43376:23;43393:5;43376:23;:::i;:::-;43369:5;43366:34;43356:2;;43414:1;43411;43404:12;43356:2;43346:78;:::o

Swarm Source

ipfs://ec386747b33cad7040990992a0887a3c4c94944c2e93ce4cbd448c014cfe11bc
Loading...
Loading
Loading...
Loading
[ 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.