ETH Price: $3,353.18 (+0.86%)

Token

MetaFriends (MF)
 

Overview

Max Total Supply

1,188 MF

Holders

451

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
14 MF
0x2483642f47D0E6d6604324bCE34aA5d0eD376088
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:
MF

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// 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;
    }
}
// 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);
    }
}

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (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;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 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));
    }
}


pragma solidity ^0.8.0;

/**
 * @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 the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // 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) private _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;

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

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

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

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

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

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

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

        revert("ERC721A: unable to determine the owner of token");
    }

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

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

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

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

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

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

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

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

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

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

// File: openzeppelin-solidity/contracts/utils/math/SafeMath.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.7;

contract MF is ERC721A, Ownable, ReentrancyGuard {
    using ECDSA for bytes32;
    using SafeMath for uint256;

    string public baseURI;
    address private _signer;
    address private _auction_owner;
    uint256 public immutable maxMintPerTx;
    uint256 public immutable maxSupply;
    uint256 public PRICE = 0.1 ether;
    uint256 private airdropItems = 300;
    uint256 public firstPhaseItems = 3333;
    uint256 public DutchAuctionMintItems = 6667;
    uint256 public DutchAuctionMintCount = 0;
    uint256 public airdropMintCount = 0;
    bool public preMintPaused = true;
    bool public publicMintPaused = true;
    bool public airdropPaused = true;
    uint256 public immutable refundPeriod = 7 days;
    address public refundAddress;
    uint256 public lastMintTime;
    
    mapping(address => uint256) private preMintLists; 
    mapping(address => bool) private airdropLists;
    mapping(uint256 => bool) public hasRefunded;
    mapping(uint256=>uint256) private timestampID;
    event Minted(address minter, uint256 amount);

    constructor(
        string memory initBaseURI,
        address signer,
        address _refundAddr,
        uint256 _maxBatchSize,
        uint256 _collectionSize
    ) ERC721A("MetaFriends", "MF", _maxBatchSize, _collectionSize) {
        baseURI = initBaseURI;
        _signer = signer;
        refundAddress = _refundAddr;
        maxMintPerTx = _maxBatchSize;
        maxSupply = _collectionSize;
    }

    function _hash(string calldata salt, address _address)
        internal
        view
        returns (bytes32)
    {
        return keccak256(abi.encode(salt, address(this), _address));
    }

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

    function _recover(bytes32 hash, bytes memory token)
        internal
        pure
        returns (address)
    {
        return hash.toEthSignedMessageHash().recover(token);
    }

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

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(_baseURI(), Strings.toString(_tokenId), ".json"));
    }

    function _setMintTime(uint256 amount) internal{
        if (amount == 5){
            timestampID[totalSupply()-1] = block.timestamp;
            timestampID[totalSupply()-2] = block.timestamp;
            timestampID[totalSupply()-3] = block.timestamp;
            timestampID[totalSupply()-4] = block.timestamp;
            timestampID[totalSupply()-5] = block.timestamp;
        }
        if (amount == 4){
            timestampID[totalSupply()-1] = block.timestamp;
            timestampID[totalSupply()-2] = block.timestamp;
            timestampID[totalSupply()-3] = block.timestamp;
            timestampID[totalSupply()-4] = block.timestamp;
            
        }
        if (amount == 3){
            timestampID[totalSupply()-1] = block.timestamp;
            timestampID[totalSupply()-2] = block.timestamp;
            timestampID[totalSupply()-3] = block.timestamp;
        }
        if (amount == 2){
            timestampID[totalSupply()-1] = block.timestamp;
            timestampID[totalSupply()-2] = block.timestamp;
        }else{
            timestampID[totalSupply()-1] = block.timestamp;
        }  

        lastMintTime = block.timestamp;
    }

    function preMint(
        uint256 amount,
        string calldata salt,
        bytes calldata token
    ) external payable {
        require(!preMintPaused, "MF: preMint Paused");
        require(tx.origin == msg.sender, "MF: contract is not allowed to mint.");
        require(_verify(_hash(salt, msg.sender), token), "MF: Invalid token.");
        require(preMintLists[msg.sender] + amount <= 2, "MF: The wallet has already minted during preslae sale."); 
        require(totalSupply() - airdropMintCount - DutchAuctionMintCount + amount <= firstPhaseItems - airdropItems, "MF: Max supply exceeded.");
        _safeMint(msg.sender, amount);
        _setMintTime(amount);
        refundIfOver(PRICE * amount);
        preMintLists[msg.sender] += amount;
        emit Minted(msg.sender, amount);
    }

    function publicMint(
        uint256 amount
    ) external payable {
        require(!publicMintPaused, "MF: publicMint Paused");
        require(amount <= maxMintPerTx, "MF: Max 5 per tx");
        require(tx.origin == msg.sender, "MF: contract is not allowed to mint.");
        require(totalSupply() - airdropMintCount - DutchAuctionMintCount + amount <= firstPhaseItems - airdropItems, "MF: Max supply exceeded.");
        _safeMint(msg.sender, amount);
        _setMintTime(amount);
        refundIfOver(PRICE * amount);
        emit Minted(msg.sender, amount);
    }

     // mint by auction contract address, use auction
    function DutchAuctionMint(uint amount, address to) external payable {
        require(DutchAuctionMintCount + amount <= DutchAuctionMintItems, "MF: Max supply exceeded.");
        require(_auction_owner == msg.sender,"not allowed");
        _safeMint(to, amount);
        DutchAuctionMintCount += amount;
        emit Minted(to, amount);
    }
    
    // airdrop
    function airdropToAddr(address[] memory toList) external onlyOwner {
        require(airdropMintCount + toList.length <= airdropItems,"MF: Max supply exceeded.");
        for(uint i; i< toList.length; i++) {
            _safeMint(toList[i],1);
            airdropMintCount += 1;
            emit Minted(msg.sender, 1);
        }  
    }

    function airdropMint(
        string calldata salt,
        bytes calldata token
    ) external payable {
        require(!airdropPaused, "MF: airdropMint Paused");
        require(!airdropLists[msg.sender],"MF: The wallet has already minted during airdrop.");
        uint256 amount = 1;
        require(airdropMintCount + amount <= airdropItems, "MF: Max supply exceeded.");
        require(_verify(_hash(salt, msg.sender), token), "MF: Invalid token.");
        require(tx.origin == msg.sender, "MF: contract is not allowed to mint.");
        _safeMint(msg.sender, amount);
        airdropMintCount += amount;
        airdropLists[msg.sender] = true;
        emit Minted(msg.sender, amount);
    }

    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "MF: Need to send more ETH.");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

    function refund(uint256 tokenId) external {
        require(msg.sender == ownerOf(tokenId), "Not token owner");
        require(!hasRefunded[tokenId], "Already refunded");
        require(block.timestamp - timestampID[tokenId] < refundPeriod, "refund time expire");
        hasRefunded[tokenId] = true;
        transferFrom(msg.sender, refundAddress, tokenId);
        Address.sendValue(payable(msg.sender), PRICE);
    }

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

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


    // ADMIN FUNCTIONALITY
    function setPreMintPaused(bool _preMintPaused) external onlyOwner {
        preMintPaused = _preMintPaused;
    }

    function setPublicMintPaused(bool _publicMintPaused) external onlyOwner {
        publicMintPaused = _publicMintPaused;
    }

    function setAirdropPaused(bool _airdropPaused) external onlyOwner {
        airdropPaused = _airdropPaused;
    }

    function setAuctionAddr(address __address) external onlyOwner {
        _auction_owner = __address;
    }

    function setSignerAddr(address __address) external onlyOwner {
        _signer = __address;
    }

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

    /**
     * @dev Withdraw the contract balance to the dev address or splitter address
     */

    function withdrawAll() external onlyOwner {
        require(block.timestamp - lastMintTime > refundPeriod, "Refund period not over");
        uint256 balance = address(this).balance;
        require(balance > 0);
        _widthdraw(0xc2AE244F0c0025864ac1Fd87Af4c8202bcD9a78F, balance.mul(70).div(100));
        _widthdraw(0x902e3BF232Da0cBf91232a15460171f613ADad8e, address(this).balance);
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_refundAddr","type":"address"},{"internalType":"uint256","name":"_maxBatchSize","type":"uint256"},{"internalType":"uint256","name":"_collectionSize","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","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":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"DutchAuctionMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"DutchAuctionMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DutchAuctionMintItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"salt","type":"string"},{"internalType":"bytes","name":"token","type":"bytes"}],"name":"airdropMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"airdropMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toList","type":"address[]"}],"name":"airdropToAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstPhaseItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasRefunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastMintTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"amount","type":"uint256"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"bytes","name":"token","type":"bytes"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_airdropPaused","type":"bool"}],"name":"setAirdropPaused","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":"address","name":"__address","type":"address"}],"name":"setAuctionAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_preMintPaused","type":"bool"}],"name":"setPreMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicMintPaused","type":"bool"}],"name":"setPublicMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"__address","type":"address"}],"name":"setSignerAddr","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":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526000808055600781905567016345785d8a0000600d5561012c600e55610d05600f55611a0b60105560118190556012556013805462ffffff19166201010117905562093a80610100523480156200005b57600080fd5b506040516200420d3803806200420d8339810160408190526200007e916200034f565b6040518060400160405280600b81526020016a4d657461467269656e647360a81b8152506040518060400160405280600281526020016126a360f11b8152508383600081116200012c5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200018e5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000123565b8351620001a39060019060208701906200028c565b508251620001b99060029060208601906200028c565b5060a09190915260805250620001d19050336200023a565b60016009558451620001eb90600a9060208801906200028c565b50600b80546001600160a01b0319166001600160a01b03958616179055601380546301000000600160b81b031916630100000094909516939093029390931790915560c05260e05250620004b8565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200029a9062000465565b90600052602060002090601f016020900481019282620002be576000855562000309565b82601f10620002d957805160ff191683800117855562000309565b8280016001018555821562000309579182015b8281111562000309578251825591602001919060010190620002ec565b50620003179291506200031b565b5090565b5b808211156200031757600081556001016200031c565b80516001600160a01b03811681146200034a57600080fd5b919050565b600080600080600060a086880312156200036857600080fd5b85516001600160401b03808211156200038057600080fd5b818801915088601f8301126200039557600080fd5b815181811115620003aa57620003aa620004a2565b604051601f8201601f19908116603f01168101908382118183101715620003d557620003d5620004a2565b81604052828152602093508b84848701011115620003f257600080fd5b600091505b82821015620004165784820184015181830185015290830190620003f7565b82821115620004285760008484830101525b98506200043a91505088820162000332565b955050506200044c6040870162000332565b6060870151608090970151959894975095949392505050565b600181811c908216806200047a57607f821691505b602082108114156200049c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05161010051613ce6620005276000396000818161073d01528181610cac01526113fd015260006108270152600081816108910152610e450152600081816128250152818161284f0152612d8c0152600081816122c001526122f20152613ce66000f3fe6080604052600436106102c95760003560e01c80636c0360eb11610175578063a97c1e93116100dc578063d5abeb0111610095578063de7fcb1d1161006f578063de7fcb1d1461087f578063e985e9c5146108b3578063ea457d0f146108fc578063f2fde38b1461091c57600080fd5b8063d5abeb0114610815578063d7224ba014610849578063de1c2b561461085f57600080fd5b8063a97c1e931461075f578063b88d4fde14610772578063bb6e96f114610792578063c23fcdef146107a5578063c87b56dd146107d5578063d4a91c80146107f557600080fd5b80639231ab2a1161012e5780639231ab2a1461068057806395d89b41146106cd5780639d463520146106e25780639eee57b0146106f8578063a22cb4651461070b578063a6a3b5b41461072b57600080fd5b80636c0360eb146105ed57806370a0823114610602578063715018a614610622578063853828b6146106375780638d859f3e1461064c5780638da5cb5b1461066257600080fd5b8063339493481161023457806346813817116101ed57806355f804b3116101c757806355f804b3146105735780636352211e1461059357806364a2bc56146105b357806368abfea9146105d357600080fd5b8063468138171461051d5780634f6ccce71461053d57806353181c9d1461055d57600080fd5b8063339493481461047257806333d9d5fd1461049257806337b3db73146104b15780633851d1e9146104d15780633f0d6258146104e757806342842e0e146104fd57600080fd5b806318160ddd1161028657806318160ddd146103ca57806323b872dd146103df578063278ecde1146103ff5780632d20fb601461041f5780632db115441461043f5780632f745c591461045257600080fd5b806301ffc9a7146102ce57806306fdde0314610303578063081812fc14610325578063083d7d041461035d578063095ea7b3146103815780630cb61f6c146103a3575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046136da565b61093c565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186109a9565b6040516102fa9190613964565b34801561033157600080fd5b506103456103403660046137c0565b610a3b565b6040516001600160a01b0390911681526020016102fa565b34801561036957600080fd5b5061037360115481565b6040519081526020016102fa565b34801561038d57600080fd5b506103a161039c3660046135e2565b610acb565b005b3480156103af57600080fd5b5060135461034590630100000090046001600160a01b031681565b3480156103d657600080fd5b50600054610373565b3480156103eb57600080fd5b506103a16103fa3660046134bd565b610be3565b34801561040b57600080fd5b506103a161041a3660046137c0565b610bee565b34801561042b57600080fd5b506103a161043a3660046137c0565b610d60565b6103a161044d3660046137c0565b610df3565b34801561045e57600080fd5b5061037361046d3660046135e2565b610f74565b34801561047e57600080fd5b506103a161048d3660046136bf565b6110e1565b34801561049e57600080fd5b506013546102ee90610100900460ff1681565b3480156104bd57600080fd5b506103a16104cc36600461346f565b611125565b3480156104dd57600080fd5b50610373600f5481565b3480156104f357600080fd5b5061037360125481565b34801561050957600080fd5b506103a16105183660046134bd565b611171565b34801561052957600080fd5b506103a16105383660046136bf565b61118c565b34801561054957600080fd5b506103736105583660046137c0565b6111d2565b34801561056957600080fd5b5061037360105481565b34801561057f57600080fd5b506103a161058e366004613714565b611234565b34801561059f57600080fd5b506103456105ae3660046137c0565b61126a565b3480156105bf57600080fd5b506013546102ee9062010000900460ff1681565b3480156105df57600080fd5b506013546102ee9060ff1681565b3480156105f957600080fd5b5061031861127c565b34801561060e57600080fd5b5061037361061d36600461346f565b61130a565b34801561062e57600080fd5b506103a161139b565b34801561064357600080fd5b506103a16113d1565b34801561065857600080fd5b50610373600d5481565b34801561066e57600080fd5b506008546001600160a01b0316610345565b34801561068c57600080fd5b506106a061069b3660046137c0565b6114cc565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102fa565b3480156106d957600080fd5b506103186114e9565b3480156106ee57600080fd5b5061037360145481565b6103a16107063660046137fc565b6114f8565b34801561071757600080fd5b506103a16107263660046135b8565b611748565b34801561073757600080fd5b506103737f000000000000000000000000000000000000000000000000000000000000000081565b6103a161076d3660046137d9565b61180d565b34801561077e57600080fd5b506103a161078d3660046134f9565b6118d9565b6103a16107a0366004613755565b611912565b3480156107b157600080fd5b506102ee6107c03660046137c0565b60176020526000908152604090205460ff1681565b3480156107e157600080fd5b506103186107f03660046137c0565b611b1a565b34801561080157600080fd5b506103a161081036600461360c565b611b54565b34801561082157600080fd5b506103737f000000000000000000000000000000000000000000000000000000000000000081565b34801561085557600080fd5b5061037360075481565b34801561086b57600080fd5b506103a161087a36600461346f565b611c33565b34801561088b57600080fd5b506103737f000000000000000000000000000000000000000000000000000000000000000081565b3480156108bf57600080fd5b506102ee6108ce36600461348a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561090857600080fd5b506103a16109173660046136bf565b611c7f565b34801561092857600080fd5b506103a161093736600461346f565b611cbc565b60006001600160e01b031982166380ac58cd60e01b148061096d57506001600160e01b03198216635b5e139f60e01b145b8061098857506001600160e01b0319821663780e9d6360e01b145b806109a357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109b890613ba2565b80601f01602080910402602001604051908101604052809291908181526020018280546109e490613ba2565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b5050505050905090565b6000610a48826000541190565b610aaf5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610ad68261126a565b9050806001600160a01b0316836001600160a01b03161415610b455760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610aa6565b336001600160a01b0382161480610b615750610b6181336108ce565b610bd35760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610aa6565b610bde838383611d54565b505050565b610bde838383611db0565b610bf78161126a565b6001600160a01b0316336001600160a01b031614610c495760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610aa6565b60008181526017602052604090205460ff1615610c9b5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c99599d5b99195960821b6044820152606401610aa6565b6000818152601860205260409020547f000000000000000000000000000000000000000000000000000000000000000090610cd69042613b48565b10610d185760405162461bcd60e51b8152602060048201526012602482015271726566756e642074696d652065787069726560701b6044820152606401610aa6565b6000818152601760205260409020805460ff19166001179055601354610d519033906001600160a01b0363010000009091041683610be3565b610d5d33600d54612136565b50565b6008546001600160a01b03163314610d8a5760405162461bcd60e51b8152600401610aa6906139ae565b60026009541415610ddd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aa6565b6002600955610deb8161224f565b506001600955565b601354610100900460ff1615610e435760405162461bcd60e51b815260206004820152601560248201527413518e881c1d589b1a58d35a5b9d0814185d5cd959605a1b6044820152606401610aa6565b7f0000000000000000000000000000000000000000000000000000000000000000811115610ea65760405162461bcd60e51b815260206004820152601060248201526f09a8c74409ac2f0406a40e0cae440e8f60831b6044820152606401610aa6565b323314610ec55760405162461bcd60e51b8152600401610aa690613a36565b600e54600f54610ed59190613b48565b81601154601254610ee560005490565b610eef9190613b48565b610ef99190613b48565b610f039190613ad5565b1115610f215760405162461bcd60e51b8152600401610aa690613977565b610f2b3382612438565b610f3481612452565b610f4a81600d54610f459190613b01565b612715565b6040805133815260208101839052600080516020613c91833981519152910160405180910390a150565b6000610f7f8361130a565b8210610fd85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610aa6565b600080549080805b83811015611081576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561103257805192505b876001600160a01b0316836001600160a01b0316141561106e5786841415611060575093506109a392505050565b8361106a81613bdd565b9450505b508061107981613bdd565b915050610fe0565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610aa6565b6008546001600160a01b0316331461110b5760405162461bcd60e51b8152600401610aa6906139ae565b601380549115156101000261ff0019909216919091179055565b6008546001600160a01b0316331461114f5760405162461bcd60e51b8152600401610aa6906139ae565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b610bde838383604051806020016040528060008152506118d9565b6008546001600160a01b031633146111b65760405162461bcd60e51b8152600401610aa6906139ae565b60138054911515620100000262ff000019909216919091179055565b6000805482106112305760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610aa6565b5090565b6008546001600160a01b0316331461125e5760405162461bcd60e51b8152600401610aa6906139ae565b610bde600a8383613372565b6000611275826127a3565b5192915050565b600a805461128990613ba2565b80601f01602080910402602001604051908101604052809291908181526020018280546112b590613ba2565b80156113025780601f106112d757610100808354040283529160200191611302565b820191906000526020600020905b8154815290600101906020018083116112e557829003601f168201915b505050505081565b60006001600160a01b0382166113765760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610aa6565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146113c55760405162461bcd60e51b8152600401610aa6906139ae565b6113cf600061294c565b565b6008546001600160a01b031633146113fb5760405162461bcd60e51b8152600401610aa6906139ae565b7f00000000000000000000000000000000000000000000000000000000000000006014544261142a9190613b48565b116114705760405162461bcd60e51b81526020600482015260166024820152752932b33ab732103832b934b7b2103737ba1037bb32b960511b6044820152606401610aa6565b478061147b57600080fd5b6114ae73c2ae244f0c0025864ac1fd87af4c8202bcd9a78f6114a960646114a385604661299e565b906129b1565b6129bd565b610d5d73902e3bf232da0cbf91232a15460171f613adad8e476129bd565b60408051808201909152600080825260208201526109a3826127a3565b6060600280546109b890613ba2565b60135460ff16156115405760405162461bcd60e51b815260206004820152601260248201527113518e881c1c99535a5b9d0814185d5cd95960721b6044820152606401610aa6565b32331461155f5760405162461bcd60e51b8152600401610aa690613a36565b6115a961156d858533612a53565b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8b92505050565b6115ea5760405162461bcd60e51b815260206004820152601260248201527126a31d1024b73b30b634b2103a37b5b2b71760711b6044820152606401610aa6565b33600090815260156020526040902054600290611608908790613ad5565b11156116755760405162461bcd60e51b815260206004820152603660248201527f4d463a205468652077616c6c65742068617320616c7265616479206d696e74656044820152753210323ab934b73390383932b9b630b29039b0b6329760511b6064820152608401610aa6565b600e54600f546116859190613b48565b8560115460125461169560005490565b61169f9190613b48565b6116a99190613b48565b6116b39190613ad5565b11156116d15760405162461bcd60e51b8152600401610aa690613977565b6116db3386612438565b6116e485612452565b6116f585600d54610f459190613b01565b3360009081526015602052604081208054879290611714908490613ad5565b90915550506040805133815260208101879052600080516020613c9183398151915291015b60405180910390a15050505050565b6001600160a01b0382163314156117a15760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610aa6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6010548260115461181e9190613ad5565b111561183c5760405162461bcd60e51b8152600401610aa690613977565b600c546001600160a01b031633146118845760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610aa6565b61188e8183612438565b81601160008282546118a09190613ad5565b9091555050604080516001600160a01b038316815260208101849052600080516020613c91833981519152910160405180910390a15050565b6118e4848484611db0565b6118f084848484612ab5565b61190c5760405162461bcd60e51b8152600401610aa6906139e3565b50505050565b60135462010000900460ff16156119645760405162461bcd60e51b815260206004820152601660248201527513518e88185a5c991c9bdc135a5b9d0814185d5cd95960521b6044820152606401610aa6565b3360009081526016602052604090205460ff16156119de5760405162461bcd60e51b815260206004820152603160248201527f4d463a205468652077616c6c65742068617320616c7265616479206d696e74656044820152703210323ab934b7339030b4b9323937b81760791b6064820152608401610aa6565b600e54601254600191906119f3908390613ad5565b1115611a115760405162461bcd60e51b8152600401610aa690613977565b611a5b611a1f868633612a53565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8b92505050565b611a9c5760405162461bcd60e51b815260206004820152601260248201527126a31d1024b73b30b634b2103a37b5b2b71760711b6044820152606401610aa6565b323314611abb5760405162461bcd60e51b8152600401610aa690613a36565b611ac53382612438565b8060126000828254611ad79190613ad5565b909155505033600081815260166020908152604091829020805460ff1916600117905581519283528201839052600080516020613c918339815191529101611739565b6060611b24612bc3565b611b2d83612bd2565b604051602001611b3e9291906138a1565b6040516020818303038152906040529050919050565b6008546001600160a01b03163314611b7e5760405162461bcd60e51b8152600401610aa6906139ae565b600e548151601254611b909190613ad5565b1115611bae5760405162461bcd60e51b8152600401610aa690613977565b60005b8151811015611c2f57611bde828281518110611bcf57611bcf613c4e565b60200260200101516001612438565b600160126000828254611bf19190613ad5565b90915550506040805133815260016020820152600080516020613c91833981519152910160405180910390a180611c2781613bdd565b915050611bb1565b5050565b6008546001600160a01b03163314611c5d5760405162461bcd60e51b8152600401610aa6906139ae565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314611ca95760405162461bcd60e51b8152600401610aa6906139ae565b6013805460ff1916911515919091179055565b6008546001600160a01b03163314611ce65760405162461bcd60e51b8152600401610aa6906139ae565b6001600160a01b038116611d4b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aa6565b610d5d8161294c565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611dbb826127a3565b80519091506000906001600160a01b0316336001600160a01b03161480611df2575033611de784610a3b565b6001600160a01b0316145b80611e0457508151611e0490336108ce565b905080611e6e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610aa6565b846001600160a01b031682600001516001600160a01b031614611ee25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610aa6565b6001600160a01b038416611f465760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610aa6565b611f566000848460000151611d54565b6001600160a01b0385166000908152600460205260408120805460019290611f889084906001600160801b0316613b20565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611fd491859116613aaa565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561205b846001613ad5565b6000818152600360205260409020549091506001600160a01b03166120ec57612085816000541190565b156120ec5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b804710156121865760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aa6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146121d3576040519150601f19603f3d011682016040523d82523d6000602084013e6121d8565b606091505b5050905080610bde5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aa6565b6007548161229f5760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610aa6565b600060016122ad8484613ad5565b6122b79190613b48565b90506122e460017f0000000000000000000000000000000000000000000000000000000000000000613b48565b8111156123195761231660017f0000000000000000000000000000000000000000000000000000000000000000613b48565b90505b612324816000541190565b61237f5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610aa6565b815b818111612424576000818152600360205260409020546001600160a01b03166124125760006123af826127a3565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b8061241c81613bdd565b915050612381565b50612430816001613ad5565b600755505050565b611c2f828260405180602001604052806000815250612ccf565b8060051415612537574260186000600161246b60005490565b6124759190613b48565b8152602001908152602001600020819055504260186000600261249760005490565b6124a19190613b48565b815260200190815260200160002081905550426018600060036124c360005490565b6124cd9190613b48565b815260200190815260200160002081905550426018600060046124ef60005490565b6124f99190613b48565b8152602001908152602001600020819055504260186000600561251b60005490565b6125259190613b48565b81526020810191909152604001600020555b80600414156125f0574260186000600161255060005490565b61255a9190613b48565b8152602001908152602001600020819055504260186000600261257c60005490565b6125869190613b48565b815260200190815260200160002081905550426018600060036125a860005490565b6125b29190613b48565b815260200190815260200160002081905550426018600060046125d460005490565b6125de9190613b48565b81526020810191909152604001600020555b806003141561267d574260186000600161260960005490565b6126139190613b48565b8152602001908152602001600020819055504260186000600261263560005490565b61263f9190613b48565b8152602001908152602001600020819055504260186000600361266160005490565b61266b9190613b48565b81526020810191909152604001600020555b80600214156126e2574260186000600161269660005490565b6126a09190613b48565b815260200190815260200160002081905550426018600060026126c260005490565b6126cc9190613b48565b815260208101919091526040016000205561270e565b426018600060016126f260005490565b6126fc9190613b48565b81526020810191909152604001600020555b5042601455565b803410156127655760405162461bcd60e51b815260206004820152601a60248201527f4d463a204e65656420746f2073656e64206d6f7265204554482e0000000000006044820152606401610aa6565b80341115610d5d57336108fc61277b8334613b48565b6040518115909202916000818181858888f19350505050158015611c2f573d6000803e3d6000fd5b60408051808201909152600080825260208201526127c2826000541190565b6128215760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610aa6565b60007f00000000000000000000000000000000000000000000000000000000000000008310612882576128747f000000000000000000000000000000000000000000000000000000000000000084613b48565b61287f906001613ad5565b90505b825b8181106128eb576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156128d857949350505050565b50806128e381613b8b565b915050612884565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610aa6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006129aa8284613b01565b9392505050565b60006129aa8284613aed565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b5050905080610bde5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610aa6565b600083833084604051602001612a6c949392919061391d565b6040516020818303038152906040528051906020012090509392505050565b600b546000906001600160a01b0316612aa48484612fa9565b6001600160a01b0316149392505050565b60006001600160a01b0384163b15612bb757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612af99033908990889088906004016138e0565b602060405180830381600087803b158015612b1357600080fd5b505af1925050508015612b43575060408051601f3d908101601f19168201909252612b40918101906136f7565b60015b612b9d573d808015612b71576040519150601f19603f3d011682016040523d82523d6000602084013e612b76565b606091505b508051612b955760405162461bcd60e51b8152600401610aa6906139e3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612bbb565b5060015b949350505050565b6060600a80546109b890613ba2565b606081612bf65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c205780612c0a81613bdd565b9150612c199050600a83613aed565b9150612bfa565b6000816001600160401b03811115612c3a57612c3a613c64565b6040519080825280601f01601f191660200182016040528015612c64576020820181803683370190505b5090505b8415612bbb57612c79600183613b48565b9150612c86600a86613bf8565b612c91906030613ad5565b60f81b818381518110612ca657612ca6613c4e565b60200101906001600160f81b031916908160001a905350612cc8600a86613aed565b9450612c68565b6000546001600160a01b038416612d325760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610aa6565b612d3d816000541190565b15612d8a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610aa6565b7f0000000000000000000000000000000000000000000000000000000000000000831115612e055760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610aa6565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612e61908790613aaa565b6001600160801b03168152602001858360200151612e7f9190613aaa565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612f9e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612f626000888488612ab5565b612f7e5760405162461bcd60e51b8152600401610aa6906139e3565b81612f8881613bdd565b9250508080612f9690613bdd565b915050612f15565b50600081905561212e565b60006129aa82613006856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906000806000613016858561302b565b915091506130238161309b565b509392505050565b6000808251604114156130625760208301516040840151606085015160001a61305687828585613256565b94509450505050613094565b82516040141561308c5760208301516040840151613081868383613343565b935093505050613094565b506000905060025b9250929050565b60008160048111156130af576130af613c38565b14156130b85750565b60018160048111156130cc576130cc613c38565b141561311a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610aa6565b600281600481111561312e5761312e613c38565b141561317c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610aa6565b600381600481111561319057613190613c38565b14156131e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610aa6565b60048160048111156131fd576131fd613c38565b1415610d5d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610aa6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561328d575060009050600361333a565b8460ff16601b141580156132a557508460ff16601c14155b156132b6575060009050600461333a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561330a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133335760006001925092505061333a565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161336487828885613256565b935093505050935093915050565b82805461337e90613ba2565b90600052602060002090601f0160209004810192826133a057600085556133e6565b82601f106133b95782800160ff198235161785556133e6565b828001600101855582156133e6579182015b828111156133e65782358255916020019190600101906133cb565b506112309291505b8082111561123057600081556001016133ee565b80356001600160a01b038116811461341957600080fd5b919050565b8035801515811461341957600080fd5b60008083601f84011261344057600080fd5b5081356001600160401b0381111561345757600080fd5b60208301915083602082850101111561309457600080fd5b60006020828403121561348157600080fd5b6129aa82613402565b6000806040838503121561349d57600080fd5b6134a683613402565b91506134b460208401613402565b90509250929050565b6000806000606084860312156134d257600080fd5b6134db84613402565b92506134e960208501613402565b9150604084013590509250925092565b6000806000806080858703121561350f57600080fd5b61351885613402565b93506020613527818701613402565b93506040860135925060608601356001600160401b038082111561354a57600080fd5b818801915088601f83011261355e57600080fd5b81358181111561357057613570613c64565b613582601f8201601f19168501613a7a565b9150808252898482850101111561359857600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156135cb57600080fd5b6135d483613402565b91506134b46020840161341e565b600080604083850312156135f557600080fd5b6135fe83613402565b946020939093013593505050565b6000602080838503121561361f57600080fd5b82356001600160401b038082111561363657600080fd5b818501915085601f83011261364a57600080fd5b81358181111561365c5761365c613c64565b8060051b915061366d848301613a7a565b8181528481019084860184860187018a101561368857600080fd5b600095505b838610156136b25761369e81613402565b83526001959095019491860191860161368d565b5098975050505050505050565b6000602082840312156136d157600080fd5b6129aa8261341e565b6000602082840312156136ec57600080fd5b81356129aa81613c7a565b60006020828403121561370957600080fd5b81516129aa81613c7a565b6000806020838503121561372757600080fd5b82356001600160401b0381111561373d57600080fd5b6137498582860161342e565b90969095509350505050565b6000806000806040858703121561376b57600080fd5b84356001600160401b038082111561378257600080fd5b61378e8883890161342e565b909650945060208701359150808211156137a757600080fd5b506137b48782880161342e565b95989497509550505050565b6000602082840312156137d257600080fd5b5035919050565b600080604083850312156137ec57600080fd5b823591506134b460208401613402565b60008060008060006060868803121561381457600080fd5b8535945060208601356001600160401b038082111561383257600080fd5b61383e89838a0161342e565b9096509450604088013591508082111561385757600080fd5b506138648882890161342e565b969995985093965092949392505050565b6000815180845261388d816020860160208601613b5f565b601f01601f19169290920160200192915050565b600083516138b3818460208801613b5f565b8351908301906138c7818360208801613b5f565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061391390830184613875565b9695505050505050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b6020815260006129aa6020830184613875565b60208082526018908201527f4d463a204d617820737570706c792065786365656465642e0000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526024908201527f4d463a20636f6e7472616374206973206e6f7420616c6c6f77656420746f206d60408201526334b73a1760e11b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715613aa257613aa2613c64565b604052919050565b60006001600160801b03808316818516808303821115613acc57613acc613c0c565b01949350505050565b60008219821115613ae857613ae8613c0c565b500190565b600082613afc57613afc613c22565b500490565b6000816000190483118215151615613b1b57613b1b613c0c565b500290565b60006001600160801b0383811690831681811015613b4057613b40613c0c565b039392505050565b600082821015613b5a57613b5a613c0c565b500390565b60005b83811015613b7a578181015183820152602001613b62565b8381111561190c5750506000910152565b600081613b9a57613b9a613c0c565b506000190190565b600181811c90821680613bb657607f821691505b60208210811415613bd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613bf157613bf1613c0c565b5060010190565b600082613c0757613c07613c22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5d57600080fdfe30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfea2646970667358221220c6f84eedd0dcbf887905024306dbd5c314ae109da8d2afec371daedb281ca39664736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000bf2734420224433cf6186ce23d83c9388fe4430000000000000000000000000c2ae244f0c0025864ac1fd87af4c8202bcd9a78f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f6d657461667269656e64732e73332e75732d776573742d322e616d617a6f6e6177732e636f6d2f6170692f00000000000000000000000000

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80636c0360eb11610175578063a97c1e93116100dc578063d5abeb0111610095578063de7fcb1d1161006f578063de7fcb1d1461087f578063e985e9c5146108b3578063ea457d0f146108fc578063f2fde38b1461091c57600080fd5b8063d5abeb0114610815578063d7224ba014610849578063de1c2b561461085f57600080fd5b8063a97c1e931461075f578063b88d4fde14610772578063bb6e96f114610792578063c23fcdef146107a5578063c87b56dd146107d5578063d4a91c80146107f557600080fd5b80639231ab2a1161012e5780639231ab2a1461068057806395d89b41146106cd5780639d463520146106e25780639eee57b0146106f8578063a22cb4651461070b578063a6a3b5b41461072b57600080fd5b80636c0360eb146105ed57806370a0823114610602578063715018a614610622578063853828b6146106375780638d859f3e1461064c5780638da5cb5b1461066257600080fd5b8063339493481161023457806346813817116101ed57806355f804b3116101c757806355f804b3146105735780636352211e1461059357806364a2bc56146105b357806368abfea9146105d357600080fd5b8063468138171461051d5780634f6ccce71461053d57806353181c9d1461055d57600080fd5b8063339493481461047257806333d9d5fd1461049257806337b3db73146104b15780633851d1e9146104d15780633f0d6258146104e757806342842e0e146104fd57600080fd5b806318160ddd1161028657806318160ddd146103ca57806323b872dd146103df578063278ecde1146103ff5780632d20fb601461041f5780632db115441461043f5780632f745c591461045257600080fd5b806301ffc9a7146102ce57806306fdde0314610303578063081812fc14610325578063083d7d041461035d578063095ea7b3146103815780630cb61f6c146103a3575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046136da565b61093c565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186109a9565b6040516102fa9190613964565b34801561033157600080fd5b506103456103403660046137c0565b610a3b565b6040516001600160a01b0390911681526020016102fa565b34801561036957600080fd5b5061037360115481565b6040519081526020016102fa565b34801561038d57600080fd5b506103a161039c3660046135e2565b610acb565b005b3480156103af57600080fd5b5060135461034590630100000090046001600160a01b031681565b3480156103d657600080fd5b50600054610373565b3480156103eb57600080fd5b506103a16103fa3660046134bd565b610be3565b34801561040b57600080fd5b506103a161041a3660046137c0565b610bee565b34801561042b57600080fd5b506103a161043a3660046137c0565b610d60565b6103a161044d3660046137c0565b610df3565b34801561045e57600080fd5b5061037361046d3660046135e2565b610f74565b34801561047e57600080fd5b506103a161048d3660046136bf565b6110e1565b34801561049e57600080fd5b506013546102ee90610100900460ff1681565b3480156104bd57600080fd5b506103a16104cc36600461346f565b611125565b3480156104dd57600080fd5b50610373600f5481565b3480156104f357600080fd5b5061037360125481565b34801561050957600080fd5b506103a16105183660046134bd565b611171565b34801561052957600080fd5b506103a16105383660046136bf565b61118c565b34801561054957600080fd5b506103736105583660046137c0565b6111d2565b34801561056957600080fd5b5061037360105481565b34801561057f57600080fd5b506103a161058e366004613714565b611234565b34801561059f57600080fd5b506103456105ae3660046137c0565b61126a565b3480156105bf57600080fd5b506013546102ee9062010000900460ff1681565b3480156105df57600080fd5b506013546102ee9060ff1681565b3480156105f957600080fd5b5061031861127c565b34801561060e57600080fd5b5061037361061d36600461346f565b61130a565b34801561062e57600080fd5b506103a161139b565b34801561064357600080fd5b506103a16113d1565b34801561065857600080fd5b50610373600d5481565b34801561066e57600080fd5b506008546001600160a01b0316610345565b34801561068c57600080fd5b506106a061069b3660046137c0565b6114cc565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102fa565b3480156106d957600080fd5b506103186114e9565b3480156106ee57600080fd5b5061037360145481565b6103a16107063660046137fc565b6114f8565b34801561071757600080fd5b506103a16107263660046135b8565b611748565b34801561073757600080fd5b506103737f0000000000000000000000000000000000000000000000000000000000093a8081565b6103a161076d3660046137d9565b61180d565b34801561077e57600080fd5b506103a161078d3660046134f9565b6118d9565b6103a16107a0366004613755565b611912565b3480156107b157600080fd5b506102ee6107c03660046137c0565b60176020526000908152604090205460ff1681565b3480156107e157600080fd5b506103186107f03660046137c0565b611b1a565b34801561080157600080fd5b506103a161081036600461360c565b611b54565b34801561082157600080fd5b506103737f000000000000000000000000000000000000000000000000000000000000271081565b34801561085557600080fd5b5061037360075481565b34801561086b57600080fd5b506103a161087a36600461346f565b611c33565b34801561088b57600080fd5b506103737f000000000000000000000000000000000000000000000000000000000000000581565b3480156108bf57600080fd5b506102ee6108ce36600461348a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561090857600080fd5b506103a16109173660046136bf565b611c7f565b34801561092857600080fd5b506103a161093736600461346f565b611cbc565b60006001600160e01b031982166380ac58cd60e01b148061096d57506001600160e01b03198216635b5e139f60e01b145b8061098857506001600160e01b0319821663780e9d6360e01b145b806109a357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109b890613ba2565b80601f01602080910402602001604051908101604052809291908181526020018280546109e490613ba2565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b5050505050905090565b6000610a48826000541190565b610aaf5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610ad68261126a565b9050806001600160a01b0316836001600160a01b03161415610b455760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610aa6565b336001600160a01b0382161480610b615750610b6181336108ce565b610bd35760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610aa6565b610bde838383611d54565b505050565b610bde838383611db0565b610bf78161126a565b6001600160a01b0316336001600160a01b031614610c495760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610aa6565b60008181526017602052604090205460ff1615610c9b5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c99599d5b99195960821b6044820152606401610aa6565b6000818152601860205260409020547f0000000000000000000000000000000000000000000000000000000000093a8090610cd69042613b48565b10610d185760405162461bcd60e51b8152602060048201526012602482015271726566756e642074696d652065787069726560701b6044820152606401610aa6565b6000818152601760205260409020805460ff19166001179055601354610d519033906001600160a01b0363010000009091041683610be3565b610d5d33600d54612136565b50565b6008546001600160a01b03163314610d8a5760405162461bcd60e51b8152600401610aa6906139ae565b60026009541415610ddd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aa6565b6002600955610deb8161224f565b506001600955565b601354610100900460ff1615610e435760405162461bcd60e51b815260206004820152601560248201527413518e881c1d589b1a58d35a5b9d0814185d5cd959605a1b6044820152606401610aa6565b7f0000000000000000000000000000000000000000000000000000000000000005811115610ea65760405162461bcd60e51b815260206004820152601060248201526f09a8c74409ac2f0406a40e0cae440e8f60831b6044820152606401610aa6565b323314610ec55760405162461bcd60e51b8152600401610aa690613a36565b600e54600f54610ed59190613b48565b81601154601254610ee560005490565b610eef9190613b48565b610ef99190613b48565b610f039190613ad5565b1115610f215760405162461bcd60e51b8152600401610aa690613977565b610f2b3382612438565b610f3481612452565b610f4a81600d54610f459190613b01565b612715565b6040805133815260208101839052600080516020613c91833981519152910160405180910390a150565b6000610f7f8361130a565b8210610fd85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610aa6565b600080549080805b83811015611081576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561103257805192505b876001600160a01b0316836001600160a01b0316141561106e5786841415611060575093506109a392505050565b8361106a81613bdd565b9450505b508061107981613bdd565b915050610fe0565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610aa6565b6008546001600160a01b0316331461110b5760405162461bcd60e51b8152600401610aa6906139ae565b601380549115156101000261ff0019909216919091179055565b6008546001600160a01b0316331461114f5760405162461bcd60e51b8152600401610aa6906139ae565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b610bde838383604051806020016040528060008152506118d9565b6008546001600160a01b031633146111b65760405162461bcd60e51b8152600401610aa6906139ae565b60138054911515620100000262ff000019909216919091179055565b6000805482106112305760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610aa6565b5090565b6008546001600160a01b0316331461125e5760405162461bcd60e51b8152600401610aa6906139ae565b610bde600a8383613372565b6000611275826127a3565b5192915050565b600a805461128990613ba2565b80601f01602080910402602001604051908101604052809291908181526020018280546112b590613ba2565b80156113025780601f106112d757610100808354040283529160200191611302565b820191906000526020600020905b8154815290600101906020018083116112e557829003601f168201915b505050505081565b60006001600160a01b0382166113765760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610aa6565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146113c55760405162461bcd60e51b8152600401610aa6906139ae565b6113cf600061294c565b565b6008546001600160a01b031633146113fb5760405162461bcd60e51b8152600401610aa6906139ae565b7f0000000000000000000000000000000000000000000000000000000000093a806014544261142a9190613b48565b116114705760405162461bcd60e51b81526020600482015260166024820152752932b33ab732103832b934b7b2103737ba1037bb32b960511b6044820152606401610aa6565b478061147b57600080fd5b6114ae73c2ae244f0c0025864ac1fd87af4c8202bcd9a78f6114a960646114a385604661299e565b906129b1565b6129bd565b610d5d73902e3bf232da0cbf91232a15460171f613adad8e476129bd565b60408051808201909152600080825260208201526109a3826127a3565b6060600280546109b890613ba2565b60135460ff16156115405760405162461bcd60e51b815260206004820152601260248201527113518e881c1c99535a5b9d0814185d5cd95960721b6044820152606401610aa6565b32331461155f5760405162461bcd60e51b8152600401610aa690613a36565b6115a961156d858533612a53565b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8b92505050565b6115ea5760405162461bcd60e51b815260206004820152601260248201527126a31d1024b73b30b634b2103a37b5b2b71760711b6044820152606401610aa6565b33600090815260156020526040902054600290611608908790613ad5565b11156116755760405162461bcd60e51b815260206004820152603660248201527f4d463a205468652077616c6c65742068617320616c7265616479206d696e74656044820152753210323ab934b73390383932b9b630b29039b0b6329760511b6064820152608401610aa6565b600e54600f546116859190613b48565b8560115460125461169560005490565b61169f9190613b48565b6116a99190613b48565b6116b39190613ad5565b11156116d15760405162461bcd60e51b8152600401610aa690613977565b6116db3386612438565b6116e485612452565b6116f585600d54610f459190613b01565b3360009081526015602052604081208054879290611714908490613ad5565b90915550506040805133815260208101879052600080516020613c9183398151915291015b60405180910390a15050505050565b6001600160a01b0382163314156117a15760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610aa6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6010548260115461181e9190613ad5565b111561183c5760405162461bcd60e51b8152600401610aa690613977565b600c546001600160a01b031633146118845760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610aa6565b61188e8183612438565b81601160008282546118a09190613ad5565b9091555050604080516001600160a01b038316815260208101849052600080516020613c91833981519152910160405180910390a15050565b6118e4848484611db0565b6118f084848484612ab5565b61190c5760405162461bcd60e51b8152600401610aa6906139e3565b50505050565b60135462010000900460ff16156119645760405162461bcd60e51b815260206004820152601660248201527513518e88185a5c991c9bdc135a5b9d0814185d5cd95960521b6044820152606401610aa6565b3360009081526016602052604090205460ff16156119de5760405162461bcd60e51b815260206004820152603160248201527f4d463a205468652077616c6c65742068617320616c7265616479206d696e74656044820152703210323ab934b7339030b4b9323937b81760791b6064820152608401610aa6565b600e54601254600191906119f3908390613ad5565b1115611a115760405162461bcd60e51b8152600401610aa690613977565b611a5b611a1f868633612a53565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8b92505050565b611a9c5760405162461bcd60e51b815260206004820152601260248201527126a31d1024b73b30b634b2103a37b5b2b71760711b6044820152606401610aa6565b323314611abb5760405162461bcd60e51b8152600401610aa690613a36565b611ac53382612438565b8060126000828254611ad79190613ad5565b909155505033600081815260166020908152604091829020805460ff1916600117905581519283528201839052600080516020613c918339815191529101611739565b6060611b24612bc3565b611b2d83612bd2565b604051602001611b3e9291906138a1565b6040516020818303038152906040529050919050565b6008546001600160a01b03163314611b7e5760405162461bcd60e51b8152600401610aa6906139ae565b600e548151601254611b909190613ad5565b1115611bae5760405162461bcd60e51b8152600401610aa690613977565b60005b8151811015611c2f57611bde828281518110611bcf57611bcf613c4e565b60200260200101516001612438565b600160126000828254611bf19190613ad5565b90915550506040805133815260016020820152600080516020613c91833981519152910160405180910390a180611c2781613bdd565b915050611bb1565b5050565b6008546001600160a01b03163314611c5d5760405162461bcd60e51b8152600401610aa6906139ae565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314611ca95760405162461bcd60e51b8152600401610aa6906139ae565b6013805460ff1916911515919091179055565b6008546001600160a01b03163314611ce65760405162461bcd60e51b8152600401610aa6906139ae565b6001600160a01b038116611d4b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aa6565b610d5d8161294c565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611dbb826127a3565b80519091506000906001600160a01b0316336001600160a01b03161480611df2575033611de784610a3b565b6001600160a01b0316145b80611e0457508151611e0490336108ce565b905080611e6e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610aa6565b846001600160a01b031682600001516001600160a01b031614611ee25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610aa6565b6001600160a01b038416611f465760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610aa6565b611f566000848460000151611d54565b6001600160a01b0385166000908152600460205260408120805460019290611f889084906001600160801b0316613b20565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611fd491859116613aaa565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561205b846001613ad5565b6000818152600360205260409020549091506001600160a01b03166120ec57612085816000541190565b156120ec5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b804710156121865760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aa6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146121d3576040519150601f19603f3d011682016040523d82523d6000602084013e6121d8565b606091505b5050905080610bde5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aa6565b6007548161229f5760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610aa6565b600060016122ad8484613ad5565b6122b79190613b48565b90506122e460017f0000000000000000000000000000000000000000000000000000000000002710613b48565b8111156123195761231660017f0000000000000000000000000000000000000000000000000000000000002710613b48565b90505b612324816000541190565b61237f5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610aa6565b815b818111612424576000818152600360205260409020546001600160a01b03166124125760006123af826127a3565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b8061241c81613bdd565b915050612381565b50612430816001613ad5565b600755505050565b611c2f828260405180602001604052806000815250612ccf565b8060051415612537574260186000600161246b60005490565b6124759190613b48565b8152602001908152602001600020819055504260186000600261249760005490565b6124a19190613b48565b815260200190815260200160002081905550426018600060036124c360005490565b6124cd9190613b48565b815260200190815260200160002081905550426018600060046124ef60005490565b6124f99190613b48565b8152602001908152602001600020819055504260186000600561251b60005490565b6125259190613b48565b81526020810191909152604001600020555b80600414156125f0574260186000600161255060005490565b61255a9190613b48565b8152602001908152602001600020819055504260186000600261257c60005490565b6125869190613b48565b815260200190815260200160002081905550426018600060036125a860005490565b6125b29190613b48565b815260200190815260200160002081905550426018600060046125d460005490565b6125de9190613b48565b81526020810191909152604001600020555b806003141561267d574260186000600161260960005490565b6126139190613b48565b8152602001908152602001600020819055504260186000600261263560005490565b61263f9190613b48565b8152602001908152602001600020819055504260186000600361266160005490565b61266b9190613b48565b81526020810191909152604001600020555b80600214156126e2574260186000600161269660005490565b6126a09190613b48565b815260200190815260200160002081905550426018600060026126c260005490565b6126cc9190613b48565b815260208101919091526040016000205561270e565b426018600060016126f260005490565b6126fc9190613b48565b81526020810191909152604001600020555b5042601455565b803410156127655760405162461bcd60e51b815260206004820152601a60248201527f4d463a204e65656420746f2073656e64206d6f7265204554482e0000000000006044820152606401610aa6565b80341115610d5d57336108fc61277b8334613b48565b6040518115909202916000818181858888f19350505050158015611c2f573d6000803e3d6000fd5b60408051808201909152600080825260208201526127c2826000541190565b6128215760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610aa6565b60007f00000000000000000000000000000000000000000000000000000000000000058310612882576128747f000000000000000000000000000000000000000000000000000000000000000584613b48565b61287f906001613ad5565b90505b825b8181106128eb576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156128d857949350505050565b50806128e381613b8b565b915050612884565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610aa6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006129aa8284613b01565b9392505050565b60006129aa8284613aed565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b5050905080610bde5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610aa6565b600083833084604051602001612a6c949392919061391d565b6040516020818303038152906040528051906020012090509392505050565b600b546000906001600160a01b0316612aa48484612fa9565b6001600160a01b0316149392505050565b60006001600160a01b0384163b15612bb757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612af99033908990889088906004016138e0565b602060405180830381600087803b158015612b1357600080fd5b505af1925050508015612b43575060408051601f3d908101601f19168201909252612b40918101906136f7565b60015b612b9d573d808015612b71576040519150601f19603f3d011682016040523d82523d6000602084013e612b76565b606091505b508051612b955760405162461bcd60e51b8152600401610aa6906139e3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612bbb565b5060015b949350505050565b6060600a80546109b890613ba2565b606081612bf65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c205780612c0a81613bdd565b9150612c199050600a83613aed565b9150612bfa565b6000816001600160401b03811115612c3a57612c3a613c64565b6040519080825280601f01601f191660200182016040528015612c64576020820181803683370190505b5090505b8415612bbb57612c79600183613b48565b9150612c86600a86613bf8565b612c91906030613ad5565b60f81b818381518110612ca657612ca6613c4e565b60200101906001600160f81b031916908160001a905350612cc8600a86613aed565b9450612c68565b6000546001600160a01b038416612d325760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610aa6565b612d3d816000541190565b15612d8a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610aa6565b7f0000000000000000000000000000000000000000000000000000000000000005831115612e055760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610aa6565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612e61908790613aaa565b6001600160801b03168152602001858360200151612e7f9190613aaa565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612f9e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612f626000888488612ab5565b612f7e5760405162461bcd60e51b8152600401610aa6906139e3565b81612f8881613bdd565b9250508080612f9690613bdd565b915050612f15565b50600081905561212e565b60006129aa82613006856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906000806000613016858561302b565b915091506130238161309b565b509392505050565b6000808251604114156130625760208301516040840151606085015160001a61305687828585613256565b94509450505050613094565b82516040141561308c5760208301516040840151613081868383613343565b935093505050613094565b506000905060025b9250929050565b60008160048111156130af576130af613c38565b14156130b85750565b60018160048111156130cc576130cc613c38565b141561311a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610aa6565b600281600481111561312e5761312e613c38565b141561317c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610aa6565b600381600481111561319057613190613c38565b14156131e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610aa6565b60048160048111156131fd576131fd613c38565b1415610d5d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610aa6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561328d575060009050600361333a565b8460ff16601b141580156132a557508460ff16601c14155b156132b6575060009050600461333a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561330a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133335760006001925092505061333a565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161336487828885613256565b935093505050935093915050565b82805461337e90613ba2565b90600052602060002090601f0160209004810192826133a057600085556133e6565b82601f106133b95782800160ff198235161785556133e6565b828001600101855582156133e6579182015b828111156133e65782358255916020019190600101906133cb565b506112309291505b8082111561123057600081556001016133ee565b80356001600160a01b038116811461341957600080fd5b919050565b8035801515811461341957600080fd5b60008083601f84011261344057600080fd5b5081356001600160401b0381111561345757600080fd5b60208301915083602082850101111561309457600080fd5b60006020828403121561348157600080fd5b6129aa82613402565b6000806040838503121561349d57600080fd5b6134a683613402565b91506134b460208401613402565b90509250929050565b6000806000606084860312156134d257600080fd5b6134db84613402565b92506134e960208501613402565b9150604084013590509250925092565b6000806000806080858703121561350f57600080fd5b61351885613402565b93506020613527818701613402565b93506040860135925060608601356001600160401b038082111561354a57600080fd5b818801915088601f83011261355e57600080fd5b81358181111561357057613570613c64565b613582601f8201601f19168501613a7a565b9150808252898482850101111561359857600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156135cb57600080fd5b6135d483613402565b91506134b46020840161341e565b600080604083850312156135f557600080fd5b6135fe83613402565b946020939093013593505050565b6000602080838503121561361f57600080fd5b82356001600160401b038082111561363657600080fd5b818501915085601f83011261364a57600080fd5b81358181111561365c5761365c613c64565b8060051b915061366d848301613a7a565b8181528481019084860184860187018a101561368857600080fd5b600095505b838610156136b25761369e81613402565b83526001959095019491860191860161368d565b5098975050505050505050565b6000602082840312156136d157600080fd5b6129aa8261341e565b6000602082840312156136ec57600080fd5b81356129aa81613c7a565b60006020828403121561370957600080fd5b81516129aa81613c7a565b6000806020838503121561372757600080fd5b82356001600160401b0381111561373d57600080fd5b6137498582860161342e565b90969095509350505050565b6000806000806040858703121561376b57600080fd5b84356001600160401b038082111561378257600080fd5b61378e8883890161342e565b909650945060208701359150808211156137a757600080fd5b506137b48782880161342e565b95989497509550505050565b6000602082840312156137d257600080fd5b5035919050565b600080604083850312156137ec57600080fd5b823591506134b460208401613402565b60008060008060006060868803121561381457600080fd5b8535945060208601356001600160401b038082111561383257600080fd5b61383e89838a0161342e565b9096509450604088013591508082111561385757600080fd5b506138648882890161342e565b969995985093965092949392505050565b6000815180845261388d816020860160208601613b5f565b601f01601f19169290920160200192915050565b600083516138b3818460208801613b5f565b8351908301906138c7818360208801613b5f565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061391390830184613875565b9695505050505050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b6020815260006129aa6020830184613875565b60208082526018908201527f4d463a204d617820737570706c792065786365656465642e0000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526024908201527f4d463a20636f6e7472616374206973206e6f7420616c6c6f77656420746f206d60408201526334b73a1760e11b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715613aa257613aa2613c64565b604052919050565b60006001600160801b03808316818516808303821115613acc57613acc613c0c565b01949350505050565b60008219821115613ae857613ae8613c0c565b500190565b600082613afc57613afc613c22565b500490565b6000816000190483118215151615613b1b57613b1b613c0c565b500290565b60006001600160801b0383811690831681811015613b4057613b40613c0c565b039392505050565b600082821015613b5a57613b5a613c0c565b500390565b60005b83811015613b7a578181015183820152602001613b62565b8381111561190c5750506000910152565b600081613b9a57613b9a613c0c565b506000190190565b600181811c90821680613bb657607f821691505b60208210811415613bd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613bf157613bf1613c0c565b5060010190565b600082613c0757613c07613c22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5d57600080fdfe30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfea2646970667358221220c6f84eedd0dcbf887905024306dbd5c314ae109da8d2afec371daedb281ca39664736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000bf2734420224433cf6186ce23d83c9388fe4430000000000000000000000000c2ae244f0c0025864ac1fd87af4c8202bcd9a78f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f6d657461667269656e64732e73332e75732d776573742d322e616d617a6f6e6177732e636f6d2f6170692f00000000000000000000000000

-----Decoded View---------------
Arg [0] : initBaseURI (string): https://metafriends.s3.us-west-2.amazonaws.com/api/
Arg [1] : signer (address): 0x0BF2734420224433CF6186cE23D83C9388Fe4430
Arg [2] : _refundAddr (address): 0xc2AE244F0c0025864ac1Fd87Af4c8202bcD9a78F
Arg [3] : _maxBatchSize (uint256): 5
Arg [4] : _collectionSize (uint256): 10000

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000bf2734420224433cf6186ce23d83c9388fe4430
Arg [2] : 000000000000000000000000c2ae244f0c0025864ac1fd87af4c8202bcd9a78f
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000033
Arg [6] : 68747470733a2f2f6d657461667269656e64732e73332e75732d776573742d32
Arg [7] : 2e616d617a6f6e6177732e636f6d2f6170692f00000000000000000000000000


Deployed Bytecode Sourcemap

59948:8956:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39033:422;;;;;;;;;;-1:-1:-1;39033:422:0;;;;;:::i;:::-;;:::i;:::-;;;9962:14:1;;9955:22;9937:41;;9925:2;9910:18;39033:422:0;;;;;;;;40994:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42689:292::-;;;;;;;;;;-1:-1:-1;42689:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8694:32:1;;;8676:51;;8664:2;8649:18;42689:292:0;8530:203:1;60423:40:0;;;;;;;;;;;;;;;;;;;28559:25:1;;;28547:2;28532:18;60423:40:0;28413:177:1;42210:413:0;;;;;;;;;;-1:-1:-1;42210:413:0;;;;;:::i;:::-;;:::i;:::-;;60685:28;;;;;;;;;;-1:-1:-1;60685:28:0;;;;;;;-1:-1:-1;;;;;60685:28:0;;;37389:100;;;;;;;;;;-1:-1:-1;37442:7:0;37469:12;37389:100;;43716:162;;;;;;;;;;-1:-1:-1;43716:162:0;;;;;:::i;:::-;;:::i;66687:428::-;;;;;;;;;;-1:-1:-1;66687:428:0;;;;;:::i;:::-;;:::i;67123:156::-;;;;;;;;;;-1:-1:-1;67123:156:0;;;;;:::i;:::-;;:::i;64354:583::-;;;;;;:::i;:::-;;:::i;38097:864::-;;;;;;;;;;-1:-1:-1;38097:864:0;;;;;:::i;:::-;;:::i;67615:127::-;;;;;;;;;;-1:-1:-1;67615:127:0;;;;;:::i;:::-;;:::i;60551:35::-;;;;;;;;;;-1:-1:-1;60551:35:0;;;;;;;;;;;67988:99;;;;;;;;;;-1:-1:-1;67988:99:0;;;;;:::i;:::-;;:::i;60329:37::-;;;;;;;;;;;;;;;;60470:35;;;;;;;;;;;;;;;;43949:177;;;;;;;;;;-1:-1:-1;43949:177:0;;;;;:::i;:::-;;:::i;67750:115::-;;;;;;;;;;-1:-1:-1;67750:115:0;;;;;:::i;:::-;;:::i;37566:228::-;;;;;;;;;;-1:-1:-1;37566:228:0;;;;;:::i;:::-;;:::i;60373:43::-;;;;;;;;;;;;;;;;68095:106;;;;;;;;;;-1:-1:-1;68095:106:0;;;;;:::i;:::-;;:::i;40803:124::-;;;;;;;;;;-1:-1:-1;40803:124:0;;;;;:::i;:::-;;:::i;60593:32::-;;;;;;;;;;-1:-1:-1;60593:32:0;;;;;;;;;;;60512;;;;;;;;;;-1:-1:-1;60512:32:0;;;;;;;;60069:21;;;;;;;;;;;;;:::i;39519:258::-;;;;;;;;;;-1:-1:-1;39519:258:0;;;;;:::i;:::-;;:::i;2522:103::-;;;;;;;;;;;;;:::i;68311:401::-;;;;;;;;;;;;;:::i;60249:32::-;;;;;;;;;;;;;;;;1871:87;;;;;;;;;;-1:-1:-1;1944:6:0;;-1:-1:-1;;;;;1944:6:0;1871:87;;67287:167;;;;;;;;;;-1:-1:-1;67287:167:0;;;;;:::i;:::-;;:::i;:::-;;;;28278:13:1;;-1:-1:-1;;;;;28274:39:1;28256:58;;28374:4;28362:17;;;28356:24;-1:-1:-1;;;;;28352:49:1;28330:20;;;28323:79;;;;28229:18;67287:167:0;28046:362:1;41163:104:0;;;;;;;;;;;;;:::i;60720:27::-;;;;;;;;;;;;;;;;63529:817;;;;;;:::i;:::-;;:::i;43053:311::-;;;;;;;;;;-1:-1:-1;43053:311:0;;;;;:::i;:::-;;:::i;60632:46::-;;;;;;;;;;;;;;;65000:349;;;;;;:::i;:::-;;:::i;44197:355::-;;;;;;;;;;-1:-1:-1;44197:355:0;;;;;:::i;:::-;;:::i;65728:715::-;;;;;;:::i;:::-;;:::i;60868:43::-;;;;;;;;;;-1:-1:-1;60868:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;62137:180;;;;;;;;;;-1:-1:-1;62137:180:0;;;;;:::i;:::-;;:::i;65377:343::-;;;;;;;;;;-1:-1:-1;65377:343:0;;;;;:::i;:::-;;:::i;60208:34::-;;;;;;;;;;;;;;;49078:43;;;;;;;;;;;;;;;;67873:107;;;;;;;;;;-1:-1:-1;67873:107:0;;;;;:::i;:::-;;:::i;60164:37::-;;;;;;;;;;;;;;;43435:214;;;;;;;;;;-1:-1:-1;43435:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;43606:25:0;;;43577:4;43606:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43435:214;67492:115;;;;;;;;;;-1:-1:-1;67492:115:0;;;;;:::i;:::-;;:::i;2780:201::-;;;;;;;;;;-1:-1:-1;2780:201:0;;;;;:::i;:::-;;:::i;39033:422::-;39180:4;-1:-1:-1;;;;;;39222:40:0;;-1:-1:-1;;;39222:40:0;;:105;;-1:-1:-1;;;;;;;39279:48:0;;-1:-1:-1;;;39279:48:0;39222:105;:172;;;-1:-1:-1;;;;;;;39344:50:0;;-1:-1:-1;;;39344:50:0;39222:172;:225;;;-1:-1:-1;;;;;;;;;;7781:40:0;;;39411:36;39202:245;39033:422;-1:-1:-1;;39033:422:0:o;40994:100::-;41048:13;41081:5;41074:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40994:100;:::o;42689:292::-;42793:7;42840:16;42848:7;44864:4;44898:12;-1:-1:-1;44888:22:0;44807:111;42840:16;42818:111;;;;-1:-1:-1;;;42818:111:0;;27431:2:1;42818:111:0;;;27413:21:1;27470:2;27450:18;;;27443:30;27509:34;27489:18;;;27482:62;-1:-1:-1;;;27560:18:1;;;27553:43;27613:19;;42818:111:0;;;;;;;;;-1:-1:-1;42949:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42949:24:0;;42689:292::o;42210:413::-;42283:13;42299:24;42315:7;42299:15;:24::i;:::-;42283:40;;42348:5;-1:-1:-1;;;;;42342:11:0;:2;-1:-1:-1;;;;;42342:11:0;;;42334:58;;;;-1:-1:-1;;;42334:58:0;;22809:2:1;42334:58:0;;;22791:21:1;22848:2;22828:18;;;22821:30;22887:34;22867:18;;;22860:62;-1:-1:-1;;;22938:18:1;;;22931:32;22980:19;;42334:58:0;22607:398:1;42334:58:0;736:10;-1:-1:-1;;;;;42427:21:0;;;;:62;;-1:-1:-1;42452:37:0;42469:5;736:10;43435:214;:::i;42452:37::-;42405:169;;;;-1:-1:-1;;;42405:169:0;;17080:2:1;42405:169:0;;;17062:21:1;17119:2;17099:18;;;17092:30;17158:34;17138:18;;;17131:62;17229:27;17209:18;;;17202:55;17274:19;;42405:169:0;16878:421:1;42405:169:0;42587:28;42596:2;42600:7;42609:5;42587:8;:28::i;:::-;42272:351;42210:413;;:::o;43716:162::-;43842:28;43852:4;43858:2;43862:7;43842:9;:28::i;66687:428::-;66762:16;66770:7;66762;:16::i;:::-;-1:-1:-1;;;;;66748:30:0;:10;-1:-1:-1;;;;;66748:30:0;;66740:58;;;;-1:-1:-1;;;66740:58:0;;25084:2:1;66740:58:0;;;25066:21:1;25123:2;25103:18;;;25096:30;-1:-1:-1;;;25142:18:1;;;25135:45;25197:18;;66740:58:0;24882:339:1;66740:58:0;66818:20;;;;:11;:20;;;;;;;;66817:21;66809:50;;;;-1:-1:-1;;;66809:50:0;;22464:2:1;66809:50:0;;;22446:21:1;22503:2;22483:18;;;22476:30;-1:-1:-1;;;22522:18:1;;;22515:46;22578:18;;66809:50:0;22262:340:1;66809:50:0;66896:20;;;;:11;:20;;;;;;66919:12;;66878:38;;:15;:38;:::i;:::-;:53;66870:84;;;;-1:-1:-1;;;66870:84:0;;14860:2:1;66870:84:0;;;14842:21:1;14899:2;14879:18;;;14872:30;-1:-1:-1;;;14918:18:1;;;14911:48;14976:18;;66870:84:0;14658:342:1;66870:84:0;66965:20;;;;:11;:20;;;;;:27;;-1:-1:-1;;66965:27:0;66988:4;66965:27;;;67028:13;;67003:48;;67016:10;;-1:-1:-1;;;;;67028:13:0;;;;;66977:7;67003:12;:48::i;:::-;67062:45;67088:10;67101:5;;67062:17;:45::i;:::-;66687:428;:::o;67123:156::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;5084:1:::1;5682:7;;:19;;5674:63;;;::::0;-1:-1:-1;;;5674:63:0;;26655:2:1;5674:63:0::1;::::0;::::1;26637:21:1::0;26694:2;26674:18;;;26667:30;26733:33;26713:18;;;26706:61;26784:18;;5674:63:0::1;26453:355:1::0;5674:63:0::1;5084:1;5815:7;:18:::0;67243:28:::2;67262:8:::0;67243:18:::2;:28::i;:::-;-1:-1:-1::0;5040:1:0::1;5994:7;:22:::0;67123:156::o;64354:583::-;64443:16;;;;;;;64442:17;64434:51;;;;-1:-1:-1;;;64434:51:0;;20628:2:1;64434:51:0;;;20610:21:1;20667:2;20647:18;;;20640:30;-1:-1:-1;;;20686:18:1;;;20679:51;20747:18;;64434:51:0;20426:345:1;64434:51:0;64514:12;64504:6;:22;;64496:51;;;;-1:-1:-1;;;64496:51:0;;16735:2:1;64496:51:0;;;16717:21:1;16774:2;16754:18;;;16747:30;-1:-1:-1;;;16793:18:1;;;16786:46;16849:18;;64496:51:0;16533:340:1;64496:51:0;64566:9;64579:10;64566:23;64558:72;;;;-1:-1:-1;;;64558:72:0;;;;;;;:::i;:::-;64736:12;;64718:15;;:30;;;;:::i;:::-;64708:6;64684:21;;64665:16;;64649:13;37442:7;37469:12;;37389:100;64649:13;:32;;;;:::i;:::-;:56;;;;:::i;:::-;:65;;;;:::i;:::-;:99;;64641:136;;;;-1:-1:-1;;;64641:136:0;;;;;;;:::i;:::-;64788:29;64798:10;64810:6;64788:9;:29::i;:::-;64828:20;64841:6;64828:12;:20::i;:::-;64859:28;64880:6;64872:5;;:14;;;;:::i;:::-;64859:12;:28::i;:::-;64903:26;;;64910:10;9413:51:1;;9495:2;9480:18;;9473:34;;;-1:-1:-1;;;;;;;;;;;64903:26:0;9386:18:1;64903:26:0;;;;;;;64354:583;:::o;38097:864::-;38222:7;38263:16;38273:5;38263:9;:16::i;:::-;38255:5;:24;38247:71;;;;-1:-1:-1;;;38247:71:0;;11769:2:1;38247:71:0;;;11751:21:1;11808:2;11788:18;;;11781:30;11847:34;11827:18;;;11820:62;-1:-1:-1;;;11898:18:1;;;11891:32;11940:19;;38247:71:0;11567:398:1;38247:71:0;38329:22;37469:12;;;38329:22;;38461:426;38485:14;38481:1;:18;38461:426;;;38521:31;38555:14;;;:11;:14;;;;;;;;;38521:48;;;;;;;;;-1:-1:-1;;;;;38521:48:0;;;;;-1:-1:-1;;;38521:48:0;;;-1:-1:-1;;;;;38521:48:0;;;;;;;;38588:28;38584:103;;38657:14;;;-1:-1:-1;38584:103:0;38726:5;-1:-1:-1;;;;;38705:26:0;:17;-1:-1:-1;;;;;38705:26:0;;38701:175;;;38771:5;38756:11;:20;38752:77;;;-1:-1:-1;38808:1:0;-1:-1:-1;38801:8:0;;-1:-1:-1;;;38801:8:0;38752:77;38847:13;;;;:::i;:::-;;;;38701:175;-1:-1:-1;38501:3:0;;;;:::i;:::-;;;;38461:426;;;-1:-1:-1;38897:56:0;;-1:-1:-1;;;38897:56:0;;25428:2:1;38897:56:0;;;25410:21:1;25467:2;25447:18;;;25440:30;25506:34;25486:18;;;25479:62;-1:-1:-1;;;25557:18:1;;;25550:44;25611:19;;38897:56:0;25226:410:1;67615:127:0;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;67698:16:::1;:36:::0;;;::::1;;;;-1:-1:-1::0;;67698:36:0;;::::1;::::0;;;::::1;::::0;;67615:127::o;67988:99::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;68060:7:::1;:19:::0;;-1:-1:-1;;;;;;68060:19:0::1;-1:-1:-1::0;;;;;68060:19:0;;;::::1;::::0;;;::::1;::::0;;67988:99::o;43949:177::-;44079:39;44096:4;44102:2;44106:7;44079:39;;;;;;;;;;;;:16;:39::i;67750:115::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;67827:13:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;67827:30:0;;::::1;::::0;;;::::1;::::0;;67750:115::o;37566:228::-;37669:7;37469:12;;37702:5;:21;37694:69;;;;-1:-1:-1;;;37694:69:0;;13350:2:1;37694:69:0;;;13332:21:1;13389:2;13369:18;;;13362:30;13428:34;13408:18;;;13401:62;-1:-1:-1;;;13479:18:1;;;13472:33;13522:19;;37694:69:0;13148:399:1;37694:69:0;-1:-1:-1;37781:5:0;37566:228::o;68095:106::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;68173:20:::1;:7;68183:10:::0;;68173:20:::1;:::i;40803:124::-:0;40867:7;40894:20;40906:7;40894:11;:20::i;:::-;:25;;40803:124;-1:-1:-1;;40803:124:0:o;60069:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39519:258::-;39583:7;-1:-1:-1;;;;;39625:19:0;;39603:112;;;;-1:-1:-1;;;39603:112:0;;18277:2:1;39603:112:0;;;18259:21:1;18316:2;18296:18;;;18289:30;18355:34;18335:18;;;18328:62;-1:-1:-1;;;18406:18:1;;;18399:41;18457:19;;39603:112:0;18075:407:1;39603:112:0;-1:-1:-1;;;;;;39741:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;39741:27:0;;39519:258::o;2522:103::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;2587:30:::1;2614:1;2587:18;:30::i;:::-;2522:103::o:0;68311:401::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;68405:12:::1;68390;;68372:15;:30;;;;:::i;:::-;:45;68364:80;;;::::0;-1:-1:-1;;;68364:80:0;;19447:2:1;68364:80:0::1;::::0;::::1;19429:21:1::0;19486:2;19466:18;;;19459:30;-1:-1:-1;;;19505:18:1;;;19498:52;19567:18;;68364:80:0::1;19245:346:1::0;68364:80:0::1;68473:21;68513:11:::0;68505:20:::1;;;::::0;::::1;;68536:80;68547:42;68591:24;68611:3;68591:15;:7:::0;68603:2:::1;68591:11;:15::i;:::-;:19:::0;::::1;:24::i;:::-;68536:10;:80::i;:::-;68627:77;68638:42;68682:21;68627:10;:77::i;67287:167::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;67426:20:0;67438:7;67426:11;:20::i;41163:104::-;41219:13;41252:7;41245:14;;;;;:::i;63529:817::-;63677:13;;;;63676:14;63668:45;;;;-1:-1:-1;;;63668:45:0;;24335:2:1;63668:45:0;;;24317:21:1;24374:2;24354:18;;;24347:30;-1:-1:-1;;;24393:18:1;;;24386:48;24451:18;;63668:45:0;24133:342:1;63668:45:0;63732:9;63745:10;63732:23;63724:72;;;;-1:-1:-1;;;63724:72:0;;;;;;;:::i;:::-;63815:39;63823:23;63829:4;;63835:10;63823:5;:23::i;:::-;63848:5;;63815:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63815:7:0;;-1:-1:-1;;;63815:39:0:i;:::-;63807:70;;;;-1:-1:-1;;;63807:70:0;;14513:2:1;63807:70:0;;;14495:21:1;14552:2;14532:18;;;14525:30;-1:-1:-1;;;14571:18:1;;;14564:48;14629:18;;63807:70:0;14311:342:1;63807:70:0;63909:10;63896:24;;;;:12;:24;;;;;;63933:1;;63896:33;;63923:6;;63896:33;:::i;:::-;:38;;63888:105;;;;-1:-1:-1;;;63888:105:0;;20205:2:1;63888:105:0;;;20187:21:1;20244:2;20224:18;;;20217:30;20283:34;20263:18;;;20256:62;-1:-1:-1;;;20334:18:1;;;20327:52;20396:19;;63888:105:0;20003:418:1;63888:105:0;64100:12;;64082:15;;:30;;;;:::i;:::-;64072:6;64048:21;;64029:16;;64013:13;37442:7;37469:12;;37389:100;64013:13;:32;;;;:::i;:::-;:56;;;;:::i;:::-;:65;;;;:::i;:::-;:99;;64005:136;;;;-1:-1:-1;;;64005:136:0;;;;;;;:::i;:::-;64152:29;64162:10;64174:6;64152:9;:29::i;:::-;64192:20;64205:6;64192:12;:20::i;:::-;64223:28;64244:6;64236:5;;:14;;;;:::i;64223:28::-;64275:10;64262:24;;;;:12;:24;;;;;:34;;64290:6;;64262:24;:34;;64290:6;;64262:34;:::i;:::-;;;;-1:-1:-1;;64312:26:0;;;64319:10;9413:51:1;;9495:2;9480:18;;9473:34;;;-1:-1:-1;;;;;;;;;;;64312:26:0;9386:18:1;64312:26:0;;;;;;;;63529:817;;;;;:::o;43053:311::-;-1:-1:-1;;;;;43171:24:0;;736:10;43171:24;;43163:63;;;;-1:-1:-1;;;43163:63:0;;21690:2:1;43163:63:0;;;21672:21:1;21729:2;21709:18;;;21702:30;21768:28;21748:18;;;21741:56;21814:18;;43163:63:0;21488:350:1;43163:63:0;736:10;43239:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;43239:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;43239:53:0;;;;;;;;;;43308:48;;9937:41:1;;;43239:42:0;;736:10;43308:48;;9910:18:1;43308:48:0;;;;;;;43053:311;;:::o;65000:349::-;65121:21;;65111:6;65087:21;;:30;;;;:::i;:::-;:55;;65079:92;;;;-1:-1:-1;;;65079:92:0;;;;;;;:::i;:::-;65190:14;;-1:-1:-1;;;;;65190:14:0;65208:10;65190:28;65182:51;;;;-1:-1:-1;;;65182:51:0;;16395:2:1;65182:51:0;;;16377:21:1;16434:2;16414:18;;;16407:30;-1:-1:-1;;;16453:18:1;;;16446:41;16504:18;;65182:51:0;16193:335:1;65182:51:0;65244:21;65254:2;65258:6;65244:9;:21::i;:::-;65301:6;65276:21;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;65323:18:0;;;-1:-1:-1;;;;;9431:32:1;;9413:51;;9495:2;9480:18;;9473:34;;;-1:-1:-1;;;;;;;;;;;65323:18:0;9386::1;65323::0;;;;;;;65000:349;;:::o;44197:355::-;44356:28;44366:4;44372:2;44376:7;44356:9;:28::i;:::-;44417:48;44440:4;44446:2;44450:7;44459:5;44417:22;:48::i;:::-;44395:149;;;;-1:-1:-1;;;44395:149:0;;;;;;;:::i;:::-;44197:355;;;;:::o;65728:715::-;65855:13;;;;;;;65854:14;65846:49;;;;-1:-1:-1;;;65846:49:0;;21339:2:1;65846:49:0;;;21321:21:1;21378:2;21358:18;;;21351:30;-1:-1:-1;;;21397:18:1;;;21390:52;21459:18;;65846:49:0;21137:346:1;65846:49:0;65928:10;65915:24;;;;:12;:24;;;;;;;;65914:25;65906:86;;;;-1:-1:-1;;;65906:86:0;;17859:2:1;65906:86:0;;;17841:21:1;17898:2;17878:18;;;17871:30;17937:34;17917:18;;;17910:62;-1:-1:-1;;;17988:18:1;;;17981:47;18045:19;;65906:86:0;17657:413:1;65906:86:0;66069:12;;66040:16;;66020:1;;66069:12;66040:25;;66020:1;;66040:25;:::i;:::-;:41;;66032:78;;;;-1:-1:-1;;;66032:78:0;;;;;;;:::i;:::-;66129:39;66137:23;66143:4;;66149:10;66137:5;:23::i;:::-;66162:5;;66129:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66129:7:0;;-1:-1:-1;;;66129:39:0:i;:::-;66121:70;;;;-1:-1:-1;;;66121:70:0;;14513:2:1;66121:70:0;;;14495:21:1;14552:2;14532:18;;;14525:30;-1:-1:-1;;;14571:18:1;;;14564:48;14629:18;;66121:70:0;14311:342:1;66121:70:0;66210:9;66223:10;66210:23;66202:72;;;;-1:-1:-1;;;66202:72:0;;;;;;;:::i;:::-;66285:29;66295:10;66307:6;66285:9;:29::i;:::-;66345:6;66325:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;66375:10:0;66362:24;;;;:12;:24;;;;;;;;;:31;;-1:-1:-1;;66362:31:0;66389:4;66362:31;;;66409:26;;9413:51:1;;;9480:18;;9473:34;;;-1:-1:-1;;;;;;;;;;;66409:26:0;9386:18:1;66409:26:0;9231:282:1;62137:180:0;62203:13;62260:10;:8;:10::i;:::-;62272:26;62289:8;62272:16;:26::i;:::-;62243:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62229:80;;62137:180;;;:::o;65377:343::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;65499:12:::1;;65482:6;:13;65463:16;;:32;;;;:::i;:::-;:48;;65455:84;;;;-1:-1:-1::0;;;65455:84:0::1;;;;;;;:::i;:::-;65554:6;65550:161;65565:6;:13;65562:1;:16;65550:161;;;65600:22;65610:6;65617:1;65610:9;;;;;;;;:::i;:::-;;;;;;;65620:1;65600:9;:22::i;:::-;65657:1;65637:16;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65678:21:0::1;::::0;;65685:10:::1;9413:51:1::0;;65697:1:0::1;9495:2:1::0;9480:18;;9473:34;-1:-1:-1;;;;;;;;;;;65678:21:0;9386:18:1;65678:21:0::1;;;;;;;65580:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65550:161;;;;65377:343:::0;:::o;67873:107::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;67946:14:::1;:26:::0;;-1:-1:-1;;;;;;67946:26:0::1;-1:-1:-1::0;;;;;67946:26:0;;;::::1;::::0;;;::::1;::::0;;67873:107::o;67492:115::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;67569:13:::1;:30:::0;;-1:-1:-1;;67569:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67492:115::o;2780:201::-;1944:6;;-1:-1:-1;;;;;1944:6:0;736:10;2091:23;2083:68;;;;-1:-1:-1;;;2083:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2869:22:0;::::1;2861:73;;;::::0;-1:-1:-1;;;2861:73:0;;12532:2:1;2861:73:0::1;::::0;::::1;12514:21:1::0;12571:2;12551:18;;;12544:30;12610:34;12590:18;;;12583:62;-1:-1:-1;;;12661:18:1;;;12654:36;12707:19;;2861:73:0::1;12330:402:1::0;2861:73:0::1;2945:28;2964:8;2945:18;:28::i;48874:196::-:0;48989:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;48989:29:0;-1:-1:-1;;;;;48989:29:0;;;;;;;;;49034:28;;48989:24;;49034:28;;;;;;;48874:196;;;:::o;47047:1709::-;47162:35;47200:20;47212:7;47200:11;:20::i;:::-;47275:18;;47162:58;;-1:-1:-1;47233:22:0;;-1:-1:-1;;;;;47259:34:0;736:10;-1:-1:-1;;;;;47259:34:0;;:87;;;-1:-1:-1;736:10:0;47310:20;47322:7;47310:11;:20::i;:::-;-1:-1:-1;;;;;47310:36:0;;47259:87;:154;;;-1:-1:-1;47380:18:0;;47363:50;;736:10;43435:214;:::i;47363:50::-;47233:181;;47449:17;47427:117;;;;-1:-1:-1;;;47427:117:0;;22045:2:1;47427:117:0;;;22027:21:1;22084:2;22064:18;;;22057:30;22123:34;22103:18;;;22096:62;-1:-1:-1;;;22174:18:1;;;22167:48;22232:19;;47427:117:0;21843:414:1;47427:117:0;47601:4;-1:-1:-1;;;;;47579:26:0;:13;:18;;;-1:-1:-1;;;;;47579:26:0;;47557:114;;;;-1:-1:-1;;;47557:114:0;;19798:2:1;47557:114:0;;;19780:21:1;19837:2;19817:18;;;19810:30;19876:34;19856:18;;;19849:62;-1:-1:-1;;;19927:18:1;;;19920:36;19973:19;;47557:114:0;19596:402:1;47557:114:0;-1:-1:-1;;;;;47690:16:0;;47682:66;;;;-1:-1:-1;;;47682:66:0;;14107:2:1;47682:66:0;;;14089:21:1;14146:2;14126:18;;;14119:30;14185:34;14165:18;;;14158:62;-1:-1:-1;;;14236:18:1;;;14229:35;14281:19;;47682:66:0;13905:401:1;47682:66:0;47869:49;47886:1;47890:7;47899:13;:18;;;47869:8;:49::i;:::-;-1:-1:-1;;;;;47931:18:0;;;;;;:12;:18;;;;;:31;;47961:1;;47931:18;:31;;47961:1;;-1:-1:-1;;;;;47931:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47931:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47973:16:0;;-1:-1:-1;47973:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;47973:16:0;;:29;;-1:-1:-1;;47973:29:0;;:::i;:::-;;;-1:-1:-1;;;;;47973:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48036:43:0;;;;;;;;-1:-1:-1;;;;;48036:43:0;;;;;-1:-1:-1;;;;;48062:15:0;48036:43;;;;;;;;;-1:-1:-1;48013:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;48013:66:0;-1:-1:-1;;;;;;48013:66:0;;;;;;;;;;;48341:11;48025:7;-1:-1:-1;48341:11:0;:::i;:::-;48408:1;48367:24;;;:11;:24;;;;;:29;48319:33;;-1:-1:-1;;;;;;48367:29:0;48363:288;;48431:20;48439:11;44864:4;44898:12;-1:-1:-1;44888:22:0;44807:111;48431:20;48427:213;;;48499:125;;;;;;;;48536:18;;-1:-1:-1;;;;;48499:125:0;;;;;;48577:28;;;;-1:-1:-1;;;;;48499:125:0;;;;;;;;;-1:-1:-1;48472:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;48472:152:0;-1:-1:-1;;;;;;48472:152:0;;;;;;;;;;;;48427:213;48687:7;48683:2;-1:-1:-1;;;;;48668:27:0;48677:4;-1:-1:-1;;;;;48668:27:0;;;;;;;;;;;48706:42;47151:1605;;;47047:1709;;;:::o;17399:317::-;17514:6;17489:21;:31;;17481:73;;;;-1:-1:-1;;;17481:73:0;;16037:2:1;17481:73:0;;;16019:21:1;16076:2;16056:18;;;16049:30;16115:31;16095:18;;;16088:59;16164:18;;17481:73:0;15835:353:1;17481:73:0;17568:12;17586:9;-1:-1:-1;;;;;17586:14:0;17608:6;17586:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17567:52;;;17638:7;17630:78;;;;-1:-1:-1;;;17630:78:0;;15207:2:1;17630:78:0;;;15189:21:1;15246:2;15226:18;;;15219:30;15285:34;15265:18;;;15258:62;15356:28;15336:18;;;15329:56;15402:19;;17630:78:0;15005:422:1;49234:950:0;49328:24;;49371:12;49363:49;;;;-1:-1:-1;;;49363:49:0;;17506:2:1;49363:49:0;;;17488:21:1;17545:2;17525:18;;;17518:30;17584:26;17564:18;;;17557:54;17628:18;;49363:49:0;17304:348:1;49363:49:0;49423:16;49473:1;49442:28;49462:8;49442:17;:28;:::i;:::-;:32;;;;:::i;:::-;49423:51;-1:-1:-1;49500:18:0;49517:1;49500:14;:18;:::i;:::-;49489:8;:29;49485:91;;;49546:18;49563:1;49546:14;:18;:::i;:::-;49535:29;;49485:91;49699:17;49707:8;44864:4;44898:12;-1:-1:-1;44888:22:0;44807:111;49699:17;49691:68;;;;-1:-1:-1;;;49691:68:0;;26248:2:1;49691:68:0;;;26230:21:1;26287:2;26267:18;;;26260:30;26326:34;26306:18;;;26299:62;-1:-1:-1;;;26377:18:1;;;26370:36;26423:19;;49691:68:0;26046:402:1;49691:68:0;49787:17;49770:357;49811:8;49806:1;:13;49770:357;;49876:1;49845:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;49845:19:0;49841:275;;49899:31;49933:14;49945:1;49933:11;:14::i;:::-;49983:117;;;;;;;;50020:14;;-1:-1:-1;;;;;49983:117:0;;;;;;50057:24;;;;-1:-1:-1;;;;;49983:117:0;;;;;;;;;-1:-1:-1;49966:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;49966:134:0;-1:-1:-1;;;;;;49966:134:0;;;;;;;;;;;;-1:-1:-1;49841:275:0;49821:3;;;;:::i;:::-;;;;49770:357;;;-1:-1:-1;50164:12:0;:8;50175:1;50164:12;:::i;:::-;50137:24;:39;-1:-1:-1;;;49234:950:0:o;44926:104::-;44995:27;45005:2;45009:8;44995:27;;;;;;;;;;;;:9;:27::i;62325:1196::-;62386:6;62396:1;62386:11;62382:333;;;62444:15;62413:11;:28;62439:1;62425:13;37442:7;37469:12;;37389:100;62425:13;:15;;;;:::i;:::-;62413:28;;;;;;;;;;;:46;;;;62505:15;62474:11;:28;62500:1;62486:13;37442:7;37469:12;;37389:100;62486:13;:15;;;;:::i;:::-;62474:28;;;;;;;;;;;:46;;;;62566:15;62535:11;:28;62561:1;62547:13;37442:7;37469:12;;37389:100;62547:13;:15;;;;:::i;:::-;62535:28;;;;;;;;;;;:46;;;;62627:15;62596:11;:28;62622:1;62608:13;37442:7;37469:12;;37389:100;62608:13;:15;;;;:::i;:::-;62596:28;;;;;;;;;;;:46;;;;62688:15;62657:11;:28;62683:1;62669:13;37442:7;37469:12;;37389:100;62669:13;:15;;;;:::i;:::-;62657:28;;;;;;;;;;;-1:-1:-1;62657:28:0;:46;62382:333;62729:6;62739:1;62729:11;62725:286;;;62787:15;62756:11;:28;62782:1;62768:13;37442:7;37469:12;;37389:100;62768:13;:15;;;;:::i;:::-;62756:28;;;;;;;;;;;:46;;;;62848:15;62817:11;:28;62843:1;62829:13;37442:7;37469:12;;37389:100;62829:13;:15;;;;:::i;:::-;62817:28;;;;;;;;;;;:46;;;;62909:15;62878:11;:28;62904:1;62890:13;37442:7;37469:12;;37389:100;62890:13;:15;;;;:::i;:::-;62878:28;;;;;;;;;;;:46;;;;62970:15;62939:11;:28;62965:1;62951:13;37442:7;37469:12;;37389:100;62951:13;:15;;;;:::i;:::-;62939:28;;;;;;;;;;;-1:-1:-1;62939:28:0;:46;62725:286;63025:6;63035:1;63025:11;63021:211;;;63083:15;63052:11;:28;63078:1;63064:13;37442:7;37469:12;;37389:100;63064:13;:15;;;;:::i;:::-;63052:28;;;;;;;;;;;:46;;;;63144:15;63113:11;:28;63139:1;63125:13;37442:7;37469:12;;37389:100;63125:13;:15;;;;:::i;:::-;63113:28;;;;;;;;;;;:46;;;;63205:15;63174:11;:28;63200:1;63186:13;37442:7;37469:12;;37389:100;63186:13;:15;;;;:::i;:::-;63174:28;;;;;;;;;;;-1:-1:-1;63174:28:0;:46;63021:211;63246:6;63256:1;63246:11;63242:227;;;63304:15;63273:11;:28;63299:1;63285:13;37442:7;37469:12;;37389:100;63285:13;:15;;;;:::i;:::-;63273:28;;;;;;;;;;;:46;;;;63365:15;63334:11;:28;63360:1;63346:13;37442:7;37469:12;;37389:100;63346:13;:15;;;;:::i;:::-;63334:28;;;;;;;;;;;-1:-1:-1;63334:28:0;:46;63242:227;;;63442:15;63411:11;:28;63437:1;63423:13;37442:7;37469:12;;37389:100;63423:13;:15;;;;:::i;:::-;63411:28;;;;;;;;;;;-1:-1:-1;63411:28:0;:46;63242:227;-1:-1:-1;63498:15:0;63483:12;:30;62325:1196::o;66451:228::-;66528:5;66515:9;:18;;66507:57;;;;-1:-1:-1;;;66507:57:0;;19092:2:1;66507:57:0;;;19074:21:1;19131:2;19111:18;;;19104:30;19170:28;19150:18;;;19143:56;19216:18;;66507:57:0;18890:350:1;66507:57:0;66591:5;66579:9;:17;66575:97;;;66621:10;66613:47;66642:17;66654:5;66642:9;:17;:::i;:::-;66613:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40059:682;-1:-1:-1;;;;;;;;;;;;;;;;;40194:16:0;40202:7;44864:4;44898:12;-1:-1:-1;44888:22:0;44807:111;40194:16;40186:71;;;;-1:-1:-1;;;40186:71:0;;12939:2:1;40186:71:0;;;12921:21:1;12978:2;12958:18;;;12951:30;13017:34;12997:18;;;12990:62;-1:-1:-1;;;13068:18:1;;;13061:40;13118:19;;40186:71:0;12737:406:1;40186:71:0;40270:26;40322:12;40311:7;:23;40307:103;;40372:22;40382:12;40372:7;:22;:::i;:::-;:26;;40397:1;40372:26;:::i;:::-;40351:47;;40307:103;40442:7;40422:242;40459:18;40451:4;:26;40422:242;;40502:31;40536:17;;;:11;:17;;;;;;;;;40502:51;;;;;;;;;-1:-1:-1;;;;;40502:51:0;;;;;-1:-1:-1;;;40502:51:0;;;-1:-1:-1;;;;;40502:51:0;;;;;;;;40572:28;40568:85;;40628:9;40059:682;-1:-1:-1;;;;40059:682:0:o;40568:85::-;-1:-1:-1;40479:6:0;;;;:::i;:::-;;;;40422:242;;;-1:-1:-1;40676:57:0;;-1:-1:-1;;;40676:57:0;;27015:2:1;40676:57:0;;;26997:21:1;27054:2;27034:18;;;27027:30;27093:34;27073:18;;;27066:62;-1:-1:-1;;;27144:18:1;;;27137:45;27199:19;;40676:57:0;26813:411:1;3141:191:0;3234:6;;;-1:-1:-1;;;;;3251:17:0;;;-1:-1:-1;;;;;;3251:17:0;;;;;;;3284:40;;3234:6;;;3251:17;3234:6;;3284:40;;3215:16;;3284:40;3204:128;3141:191;:::o;56492:98::-;56550:7;56577:5;56581:1;56577;:5;:::i;:::-;56570:12;56492:98;-1:-1:-1;;;56492:98:0:o;56891:::-;56949:7;56976:5;56980:1;56976;:5;:::i;68720:181::-;68795:12;68813:8;-1:-1:-1;;;;;68813:13:0;68834:7;68813:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68794:52;;;68865:7;68857:36;;;;-1:-1:-1;;;68857:36:0;;23212:2:1;68857:36:0;;;23194:21:1;23251:2;23231:18;;;23224:30;-1:-1:-1;;;23270:18:1;;;23263:46;23326:18;;68857:36:0;23010:340:1;61450:197:0;61555:7;61608:4;;61622;61629:8;61597:41;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61587:52;;;;;;61580:59;;61450:197;;;;;:::o;61655:172::-;61811:7;;61756:4;;-1:-1:-1;;;;;61811:7:0;61786:21;61795:4;61801:5;61786:8;:21::i;:::-;-1:-1:-1;;;;;61786:32:0;;;61655:172;-1:-1:-1;;;61655:172:0:o;50749:985::-;50904:4;-1:-1:-1;;;;;50925:13:0;;16400:20;16448:8;50921:806;;50978:175;;-1:-1:-1;;;50978:175:0;;-1:-1:-1;;;;;50978:36:0;;;;;:175;;736:10;;51072:4;;51099:7;;51129:5;;50978:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50978:175:0;;;;;;;;-1:-1:-1;;50978:175:0;;;;;;;;;;;;:::i;:::-;;;50957:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51340:13:0;;51336:321;;51383:109;;-1:-1:-1;;;51383:109:0;;;;;;;:::i;51336:321::-;51607:6;51601:13;51592:6;51588:2;51584:15;51577:38;50957:715;-1:-1:-1;;;;;;51217:55:0;-1:-1:-1;;;51217:55:0;;-1:-1:-1;51210:62:0;;50921:806;-1:-1:-1;51711:4:0;50921:806;50749:985;;;;;;:::o;62029:100::-;62081:13;62114:7;62107:14;;;;;:::i;23717:723::-;23773:13;23994:10;23990:53;;-1:-1:-1;;24021:10:0;;;;;;;;;;;;-1:-1:-1;;;24021:10:0;;;;;23717:723::o;23990:53::-;24068:5;24053:12;24109:78;24116:9;;24109:78;;24142:8;;;;:::i;:::-;;-1:-1:-1;24165:10:0;;-1:-1:-1;24173:2:0;24165:10;;:::i;:::-;;;24109:78;;;24197:19;24229:6;-1:-1:-1;;;;;24219:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24219:17:0;;24197:39;;24247:154;24254:10;;24247:154;;24281:11;24291:1;24281:11;;:::i;:::-;;-1:-1:-1;24350:10:0;24358:2;24350:5;:10;:::i;:::-;24337:24;;:2;:24;:::i;:::-;24324:39;;24307:6;24314;24307:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24307:56:0;;;;;;;;-1:-1:-1;24378:11:0;24387:2;24378:11;;:::i;:::-;;;24247:154;;45393:1400;45516:20;45539:12;-1:-1:-1;;;;;45570:16:0;;45562:62;;;;-1:-1:-1;;;45562:62:0;;24682:2:1;45562:62:0;;;24664:21:1;24721:2;24701:18;;;24694:30;24760:34;24740:18;;;24733:62;-1:-1:-1;;;24811:18:1;;;24804:31;24852:19;;45562:62:0;24480:397:1;45562:62:0;45769:21;45777:12;44864:4;44898:12;-1:-1:-1;44888:22:0;44807:111;45769:21;45768:22;45760:64;;;;-1:-1:-1;;;45760:64:0;;23977:2:1;45760:64:0;;;23959:21:1;24016:2;23996:18;;;23989:30;24055:31;24035:18;;;24028:59;24104:18;;45760:64:0;23775:353:1;45760:64:0;45855:12;45843:8;:24;;45835:71;;;;-1:-1:-1;;;45835:71:0;;27845:2:1;45835:71:0;;;27827:21:1;27884:2;27864:18;;;27857:30;27923:34;27903:18;;;27896:62;-1:-1:-1;;;27974:18:1;;;27967:32;28016:19;;45835:71:0;27643:398:1;45835:71:0;-1:-1:-1;;;;;46026:16:0;;45993:30;46026:16;;;:12;:16;;;;;;;;;45993:49;;;;;;;;;-1:-1:-1;;;;;45993:49:0;;;;;-1:-1:-1;;;45993:49:0;;;;;;;;;;;46072:135;;;;;;;;46098:19;;45993:49;;46072:135;;;46098:39;;46128:8;;46098:39;:::i;:::-;-1:-1:-1;;;;;46072:135:0;;;;;46187:8;46152:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;46072:135:0;;;;;;-1:-1:-1;;;;;46053:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;46053:154:0;;;;;;;;;;;;46246:43;;;;;;;;;;-1:-1:-1;;;;;46272:15:0;46246:43;;;;;;;;46218:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;46218:71:0;-1:-1:-1;;;;;;46218:71:0;;;;;;;;;;;;;;;;;;46230:12;;46350:325;46374:8;46370:1;:12;46350:325;;;46409:38;;46434:12;;-1:-1:-1;;;;;46409:38:0;;;46426:1;;46409:38;;46426:1;;46409:38;46488:59;46519:1;46523:2;46527:12;46541:5;46488:22;:59::i;:::-;46462:172;;;;-1:-1:-1;;;46462:172:0;;;;;;;:::i;:::-;46649:14;;;;:::i;:::-;;;;46384:3;;;;;:::i;:::-;;;;46350:325;;;-1:-1:-1;46687:12:0;:27;;;46725:60;44197:355;61835:186;61937:7;61969:44;62007:5;61969:29;:4;33862:58;;8177:66:1;33862:58:0;;;8165:79:1;8260:12;;;8253:28;;;33729:7:0;;8297:12:1;;33862:58:0;;;;;;;;;;;;33852:69;;;;;;33845:76;;33660:269;;;;61969:29;:37;29889:7;29910:17;29929:18;29951:27;29962:4;29968:9;29951:10;:27::i;:::-;29909:69;;;;29989:18;30001:5;29989:11;:18::i;:::-;-1:-1:-1;30025:9:0;29811:231;-1:-1:-1;;;29811:231:0:o;27701:1308::-;27782:7;27791:12;28016:9;:16;28036:2;28016:22;28012:990;;;28312:4;28297:20;;28291:27;28362:4;28347:20;;28341:27;28420:4;28405:20;;28399:27;28055:9;28391:36;28463:25;28474:4;28391:36;28291:27;28341;28463:10;:25::i;:::-;28456:32;;;;;;;;;28012:990;28510:9;:16;28530:2;28510:22;28506:496;;;28785:4;28770:20;;28764:27;28836:4;28821:20;;28815:27;28878:23;28889:4;28764:27;28815;28878:10;:23::i;:::-;28871:30;;;;;;;;28506:496;-1:-1:-1;28950:1:0;;-1:-1:-1;28954:35:0;28506:496;27701:1308;;;;;:::o;25972:643::-;26050:20;26041:5;:29;;;;;;;;:::i;:::-;;26037:571;;;25972:643;:::o;26037:571::-;26148:29;26139:5;:38;;;;;;;;:::i;:::-;;26135:473;;;26194:34;;-1:-1:-1;;;26194:34:0;;11416:2:1;26194:34:0;;;11398:21:1;11455:2;11435:18;;;11428:30;11494:26;11474:18;;;11467:54;11538:18;;26194:34:0;11214:348:1;26135:473:0;26259:35;26250:5;:44;;;;;;;;:::i;:::-;;26246:362;;;26311:41;;-1:-1:-1;;;26311:41:0;;12172:2:1;26311:41:0;;;12154:21:1;12211:2;12191:18;;;12184:30;12250:33;12230:18;;;12223:61;12301:18;;26311:41:0;11970:355:1;26246:362:0;26383:30;26374:5;:39;;;;;;;;:::i;:::-;;26370:238;;;26430:44;;-1:-1:-1;;;26430:44:0;;15634:2:1;26430:44:0;;;15616:21:1;15673:2;15653:18;;;15646:30;15712:34;15692:18;;;15685:62;-1:-1:-1;;;15763:18:1;;;15756:32;15805:19;;26430:44:0;15432:398:1;26370:238:0;26505:30;26496:5;:39;;;;;;;;:::i;:::-;;26492:116;;;26552:44;;-1:-1:-1;;;26552:44:0;;18689:2:1;26552:44:0;;;18671:21:1;18728:2;18708:18;;;18701:30;18767:34;18747:18;;;18740:62;-1:-1:-1;;;18818:18:1;;;18811:32;18860:19;;26552:44:0;18487:398:1;31310:1632:0;31441:7;;32375:66;32362:79;;32358:163;;;-1:-1:-1;32474:1:0;;-1:-1:-1;32478:30:0;32458:51;;32358:163;32535:1;:7;;32540:2;32535:7;;:18;;;;;32546:1;:7;;32551:2;32546:7;;32535:18;32531:102;;;-1:-1:-1;32586:1:0;;-1:-1:-1;32590:30:0;32570:51;;32531:102;32747:24;;;32730:14;32747:24;;;;;;;;;10216:25:1;;;10289:4;10277:17;;10257:18;;;10250:45;;;;10311:18;;;10304:34;;;10354:18;;;10347:34;;;32747:24:0;;10188:19:1;;32747:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32747:24:0;;-1:-1:-1;;32747:24:0;;;-1:-1:-1;;;;;;;32786:20:0;;32782:103;;32839:1;32843:29;32823:50;;;;;;;32782:103;32905:6;-1:-1:-1;32913:20:0;;-1:-1:-1;31310:1632:0;;;;;;;;:::o;30305:391::-;30419:7;;-1:-1:-1;;;;;30520:75:0;;30622:3;30618:12;;;30632:2;30614:21;30663:25;30674:4;30614:21;30683:1;30520:75;30663:10;:25::i;:::-;30656:32;;;;;;30305:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:347;408:8;418:6;472:3;465:4;457:6;453:17;449:27;439:55;;490:1;487;480:12;439:55;-1:-1:-1;513:20:1;;-1:-1:-1;;;;;545:30:1;;542:50;;;588:1;585;578:12;542:50;625:4;617:6;613:17;601:29;;677:3;670:4;661:6;653;649:19;645:30;642:39;639:59;;;694:1;691;684:12;709:186;768:6;821:2;809:9;800:7;796:23;792:32;789:52;;;837:1;834;827:12;789:52;860:29;879:9;860:29;:::i;900:260::-;968:6;976;1029:2;1017:9;1008:7;1004:23;1000:32;997:52;;;1045:1;1042;1035:12;997:52;1068:29;1087:9;1068:29;:::i;:::-;1058:39;;1116:38;1150:2;1139:9;1135:18;1116:38;:::i;:::-;1106:48;;900:260;;;;;:::o;1165:328::-;1242:6;1250;1258;1311:2;1299:9;1290:7;1286:23;1282:32;1279:52;;;1327:1;1324;1317:12;1279:52;1350:29;1369:9;1350:29;:::i;:::-;1340:39;;1398:38;1432:2;1421:9;1417:18;1398:38;:::i;:::-;1388:48;;1483:2;1472:9;1468:18;1455:32;1445:42;;1165:328;;;;;:::o;1498:980::-;1593:6;1601;1609;1617;1670:3;1658:9;1649:7;1645:23;1641:33;1638:53;;;1687:1;1684;1677:12;1638:53;1710:29;1729:9;1710:29;:::i;:::-;1700:39;;1758:2;1779:38;1813:2;1802:9;1798:18;1779:38;:::i;:::-;1769:48;;1864:2;1853:9;1849:18;1836:32;1826:42;;1919:2;1908:9;1904:18;1891:32;-1:-1:-1;;;;;1983:2:1;1975:6;1972:14;1969:34;;;1999:1;1996;1989:12;1969:34;2037:6;2026:9;2022:22;2012:32;;2082:7;2075:4;2071:2;2067:13;2063:27;2053:55;;2104:1;2101;2094:12;2053:55;2140:2;2127:16;2162:2;2158;2155:10;2152:36;;;2168:18;;:::i;:::-;2210:53;2253:2;2234:13;;-1:-1:-1;;2230:27:1;2226:36;;2210:53;:::i;:::-;2197:66;;2286:2;2279:5;2272:17;2326:7;2321:2;2316;2312;2308:11;2304:20;2301:33;2298:53;;;2347:1;2344;2337:12;2298:53;2402:2;2397;2393;2389:11;2384:2;2377:5;2373:14;2360:45;2446:1;2441:2;2436;2429:5;2425:14;2421:23;2414:34;;2467:5;2457:15;;;;;1498:980;;;;;;;:::o;2483:254::-;2548:6;2556;2609:2;2597:9;2588:7;2584:23;2580:32;2577:52;;;2625:1;2622;2615:12;2577:52;2648:29;2667:9;2648:29;:::i;:::-;2638:39;;2696:35;2727:2;2716:9;2712:18;2696:35;:::i;2742:254::-;2810:6;2818;2871:2;2859:9;2850:7;2846:23;2842:32;2839:52;;;2887:1;2884;2877:12;2839:52;2910:29;2929:9;2910:29;:::i;:::-;2900:39;2986:2;2971:18;;;;2958:32;;-1:-1:-1;;;2742:254:1:o;3001:963::-;3085:6;3116:2;3159;3147:9;3138:7;3134:23;3130:32;3127:52;;;3175:1;3172;3165:12;3127:52;3215:9;3202:23;-1:-1:-1;;;;;3285:2:1;3277:6;3274:14;3271:34;;;3301:1;3298;3291:12;3271:34;3339:6;3328:9;3324:22;3314:32;;3384:7;3377:4;3373:2;3369:13;3365:27;3355:55;;3406:1;3403;3396:12;3355:55;3442:2;3429:16;3464:2;3460;3457:10;3454:36;;;3470:18;;:::i;:::-;3516:2;3513:1;3509:10;3499:20;;3539:28;3563:2;3559;3555:11;3539:28;:::i;:::-;3601:15;;;3632:12;;;;3664:11;;;3694;;;3690:20;;3687:33;-1:-1:-1;3684:53:1;;;3733:1;3730;3723:12;3684:53;3755:1;3746:10;;3765:169;3779:2;3776:1;3773:9;3765:169;;;3836:23;3855:3;3836:23;:::i;:::-;3824:36;;3797:1;3790:9;;;;;3880:12;;;;3912;;3765:169;;;-1:-1:-1;3953:5:1;3001:963;-1:-1:-1;;;;;;;;3001:963:1:o;3969:180::-;4025:6;4078:2;4066:9;4057:7;4053:23;4049:32;4046:52;;;4094:1;4091;4084:12;4046:52;4117:26;4133:9;4117:26;:::i;4154:245::-;4212:6;4265:2;4253:9;4244:7;4240:23;4236:32;4233:52;;;4281:1;4278;4271:12;4233:52;4320:9;4307:23;4339:30;4363:5;4339:30;:::i;4404:249::-;4473:6;4526:2;4514:9;4505:7;4501:23;4497:32;4494:52;;;4542:1;4539;4532:12;4494:52;4574:9;4568:16;4593:30;4617:5;4593:30;:::i;4658:410::-;4729:6;4737;4790:2;4778:9;4769:7;4765:23;4761:32;4758:52;;;4806:1;4803;4796:12;4758:52;4846:9;4833:23;-1:-1:-1;;;;;4871:6:1;4868:30;4865:50;;;4911:1;4908;4901:12;4865:50;4950:58;5000:7;4991:6;4980:9;4976:22;4950:58;:::i;:::-;5027:8;;4924:84;;-1:-1:-1;4658:410:1;-1:-1:-1;;;;4658:410:1:o;5073:718::-;5164:6;5172;5180;5188;5241:2;5229:9;5220:7;5216:23;5212:32;5209:52;;;5257:1;5254;5247:12;5209:52;5297:9;5284:23;-1:-1:-1;;;;;5367:2:1;5359:6;5356:14;5353:34;;;5383:1;5380;5373:12;5353:34;5422:58;5472:7;5463:6;5452:9;5448:22;5422:58;:::i;:::-;5499:8;;-1:-1:-1;5396:84:1;-1:-1:-1;5587:2:1;5572:18;;5559:32;;-1:-1:-1;5603:16:1;;;5600:36;;;5632:1;5629;5622:12;5600:36;;5671:60;5723:7;5712:8;5701:9;5697:24;5671:60;:::i;:::-;5073:718;;;;-1:-1:-1;5750:8:1;-1:-1:-1;;;;5073:718:1:o;5796:180::-;5855:6;5908:2;5896:9;5887:7;5883:23;5879:32;5876:52;;;5924:1;5921;5914:12;5876:52;-1:-1:-1;5947:23:1;;5796:180;-1:-1:-1;5796:180:1:o;5981:254::-;6049:6;6057;6110:2;6098:9;6089:7;6085:23;6081:32;6078:52;;;6126:1;6123;6116:12;6078:52;6162:9;6149:23;6139:33;;6191:38;6225:2;6214:9;6210:18;6191:38;:::i;6240:786::-;6340:6;6348;6356;6364;6372;6425:2;6413:9;6404:7;6400:23;6396:32;6393:52;;;6441:1;6438;6431:12;6393:52;6477:9;6464:23;6454:33;;6538:2;6527:9;6523:18;6510:32;-1:-1:-1;;;;;6602:2:1;6594:6;6591:14;6588:34;;;6618:1;6615;6608:12;6588:34;6657:58;6707:7;6698:6;6687:9;6683:22;6657:58;:::i;:::-;6734:8;;-1:-1:-1;6631:84:1;-1:-1:-1;6822:2:1;6807:18;;6794:32;;-1:-1:-1;6838:16:1;;;6835:36;;;6867:1;6864;6857:12;6835:36;;6906:60;6958:7;6947:8;6936:9;6932:24;6906:60;:::i;:::-;6240:786;;;;-1:-1:-1;6240:786:1;;-1:-1:-1;6985:8:1;;6880:86;6240:786;-1:-1:-1;;;6240:786:1:o;7031:257::-;7072:3;7110:5;7104:12;7137:6;7132:3;7125:19;7153:63;7209:6;7202:4;7197:3;7193:14;7186:4;7179:5;7175:16;7153:63;:::i;:::-;7270:2;7249:15;-1:-1:-1;;7245:29:1;7236:39;;;;7277:4;7232:50;;7031:257;-1:-1:-1;;7031:257:1:o;7293:637::-;7573:3;7611:6;7605:13;7627:53;7673:6;7668:3;7661:4;7653:6;7649:17;7627:53;:::i;:::-;7743:13;;7702:16;;;;7765:57;7743:13;7702:16;7799:4;7787:17;;7765:57;:::i;:::-;-1:-1:-1;;;7844:20:1;;7873:22;;;7922:1;7911:13;;7293:637;-1:-1:-1;;;;7293:637:1:o;8738:488::-;-1:-1:-1;;;;;9007:15:1;;;8989:34;;9059:15;;9054:2;9039:18;;9032:43;9106:2;9091:18;;9084:34;;;9154:3;9149:2;9134:18;;9127:31;;;8932:4;;9175:45;;9200:19;;9192:6;9175:45;:::i;:::-;9167:53;8738:488;-1:-1:-1;;;;;;8738:488:1:o;10392:593::-;10607:2;10596:9;10589:21;10646:6;10641:2;10630:9;10626:18;10619:34;10704:6;10696;10690:3;10679:9;10675:19;10662:49;10761:1;10755:3;10731:22;;;10727:32;;10720:43;;;;-1:-1:-1;;;;;10911:15:1;;;10904:4;10889:20;;10882:45;10963:15;;;;10958:2;10943:18;;10936:43;10824:2;10803:15;;;-1:-1:-1;;10799:29:1;10784:45;10780:55;;;-1:-1:-1;10392:593:1:o;10990:219::-;11139:2;11128:9;11121:21;11102:4;11159:44;11199:2;11188:9;11184:18;11176:6;11159:44;:::i;13552:348::-;13754:2;13736:21;;;13793:2;13773:18;;;13766:30;13832:26;13827:2;13812:18;;13805:54;13891:2;13876:18;;13552:348::o;20776:356::-;20978:2;20960:21;;;20997:18;;;20990:30;21056:34;21051:2;21036:18;;21029:62;21123:2;21108:18;;20776:356::o;23355:415::-;23557:2;23539:21;;;23596:2;23576:18;;;23569:30;23635:34;23630:2;23615:18;;23608:62;-1:-1:-1;;;23701:2:1;23686:18;;23679:49;23760:3;23745:19;;23355:415::o;25641:400::-;25843:2;25825:21;;;25882:2;25862:18;;;25855:30;25921:34;25916:2;25901:18;;25894:62;-1:-1:-1;;;25987:2:1;25972:18;;25965:34;26031:3;26016:19;;25641:400::o;28595:275::-;28666:2;28660:9;28731:2;28712:13;;-1:-1:-1;;28708:27:1;28696:40;;-1:-1:-1;;;;;28751:34:1;;28787:22;;;28748:62;28745:88;;;28813:18;;:::i;:::-;28849:2;28842:22;28595:275;;-1:-1:-1;28595:275:1:o;28875:253::-;28915:3;-1:-1:-1;;;;;29004:2:1;29001:1;28997:10;29034:2;29031:1;29027:10;29065:3;29061:2;29057:12;29052:3;29049:21;29046:47;;;29073:18;;:::i;:::-;29109:13;;28875:253;-1:-1:-1;;;;28875:253:1:o;29133:128::-;29173:3;29204:1;29200:6;29197:1;29194:13;29191:39;;;29210:18;;:::i;:::-;-1:-1:-1;29246:9:1;;29133:128::o;29266:120::-;29306:1;29332;29322:35;;29337:18;;:::i;:::-;-1:-1:-1;29371:9:1;;29266:120::o;29391:168::-;29431:7;29497:1;29493;29489:6;29485:14;29482:1;29479:21;29474:1;29467:9;29460:17;29456:45;29453:71;;;29504:18;;:::i;:::-;-1:-1:-1;29544:9:1;;29391:168::o;29564:246::-;29604:4;-1:-1:-1;;;;;29717:10:1;;;;29687;;29739:12;;;29736:38;;;29754:18;;:::i;:::-;29791:13;;29564:246;-1:-1:-1;;;29564:246:1:o;29815:125::-;29855:4;29883:1;29880;29877:8;29874:34;;;29888:18;;:::i;:::-;-1:-1:-1;29925:9:1;;29815:125::o;29945:258::-;30017:1;30027:113;30041:6;30038:1;30035:13;30027:113;;;30117:11;;;30111:18;30098:11;;;30091:39;30063:2;30056:10;30027:113;;;30158:6;30155:1;30152:13;30149:48;;;-1:-1:-1;;30193:1:1;30175:16;;30168:27;29945:258::o;30208:136::-;30247:3;30275:5;30265:39;;30284:18;;:::i;:::-;-1:-1:-1;;;30320:18:1;;30208:136::o;30349:380::-;30428:1;30424:12;;;;30471;;;30492:61;;30546:4;30538:6;30534:17;30524:27;;30492:61;30599:2;30591:6;30588:14;30568:18;30565:38;30562:161;;;30645:10;30640:3;30636:20;30633:1;30626:31;30680:4;30677:1;30670:15;30708:4;30705:1;30698:15;30562:161;;30349:380;;;:::o;30734:135::-;30773:3;-1:-1:-1;;30794:17:1;;30791:43;;;30814:18;;:::i;:::-;-1:-1:-1;30861:1:1;30850:13;;30734:135::o;30874:112::-;30906:1;30932;30922:35;;30937:18;;:::i;:::-;-1:-1:-1;30971:9:1;;30874:112::o;30991:127::-;31052:10;31047:3;31043:20;31040:1;31033:31;31083:4;31080:1;31073:15;31107:4;31104:1;31097:15;31123:127;31184:10;31179:3;31175:20;31172:1;31165:31;31215:4;31212:1;31205:15;31239:4;31236:1;31229:15;31255:127;31316:10;31311:3;31307:20;31304:1;31297:31;31347:4;31344:1;31337:15;31371:4;31368:1;31361:15;31387:127;31448:10;31443:3;31439:20;31436:1;31429:31;31479:4;31476:1;31469:15;31503:4;31500:1;31493:15;31519:127;31580:10;31575:3;31571:20;31568:1;31561:31;31611:4;31608:1;31601:15;31635:4;31632:1;31625:15;31651:131;-1:-1:-1;;;;;;31725:32:1;;31715:43;;31705:71;;31772:1;31769;31762:12

Swarm Source

ipfs://c6f84eedd0dcbf887905024306dbd5c314ae109da8d2afec371daedb281ca396
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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