ETH Price: $2,962.20 (-1.93%)
Gas: 3 Gwei

Token

Micro Mates (MATE)
 

Overview

Max Total Supply

0 MATE

Holders

108

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MATE
0x841251f4a7636eeab62b884f13fcfbf472cbef14
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:
MicroMatesNFT

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.9.6 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File contracts/MicroMatesNFT.sol



pragma solidity ^0.8.14;



contract MicroMatesNFT is ERC721, Ownable {
  using Strings for uint256;

  uint256 public supply = 0;

  // the number of nfts that have been minted in this wave
  uint256 public waveSupply = 0;
  // the max number of nfts that can be minted in this wave
  uint256 public maxWaveSupply = 1000;
  // the id of the current wave
  uint256 public currentWaveId = 0;
  // the max number of nfts that each wallet is allowed to mint in each wave
  uint256 public maxMintAmountPerWalletPerWave = 2;
  // maps wave id => address => mint count
  mapping (uint256 => mapping (address => uint256)) mintCounts;

  string public uriPrefix = "";
  string public uriSuffix = "";
  
  uint256 public cost = 0;
  uint256 public maxSupply = 15000;
  uint256 public maxMintAmountPerTx = 5;

  bool public isMintPaused = true;
  bool public isWhitelistMintPaused = true;

  bytes32 whitelistMerkleRoot;

  address private beneficiary;

  // this event tells our back end that a user should get
  // a new Micro Mate that they can build
  event CustomizableMint(address indexed minter, uint256 nftId);

  // this event is fired when the owner of the contract
  // airdrops an nft to someone
  event AirdropMint(address indexed to, uint256 nftId, bytes data);

  constructor(address _beneficiary) ERC721("Micro Mates", "MATE") {
    beneficiary = _beneficiary;
  }

  modifier mintSupplyCheck(uint256 _mintAmount) {
    // make sure they don't mint more than our max supply
    require(supply + _mintAmount <= maxSupply, "Max supply exceeded!");
    // make sure they don't mint more than the max supply for the current wave if there is one
    require(maxWaveSupply > 0 && waveSupply + _mintAmount <= maxWaveSupply, "Max wave supply exceeded!");
    _;
  }

  modifier mintAmountPerTxCheck(uint256 _mintAmount) {
    if (maxMintAmountPerTx > 0) {
      // make sure they don't mint more than the allowed amount/transaction
      require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    }
    _;
  }

  modifier mintAmountPerWalletCheck(uint256 _mintAmount) {
    if (maxMintAmountPerWalletPerWave > 0) {
      // make sure they don't mint more than the allowed amount/wallet
      require(_mintAmount + mintCounts[currentWaveId][msg.sender] <= maxMintAmountPerWalletPerWave, "You can't mint that many");
    }
    _;
  }

  modifier paymentCheck(uint256 _mintAmount) {
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    _;
  }

  function mint(uint256 _mintAmount) 
  public payable 
  mintSupplyCheck(_mintAmount)
  mintAmountPerTxCheck(_mintAmount)
  mintAmountPerWalletCheck(_mintAmount)
  paymentCheck(_mintAmount) {
    require(!isMintPaused, "Minting is paused!");

    mintCounts[currentWaveId][msg.sender] += _mintAmount;
    _mintLoop(msg.sender, _mintAmount, true);
  }

  function whitelistMint(uint256 _mintAmount, bytes32[] calldata merkleProof) 
  public payable 
  mintSupplyCheck(_mintAmount)
  mintAmountPerTxCheck(_mintAmount)
  mintAmountPerWalletCheck(_mintAmount)
  paymentCheck(_mintAmount) {
    require(!isWhitelistMintPaused, "Whitelist minting is paused!");
    require(MerkleProof.verify(merkleProof, whitelistMerkleRoot, keccak256(abi.encodePacked(msg.sender))), "Invalid merkle proof");

    mintCounts[currentWaveId][msg.sender] += _mintAmount;
    _mintLoop(msg.sender, _mintAmount, true);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver, bytes calldata data) public mintSupplyCheck(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount, false, data);
  }

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

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

  function amountAllowedToMint(address wallet) public view returns (uint256) {
    uint256 maxAmnt = maxMintAmountPerWalletPerWave;

    // if the max amount is set to 0, that means no max amount,
    // so we return 0 to avoid an exception when we try to return
    // a negative number
    if (maxAmnt == 0) {
      return 0;
    }

    return maxAmnt - mintCounts[currentWaveId][wallet];
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setMaxMintAmountPerWalletPerWave(uint256 _maxMintAmountPerWalletPerWave) public onlyOwner {
    maxMintAmountPerWalletPerWave = _maxMintAmountPerWalletPerWave;
  }

  function setMaxWaveSupply(uint256 _maxWaveSupply) public onlyOwner {
    maxWaveSupply = _maxWaveSupply;
  }

  function setupWave() public onlyOwner {
    currentWaveId += 1;
    waveSupply = 0;
  }

  function setWhitelistMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    whitelistMerkleRoot = _merkleRoot;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    isMintPaused = _state;
  }

  function setWhitelistPaused(bool _state) public onlyOwner {
    isWhitelistMintPaused = _state;
  }

  function withdraw() public onlyOwner {
    // This will transfer the remaining contract balance to the owner.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(beneficiary).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

  function _mintLoop(address _receiver, uint256 _mintAmount, bool isCustomizable, bytes memory data) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply += 1;
      waveSupply += 1;
      _safeMint(_receiver, supply);
      if (isCustomizable) {
        emit CustomizableMint(_receiver, supply);
      } else {
        emit AirdropMint(_receiver, supply, data);
      }
    }
  }

  function _mintLoop(address _receiver, uint256 _mintAmount, bool isCustomizable) internal {
    _mintLoop(_receiver, _mintAmount, isCustomizable, "");
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"AirdropMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"CustomizableMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"amountAllowedToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentWaveId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWalletPerWave","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":"maxWaveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWalletPerWave","type":"uint256"}],"name":"setMaxMintAmountPerWalletPerWave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWaveSupply","type":"uint256"}],"name":"setMaxWaveSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setupWave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"waveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060075560006008556103e86009556000600a556002600b5560405180602001604052806000815250600d908051906020019062000045929190620002bd565b5060405180602001604052806000815250600e90805190602001906200006d929190620002bd565b506000600f55613a9860105560056011556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff021916908315150217905550348015620000c157600080fd5b5060405162005197380380620051978339818101604052810190620000e79190620003d7565b6040518060400160405280600b81526020017f4d6963726f204d617465730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d4154450000000000000000000000000000000000000000000000000000000081525081600090805190602001906200016b929190620002bd565b50806001908051906020019062000184929190620002bd565b505050620001a76200019b620001ef60201b60201c565b620001f760201b60201c565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200046d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002cb9062000438565b90600052602060002090601f016020900481019282620002ef57600085556200033b565b82601f106200030a57805160ff19168380011785556200033b565b828001600101855582156200033b579182015b828111156200033a5782518255916020019190600101906200031d565b5b5090506200034a91906200034e565b5090565b5b80821115620003695760008160009055506001016200034f565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200039f8262000372565b9050919050565b620003b18162000392565b8114620003bd57600080fd5b50565b600081519050620003d181620003a6565b92915050565b600060208284031215620003f057620003ef6200036d565b5b60006200040084828501620003c0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045157607f821691505b60208210810362000467576200046662000409565b5b50919050565b614d1a806200047d6000396000f3fe60806040526004361061025c5760003560e01c80636352211e11610144578063b071401b116100b6578063c82335c51161007a578063c82335c514610889578063c87b56dd146108b4578063d2cab056146108f1578063d5abeb011461090d578063e985e9c514610938578063f2fde38b146109755761025c565b8063b071401b146107ba578063b7203b8f146107e3578063b88d4fde1461080c578063bc745cc714610835578063bd32fb66146108605761025c565b80638da5cb5b116101085780638da5cb5b146106c95780638fe82356146106f457806394354fd01461071f57806395d89b411461074a578063a0712d6814610775578063a22cb465146107915761025c565b80636352211e146105e457806370a0823114610621578063715018a61461065e57806375280fcb146106755780637ec4a659146106a05761025c565b806316c38b3c116101dd57806342842e0e116101a157806342842e0e146104fc57806344a0d68a1461052557806349a2bea71461054e5780634ecd5c4b146105655780635503a0e81461058e57806362b99ad4146105b95761025c565b806316c38b3c1461043f57806323b872dd1461046857806335ccf2d2146104915780633c69f422146104bc5780633ccfd60b146104e55761025c565b8063095ea7b311610224578063095ea7b31461035a578063117741b91461038357806313faede6146103c057806315839b30146103eb57806316ba10e0146104165761025c565b806301ffc9a714610261578063047fc9aa1461029e57806305d5963d146102c957806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613369565b61099e565b60405161029591906133b1565b60405180910390f35b3480156102aa57600080fd5b506102b3610a80565b6040516102c091906133e5565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb919061342c565b610a86565b005b3480156102fe57600080fd5b50610307610b0c565b60405161031491906134f2565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f919061342c565b610b9e565b6040516103519190613555565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061359c565b610c23565b005b34801561038f57600080fd5b506103aa60048036038101906103a591906135dc565b610d3a565b6040516103b791906133e5565b60405180910390f35b3480156103cc57600080fd5b506103d5610dbb565b6040516103e291906133e5565b60405180910390f35b3480156103f757600080fd5b50610400610dc1565b60405161040d91906133b1565b60405180910390f35b34801561042257600080fd5b5061043d6004803603810190610438919061373e565b610dd4565b005b34801561044b57600080fd5b50610466600480360381019061046191906137b3565b610e6a565b005b34801561047457600080fd5b5061048f600480360381019061048a91906137e0565b610f03565b005b34801561049d57600080fd5b506104a6610f63565b6040516104b391906133e5565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613893565b610f69565b005b3480156104f157600080fd5b506104fa6110f0565b005b34801561050857600080fd5b50610523600480360381019061051e91906137e0565b611207565b005b34801561053157600080fd5b5061054c6004803603810190610547919061342c565b611227565b005b34801561055a57600080fd5b506105636112ad565b005b34801561057157600080fd5b5061058c6004803603810190610587919061342c565b61134d565b005b34801561059a57600080fd5b506105a36113d3565b6040516105b091906134f2565b60405180910390f35b3480156105c557600080fd5b506105ce611461565b6040516105db91906134f2565b60405180910390f35b3480156105f057600080fd5b5061060b6004803603810190610606919061342c565b6114ef565b6040516106189190613555565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906135dc565b6115a0565b60405161065591906133e5565b60405180910390f35b34801561066a57600080fd5b50610673611657565b005b34801561068157600080fd5b5061068a6116df565b60405161069791906133b1565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c2919061373e565b6116f2565b005b3480156106d557600080fd5b506106de611788565b6040516106eb9190613555565b60405180910390f35b34801561070057600080fd5b506107096117b2565b60405161071691906133e5565b60405180910390f35b34801561072b57600080fd5b506107346117b8565b60405161074191906133e5565b60405180910390f35b34801561075657600080fd5b5061075f6117be565b60405161076c91906134f2565b60405180910390f35b61078f600480360381019061078a919061342c565b611850565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613907565b611b2d565b005b3480156107c657600080fd5b506107e160048036038101906107dc919061342c565b611b43565b005b3480156107ef57600080fd5b5061080a600480360381019061080591906137b3565b611bc9565b005b34801561081857600080fd5b50610833600480360381019061082e91906139e8565b611c62565b005b34801561084157600080fd5b5061084a611cc4565b60405161085791906133e5565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613aa1565b611cca565b005b34801561089557600080fd5b5061089e611d50565b6040516108ab91906133e5565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d6919061342c565b611d56565b6040516108e891906134f2565b60405180910390f35b61090b60048036038101906109069190613b24565b611e00565b005b34801561091957600080fd5b50610922612192565b60405161092f91906133e5565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613b84565b612198565b60405161096c91906133b1565b60405180910390f35b34801561098157600080fd5b5061099c600480360381019061099791906135dc565b61222c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a795750610a7882612323565b5b9050919050565b60075481565b610a8e61238d565b73ffffffffffffffffffffffffffffffffffffffff16610aac611788565b73ffffffffffffffffffffffffffffffffffffffff1614610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990613c10565b60405180910390fd5b8060098190555050565b606060008054610b1b90613c5f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4790613c5f565b8015610b945780601f10610b6957610100808354040283529160200191610b94565b820191906000526020600020905b815481529060010190602001808311610b7757829003601f168201915b5050505050905090565b6000610ba982612395565b610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613d02565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2e826114ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590613d94565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cbd61238d565b73ffffffffffffffffffffffffffffffffffffffff161480610cec5750610ceb81610ce661238d565b612198565b5b610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613e26565b60405180910390fd5b610d358383612401565b505050565b600080600b54905060008103610d54576000915050610db6565b600c6000600a54815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481610db29190613e75565b9150505b919050565b600f5481565b601260009054906101000a900460ff1681565b610ddc61238d565b73ffffffffffffffffffffffffffffffffffffffff16610dfa611788565b73ffffffffffffffffffffffffffffffffffffffff1614610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613c10565b60405180910390fd5b80600e9080519060200190610e6692919061325a565b5050565b610e7261238d565b73ffffffffffffffffffffffffffffffffffffffff16610e90611788565b73ffffffffffffffffffffffffffffffffffffffff1614610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613c10565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b610f14610f0e61238d565b826124ba565b610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90613f1b565b60405180910390fd5b610f5e838383612598565b505050565b60085481565b8360105481600754610f7b9190613f3b565b1115610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613fdd565b60405180910390fd5b6000600954118015610fdd575060095481600854610fda9190613f3b565b11155b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390614049565b60405180910390fd5b61102461238d565b73ffffffffffffffffffffffffffffffffffffffff16611042611788565b73ffffffffffffffffffffffffffffffffffffffff1614611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90613c10565b60405180910390fd5b6110e98486600086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127fe565b5050505050565b6110f861238d565b73ffffffffffffffffffffffffffffffffffffffff16611116611788565b73ffffffffffffffffffffffffffffffffffffffff161461116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390613c10565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516111b49061409a565b60006040518083038185875af1925050503d80600081146111f1576040519150601f19603f3d011682016040523d82523d6000602084013e6111f6565b606091505b505090508061120457600080fd5b50565b61122283838360405180602001604052806000815250611c62565b505050565b61122f61238d565b73ffffffffffffffffffffffffffffffffffffffff1661124d611788565b73ffffffffffffffffffffffffffffffffffffffff16146112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90613c10565b60405180910390fd5b80600f8190555050565b6112b561238d565b73ffffffffffffffffffffffffffffffffffffffff166112d3611788565b73ffffffffffffffffffffffffffffffffffffffff1614611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090613c10565b60405180910390fd5b6001600a600082825461133c9190613f3b565b925050819055506000600881905550565b61135561238d565b73ffffffffffffffffffffffffffffffffffffffff16611373611788565b73ffffffffffffffffffffffffffffffffffffffff16146113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613c10565b60405180910390fd5b80600b8190555050565b600e80546113e090613c5f565b80601f016020809104026020016040519081016040528092919081815260200182805461140c90613c5f565b80156114595780601f1061142e57610100808354040283529160200191611459565b820191906000526020600020905b81548152906001019060200180831161143c57829003601f168201915b505050505081565b600d805461146e90613c5f565b80601f016020809104026020016040519081016040528092919081815260200182805461149a90613c5f565b80156114e75780601f106114bc576101008083540402835291602001916114e7565b820191906000526020600020905b8154815290600101906020018083116114ca57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90614121565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611607906141b3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61165f61238d565b73ffffffffffffffffffffffffffffffffffffffff1661167d611788565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613c10565b60405180910390fd5b6116dd6000612911565b565b601260019054906101000a900460ff1681565b6116fa61238d565b73ffffffffffffffffffffffffffffffffffffffff16611718611788565b73ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613c10565b60405180910390fd5b80600d908051906020019061178492919061325a565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b60115481565b6060600180546117cd90613c5f565b80601f01602080910402602001604051908101604052809291908181526020018280546117f990613c5f565b80156118465780601f1061181b57610100808354040283529160200191611846565b820191906000526020600020905b81548152906001019060200180831161182957829003601f168201915b5050505050905090565b80601054816007546118629190613f3b565b11156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90613fdd565b60405180910390fd5b60006009541180156118c45750600954816008546118c19190613f3b565b11155b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90614049565b60405180910390fd5b81600060115411156119615760008111801561192157506011548111155b611960576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119579061421f565b60405180910390fd5b5b826000600b541115611a1057600b54600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826119ce9190613f3b565b1115611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a069061428b565b60405180910390fd5b5b8380600f54611a1f91906142ab565b341015611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614351565b60405180910390fd5b601260009054906101000a900460ff1615611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa8906143bd565b60405180910390fd5b84600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b139190613f3b565b92505081905550611b26338660016129d7565b5050505050565b611b3f611b3861238d565b83836129f7565b5050565b611b4b61238d565b73ffffffffffffffffffffffffffffffffffffffff16611b69611788565b73ffffffffffffffffffffffffffffffffffffffff1614611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb690613c10565b60405180910390fd5b8060118190555050565b611bd161238d565b73ffffffffffffffffffffffffffffffffffffffff16611bef611788565b73ffffffffffffffffffffffffffffffffffffffff1614611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90613c10565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b611c73611c6d61238d565b836124ba565b611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613f1b565b60405180910390fd5b611cbe84848484612b63565b50505050565b600b5481565b611cd261238d565b73ffffffffffffffffffffffffffffffffffffffff16611cf0611788565b73ffffffffffffffffffffffffffffffffffffffff1614611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90613c10565b60405180910390fd5b8060138190555050565b600a5481565b6060611d6182612395565b611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d979061444f565b60405180910390fd5b6000611daa612bbf565b90506000815111611dca5760405180602001604052806000815250611df8565b80611dd484612c51565b600e604051602001611de89392919061453f565b6040516020818303038152906040525b915050919050565b8260105481600754611e129190613f3b565b1115611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613fdd565b60405180910390fd5b6000600954118015611e74575060095481600854611e719190613f3b565b11155b611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614049565b60405180910390fd5b8360006011541115611f1157600081118015611ed157506011548111155b611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f079061421f565b60405180910390fd5b5b846000600b541115611fc057600b54600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611f7e9190613f3b565b1115611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb69061428b565b60405180910390fd5b5b8580600f54611fcf91906142ab565b341015612011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200890614351565b60405180910390fd5b601260019054906101000a900460ff1615612061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612058906145bc565b60405180910390fd5b6120d5868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601354336040516020016120ba9190614624565b60405160208183030381529060405280519060200120612db1565b612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b9061468b565b60405180910390fd5b86600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121769190613f3b565b92505081905550612189338860016129d7565b50505050505050565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61223461238d565b73ffffffffffffffffffffffffffffffffffffffff16612252611788565b73ffffffffffffffffffffffffffffffffffffffff16146122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90613c10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e9061471d565b60405180910390fd5b61232081612911565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612474836114ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124c582612395565b612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906147af565b60405180910390fd5b600061250f836114ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061255157506125508185612198565b5b8061258f57508373ffffffffffffffffffffffffffffffffffffffff1661257784610b9e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125b8826114ef565b73ffffffffffffffffffffffffffffffffffffffff161461260e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260590614841565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361267d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612674906148d3565b60405180910390fd5b612688838383612dc8565b612693600082612401565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e39190613e75565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273a9190613f3b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127f9838383612dcd565b505050565b60005b8381101561290a5760016007600082825461281c9190613f3b565b925050819055506001600860008282546128369190613f3b565b9250508190555061284985600754612dd2565b82156128a4578473ffffffffffffffffffffffffffffffffffffffff167fd129cb3f6d79a399d6b34a401ba5ca705f56d9ea38f9885c8c9a4931976fa58160075460405161289791906133e5565b60405180910390a26128f7565b8473ffffffffffffffffffffffffffffffffffffffff167f28f72922bb3866e64334b43b18f6430877a94ada808fb43e26119371c0ea6599600754846040516128ee929190614948565b60405180910390a25b808061290290614978565b915050612801565b5050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129f2838383604051806020016040528060008152506127fe565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90614a0c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b5691906133b1565b60405180910390a3505050565b612b6e848484612598565b612b7a84848484612df0565b612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb090614a9e565b60405180910390fd5b50505050565b6060600d8054612bce90613c5f565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfa90613c5f565b8015612c475780601f10612c1c57610100808354040283529160200191612c47565b820191906000526020600020905b815481529060010190602001808311612c2a57829003601f168201915b5050505050905090565b606060008203612c98576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dac565b600082905060005b60008214612cca578080612cb390614978565b915050600a82612cc39190614aed565b9150612ca0565b60008167ffffffffffffffff811115612ce657612ce5613613565b5b6040519080825280601f01601f191660200182016040528015612d185781602001600182028036833780820191505090505b5090505b60008514612da557600182612d319190613e75565b9150600a85612d409190614b1e565b6030612d4c9190613f3b565b60f81b818381518110612d6257612d61614b4f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d9e9190614aed565b9450612d1c565b8093505050505b919050565b600082612dbe8584612f77565b1490509392505050565b505050565b505050565b612dec828260405180602001604052806000815250612fec565b5050565b6000612e118473ffffffffffffffffffffffffffffffffffffffff16613047565b15612f6a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e3a61238d565b8786866040518563ffffffff1660e01b8152600401612e5c9493929190614b7e565b6020604051808303816000875af1925050508015612e9857506040513d601f19601f82011682018060405250810190612e959190614bdf565b60015b612f1a573d8060008114612ec8576040519150601f19603f3d011682016040523d82523d6000602084013e612ecd565b606091505b506000815103612f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0990614a9e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f6f565b600190505b949350505050565b60008082905060005b8451811015612fe1576000858281518110612f9e57612f9d614b4f565b5b60200260200101519050808311612fc057612fb9838261306a565b9250612fcd565b612fca818461306a565b92505b508080612fd990614978565b915050612f80565b508091505092915050565b612ff68383613081565b6130036000848484612df0565b613042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303990614a9e565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e790614c58565b60405180910390fd5b6130f981612395565b15613139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313090614cc4565b60405180910390fd5b61314560008383612dc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131959190613f3b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325660008383612dcd565b5050565b82805461326690613c5f565b90600052602060002090601f01602090048101928261328857600085556132cf565b82601f106132a157805160ff19168380011785556132cf565b828001600101855582156132cf579182015b828111156132ce5782518255916020019190600101906132b3565b5b5090506132dc91906132e0565b5090565b5b808211156132f95760008160009055506001016132e1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61334681613311565b811461335157600080fd5b50565b6000813590506133638161333d565b92915050565b60006020828403121561337f5761337e613307565b5b600061338d84828501613354565b91505092915050565b60008115159050919050565b6133ab81613396565b82525050565b60006020820190506133c660008301846133a2565b92915050565b6000819050919050565b6133df816133cc565b82525050565b60006020820190506133fa60008301846133d6565b92915050565b613409816133cc565b811461341457600080fd5b50565b60008135905061342681613400565b92915050565b60006020828403121561344257613441613307565b5b600061345084828501613417565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613493578082015181840152602081019050613478565b838111156134a2576000848401525b50505050565b6000601f19601f8301169050919050565b60006134c482613459565b6134ce8185613464565b93506134de818560208601613475565b6134e7816134a8565b840191505092915050565b6000602082019050818103600083015261350c81846134b9565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061353f82613514565b9050919050565b61354f81613534565b82525050565b600060208201905061356a6000830184613546565b92915050565b61357981613534565b811461358457600080fd5b50565b60008135905061359681613570565b92915050565b600080604083850312156135b3576135b2613307565b5b60006135c185828601613587565b92505060206135d285828601613417565b9150509250929050565b6000602082840312156135f2576135f1613307565b5b600061360084828501613587565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61364b826134a8565b810181811067ffffffffffffffff8211171561366a57613669613613565b5b80604052505050565b600061367d6132fd565b90506136898282613642565b919050565b600067ffffffffffffffff8211156136a9576136a8613613565b5b6136b2826134a8565b9050602081019050919050565b82818337600083830152505050565b60006136e16136dc8461368e565b613673565b9050828152602081018484840111156136fd576136fc61360e565b5b6137088482856136bf565b509392505050565b600082601f83011261372557613724613609565b5b81356137358482602086016136ce565b91505092915050565b60006020828403121561375457613753613307565b5b600082013567ffffffffffffffff8111156137725761377161330c565b5b61377e84828501613710565b91505092915050565b61379081613396565b811461379b57600080fd5b50565b6000813590506137ad81613787565b92915050565b6000602082840312156137c9576137c8613307565b5b60006137d78482850161379e565b91505092915050565b6000806000606084860312156137f9576137f8613307565b5b600061380786828701613587565b935050602061381886828701613587565b925050604061382986828701613417565b9150509250925092565b600080fd5b600080fd5b60008083601f84011261385357613852613609565b5b8235905067ffffffffffffffff8111156138705761386f613833565b5b60208301915083600182028301111561388c5761388b613838565b5b9250929050565b600080600080606085870312156138ad576138ac613307565b5b60006138bb87828801613417565b94505060206138cc87828801613587565b935050604085013567ffffffffffffffff8111156138ed576138ec61330c565b5b6138f98782880161383d565b925092505092959194509250565b6000806040838503121561391e5761391d613307565b5b600061392c85828601613587565b925050602061393d8582860161379e565b9150509250929050565b600067ffffffffffffffff82111561396257613961613613565b5b61396b826134a8565b9050602081019050919050565b600061398b61398684613947565b613673565b9050828152602081018484840111156139a7576139a661360e565b5b6139b28482856136bf565b509392505050565b600082601f8301126139cf576139ce613609565b5b81356139df848260208601613978565b91505092915050565b60008060008060808587031215613a0257613a01613307565b5b6000613a1087828801613587565b9450506020613a2187828801613587565b9350506040613a3287828801613417565b925050606085013567ffffffffffffffff811115613a5357613a5261330c565b5b613a5f878288016139ba565b91505092959194509250565b6000819050919050565b613a7e81613a6b565b8114613a8957600080fd5b50565b600081359050613a9b81613a75565b92915050565b600060208284031215613ab757613ab6613307565b5b6000613ac584828501613a8c565b91505092915050565b60008083601f840112613ae457613ae3613609565b5b8235905067ffffffffffffffff811115613b0157613b00613833565b5b602083019150836020820283011115613b1d57613b1c613838565b5b9250929050565b600080600060408486031215613b3d57613b3c613307565b5b6000613b4b86828701613417565b935050602084013567ffffffffffffffff811115613b6c57613b6b61330c565b5b613b7886828701613ace565b92509250509250925092565b60008060408385031215613b9b57613b9a613307565b5b6000613ba985828601613587565b9250506020613bba85828601613587565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bfa602083613464565b9150613c0582613bc4565b602082019050919050565b60006020820190508181036000830152613c2981613bed565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c7757607f821691505b602082108103613c8a57613c89613c30565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613cec602c83613464565b9150613cf782613c90565b604082019050919050565b60006020820190508181036000830152613d1b81613cdf565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d7e602183613464565b9150613d8982613d22565b604082019050919050565b60006020820190508181036000830152613dad81613d71565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613e10603883613464565b9150613e1b82613db4565b604082019050919050565b60006020820190508181036000830152613e3f81613e03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e80826133cc565b9150613e8b836133cc565b925082821015613e9e57613e9d613e46565b5b828203905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613f05603183613464565b9150613f1082613ea9565b604082019050919050565b60006020820190508181036000830152613f3481613ef8565b9050919050565b6000613f46826133cc565b9150613f51836133cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8657613f85613e46565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613fc7601483613464565b9150613fd282613f91565b602082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b7f4d6178207761766520737570706c792065786365656465642100000000000000600082015250565b6000614033601983613464565b915061403e82613ffd565b602082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b600081905092915050565b50565b6000614084600083614069565b915061408f82614074565b600082019050919050565b60006140a582614077565b9150819050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061410b602983613464565b9150614116826140af565b604082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061419d602a83613464565b91506141a882614141565b604082019050919050565b600060208201905081810360008301526141cc81614190565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614209601483613464565b9150614214826141d3565b602082019050919050565b60006020820190508181036000830152614238816141fc565b9050919050565b7f596f752063616e2774206d696e742074686174206d616e790000000000000000600082015250565b6000614275601883613464565b91506142808261423f565b602082019050919050565b600060208201905081810360008301526142a481614268565b9050919050565b60006142b6826133cc565b91506142c1836133cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142fa576142f9613e46565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061433b601383613464565b915061434682614305565b602082019050919050565b6000602082019050818103600083015261436a8161432e565b9050919050565b7f4d696e74696e6720697320706175736564210000000000000000000000000000600082015250565b60006143a7601283613464565b91506143b282614371565b602082019050919050565b600060208201905081810360008301526143d68161439a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614439602f83613464565b9150614444826143dd565b604082019050919050565b600060208201905081810360008301526144688161442c565b9050919050565b600081905092915050565b600061448582613459565b61448f818561446f565b935061449f818560208601613475565b80840191505092915050565b60008190508160005260206000209050919050565b600081546144cd81613c5f565b6144d7818661446f565b945060018216600081146144f2576001811461450357614536565b60ff19831686528186019350614536565b61450c856144ab565b60005b8381101561452e5781548189015260018201915060208101905061450f565b838801955050505b50505092915050565b600061454b828661447a565b9150614557828561447a565b915061456382846144c0565b9150819050949350505050565b7f57686974656c697374206d696e74696e67206973207061757365642100000000600082015250565b60006145a6601c83613464565b91506145b182614570565b602082019050919050565b600060208201905081810360008301526145d581614599565b9050919050565b60008160601b9050919050565b60006145f4826145dc565b9050919050565b6000614606826145e9565b9050919050565b61461e61461982613534565b6145fb565b82525050565b6000614630828461460d565b60148201915081905092915050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000614675601483613464565b91506146808261463f565b602082019050919050565b600060208201905081810360008301526146a481614668565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614707602683613464565b9150614712826146ab565b604082019050919050565b60006020820190508181036000830152614736816146fa565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614799602c83613464565b91506147a48261473d565b604082019050919050565b600060208201905081810360008301526147c88161478c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061482b602583613464565b9150614836826147cf565b604082019050919050565b6000602082019050818103600083015261485a8161481e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148bd602483613464565b91506148c882614861565b604082019050919050565b600060208201905081810360008301526148ec816148b0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061491a826148f3565b61492481856148fe565b9350614934818560208601613475565b61493d816134a8565b840191505092915050565b600060408201905061495d60008301856133d6565b818103602083015261496f818461490f565b90509392505050565b6000614983826133cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149b5576149b4613e46565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006149f6601983613464565b9150614a01826149c0565b602082019050919050565b60006020820190508181036000830152614a25816149e9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a88603283613464565b9150614a9382614a2c565b604082019050919050565b60006020820190508181036000830152614ab781614a7b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614af8826133cc565b9150614b03836133cc565b925082614b1357614b12614abe565b5b828204905092915050565b6000614b29826133cc565b9150614b34836133cc565b925082614b4457614b43614abe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082019050614b936000830187613546565b614ba06020830186613546565b614bad60408301856133d6565b8181036060830152614bbf818461490f565b905095945050505050565b600081519050614bd98161333d565b92915050565b600060208284031215614bf557614bf4613307565b5b6000614c0384828501614bca565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c42602083613464565b9150614c4d82614c0c565b602082019050919050565b60006020820190508181036000830152614c7181614c35565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614cae601c83613464565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b905091905056fea26469706673582212205cba94d99859d8b8bb7d83e030e30163846a37e710e0afaf05eb4156ea19b48064736f6c634300080e0033000000000000000000000000198b8de1c81532c857616a4e31006b305aa2c5ec

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80636352211e11610144578063b071401b116100b6578063c82335c51161007a578063c82335c514610889578063c87b56dd146108b4578063d2cab056146108f1578063d5abeb011461090d578063e985e9c514610938578063f2fde38b146109755761025c565b8063b071401b146107ba578063b7203b8f146107e3578063b88d4fde1461080c578063bc745cc714610835578063bd32fb66146108605761025c565b80638da5cb5b116101085780638da5cb5b146106c95780638fe82356146106f457806394354fd01461071f57806395d89b411461074a578063a0712d6814610775578063a22cb465146107915761025c565b80636352211e146105e457806370a0823114610621578063715018a61461065e57806375280fcb146106755780637ec4a659146106a05761025c565b806316c38b3c116101dd57806342842e0e116101a157806342842e0e146104fc57806344a0d68a1461052557806349a2bea71461054e5780634ecd5c4b146105655780635503a0e81461058e57806362b99ad4146105b95761025c565b806316c38b3c1461043f57806323b872dd1461046857806335ccf2d2146104915780633c69f422146104bc5780633ccfd60b146104e55761025c565b8063095ea7b311610224578063095ea7b31461035a578063117741b91461038357806313faede6146103c057806315839b30146103eb57806316ba10e0146104165761025c565b806301ffc9a714610261578063047fc9aa1461029e57806305d5963d146102c957806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613369565b61099e565b60405161029591906133b1565b60405180910390f35b3480156102aa57600080fd5b506102b3610a80565b6040516102c091906133e5565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb919061342c565b610a86565b005b3480156102fe57600080fd5b50610307610b0c565b60405161031491906134f2565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f919061342c565b610b9e565b6040516103519190613555565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061359c565b610c23565b005b34801561038f57600080fd5b506103aa60048036038101906103a591906135dc565b610d3a565b6040516103b791906133e5565b60405180910390f35b3480156103cc57600080fd5b506103d5610dbb565b6040516103e291906133e5565b60405180910390f35b3480156103f757600080fd5b50610400610dc1565b60405161040d91906133b1565b60405180910390f35b34801561042257600080fd5b5061043d6004803603810190610438919061373e565b610dd4565b005b34801561044b57600080fd5b50610466600480360381019061046191906137b3565b610e6a565b005b34801561047457600080fd5b5061048f600480360381019061048a91906137e0565b610f03565b005b34801561049d57600080fd5b506104a6610f63565b6040516104b391906133e5565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613893565b610f69565b005b3480156104f157600080fd5b506104fa6110f0565b005b34801561050857600080fd5b50610523600480360381019061051e91906137e0565b611207565b005b34801561053157600080fd5b5061054c6004803603810190610547919061342c565b611227565b005b34801561055a57600080fd5b506105636112ad565b005b34801561057157600080fd5b5061058c6004803603810190610587919061342c565b61134d565b005b34801561059a57600080fd5b506105a36113d3565b6040516105b091906134f2565b60405180910390f35b3480156105c557600080fd5b506105ce611461565b6040516105db91906134f2565b60405180910390f35b3480156105f057600080fd5b5061060b6004803603810190610606919061342c565b6114ef565b6040516106189190613555565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906135dc565b6115a0565b60405161065591906133e5565b60405180910390f35b34801561066a57600080fd5b50610673611657565b005b34801561068157600080fd5b5061068a6116df565b60405161069791906133b1565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c2919061373e565b6116f2565b005b3480156106d557600080fd5b506106de611788565b6040516106eb9190613555565b60405180910390f35b34801561070057600080fd5b506107096117b2565b60405161071691906133e5565b60405180910390f35b34801561072b57600080fd5b506107346117b8565b60405161074191906133e5565b60405180910390f35b34801561075657600080fd5b5061075f6117be565b60405161076c91906134f2565b60405180910390f35b61078f600480360381019061078a919061342c565b611850565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613907565b611b2d565b005b3480156107c657600080fd5b506107e160048036038101906107dc919061342c565b611b43565b005b3480156107ef57600080fd5b5061080a600480360381019061080591906137b3565b611bc9565b005b34801561081857600080fd5b50610833600480360381019061082e91906139e8565b611c62565b005b34801561084157600080fd5b5061084a611cc4565b60405161085791906133e5565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613aa1565b611cca565b005b34801561089557600080fd5b5061089e611d50565b6040516108ab91906133e5565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d6919061342c565b611d56565b6040516108e891906134f2565b60405180910390f35b61090b60048036038101906109069190613b24565b611e00565b005b34801561091957600080fd5b50610922612192565b60405161092f91906133e5565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613b84565b612198565b60405161096c91906133b1565b60405180910390f35b34801561098157600080fd5b5061099c600480360381019061099791906135dc565b61222c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a795750610a7882612323565b5b9050919050565b60075481565b610a8e61238d565b73ffffffffffffffffffffffffffffffffffffffff16610aac611788565b73ffffffffffffffffffffffffffffffffffffffff1614610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990613c10565b60405180910390fd5b8060098190555050565b606060008054610b1b90613c5f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4790613c5f565b8015610b945780601f10610b6957610100808354040283529160200191610b94565b820191906000526020600020905b815481529060010190602001808311610b7757829003601f168201915b5050505050905090565b6000610ba982612395565b610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613d02565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2e826114ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590613d94565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cbd61238d565b73ffffffffffffffffffffffffffffffffffffffff161480610cec5750610ceb81610ce661238d565b612198565b5b610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613e26565b60405180910390fd5b610d358383612401565b505050565b600080600b54905060008103610d54576000915050610db6565b600c6000600a54815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481610db29190613e75565b9150505b919050565b600f5481565b601260009054906101000a900460ff1681565b610ddc61238d565b73ffffffffffffffffffffffffffffffffffffffff16610dfa611788565b73ffffffffffffffffffffffffffffffffffffffff1614610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613c10565b60405180910390fd5b80600e9080519060200190610e6692919061325a565b5050565b610e7261238d565b73ffffffffffffffffffffffffffffffffffffffff16610e90611788565b73ffffffffffffffffffffffffffffffffffffffff1614610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613c10565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b610f14610f0e61238d565b826124ba565b610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90613f1b565b60405180910390fd5b610f5e838383612598565b505050565b60085481565b8360105481600754610f7b9190613f3b565b1115610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613fdd565b60405180910390fd5b6000600954118015610fdd575060095481600854610fda9190613f3b565b11155b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390614049565b60405180910390fd5b61102461238d565b73ffffffffffffffffffffffffffffffffffffffff16611042611788565b73ffffffffffffffffffffffffffffffffffffffff1614611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90613c10565b60405180910390fd5b6110e98486600086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127fe565b5050505050565b6110f861238d565b73ffffffffffffffffffffffffffffffffffffffff16611116611788565b73ffffffffffffffffffffffffffffffffffffffff161461116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390613c10565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516111b49061409a565b60006040518083038185875af1925050503d80600081146111f1576040519150601f19603f3d011682016040523d82523d6000602084013e6111f6565b606091505b505090508061120457600080fd5b50565b61122283838360405180602001604052806000815250611c62565b505050565b61122f61238d565b73ffffffffffffffffffffffffffffffffffffffff1661124d611788565b73ffffffffffffffffffffffffffffffffffffffff16146112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90613c10565b60405180910390fd5b80600f8190555050565b6112b561238d565b73ffffffffffffffffffffffffffffffffffffffff166112d3611788565b73ffffffffffffffffffffffffffffffffffffffff1614611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090613c10565b60405180910390fd5b6001600a600082825461133c9190613f3b565b925050819055506000600881905550565b61135561238d565b73ffffffffffffffffffffffffffffffffffffffff16611373611788565b73ffffffffffffffffffffffffffffffffffffffff16146113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613c10565b60405180910390fd5b80600b8190555050565b600e80546113e090613c5f565b80601f016020809104026020016040519081016040528092919081815260200182805461140c90613c5f565b80156114595780601f1061142e57610100808354040283529160200191611459565b820191906000526020600020905b81548152906001019060200180831161143c57829003601f168201915b505050505081565b600d805461146e90613c5f565b80601f016020809104026020016040519081016040528092919081815260200182805461149a90613c5f565b80156114e75780601f106114bc576101008083540402835291602001916114e7565b820191906000526020600020905b8154815290600101906020018083116114ca57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90614121565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611607906141b3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61165f61238d565b73ffffffffffffffffffffffffffffffffffffffff1661167d611788565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613c10565b60405180910390fd5b6116dd6000612911565b565b601260019054906101000a900460ff1681565b6116fa61238d565b73ffffffffffffffffffffffffffffffffffffffff16611718611788565b73ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613c10565b60405180910390fd5b80600d908051906020019061178492919061325a565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b60115481565b6060600180546117cd90613c5f565b80601f01602080910402602001604051908101604052809291908181526020018280546117f990613c5f565b80156118465780601f1061181b57610100808354040283529160200191611846565b820191906000526020600020905b81548152906001019060200180831161182957829003601f168201915b5050505050905090565b80601054816007546118629190613f3b565b11156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90613fdd565b60405180910390fd5b60006009541180156118c45750600954816008546118c19190613f3b565b11155b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90614049565b60405180910390fd5b81600060115411156119615760008111801561192157506011548111155b611960576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119579061421f565b60405180910390fd5b5b826000600b541115611a1057600b54600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826119ce9190613f3b565b1115611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a069061428b565b60405180910390fd5b5b8380600f54611a1f91906142ab565b341015611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614351565b60405180910390fd5b601260009054906101000a900460ff1615611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa8906143bd565b60405180910390fd5b84600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b139190613f3b565b92505081905550611b26338660016129d7565b5050505050565b611b3f611b3861238d565b83836129f7565b5050565b611b4b61238d565b73ffffffffffffffffffffffffffffffffffffffff16611b69611788565b73ffffffffffffffffffffffffffffffffffffffff1614611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb690613c10565b60405180910390fd5b8060118190555050565b611bd161238d565b73ffffffffffffffffffffffffffffffffffffffff16611bef611788565b73ffffffffffffffffffffffffffffffffffffffff1614611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90613c10565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b611c73611c6d61238d565b836124ba565b611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613f1b565b60405180910390fd5b611cbe84848484612b63565b50505050565b600b5481565b611cd261238d565b73ffffffffffffffffffffffffffffffffffffffff16611cf0611788565b73ffffffffffffffffffffffffffffffffffffffff1614611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90613c10565b60405180910390fd5b8060138190555050565b600a5481565b6060611d6182612395565b611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d979061444f565b60405180910390fd5b6000611daa612bbf565b90506000815111611dca5760405180602001604052806000815250611df8565b80611dd484612c51565b600e604051602001611de89392919061453f565b6040516020818303038152906040525b915050919050565b8260105481600754611e129190613f3b565b1115611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613fdd565b60405180910390fd5b6000600954118015611e74575060095481600854611e719190613f3b565b11155b611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614049565b60405180910390fd5b8360006011541115611f1157600081118015611ed157506011548111155b611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f079061421f565b60405180910390fd5b5b846000600b541115611fc057600b54600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611f7e9190613f3b565b1115611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb69061428b565b60405180910390fd5b5b8580600f54611fcf91906142ab565b341015612011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200890614351565b60405180910390fd5b601260019054906101000a900460ff1615612061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612058906145bc565b60405180910390fd5b6120d5868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601354336040516020016120ba9190614624565b60405160208183030381529060405280519060200120612db1565b612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b9061468b565b60405180910390fd5b86600c6000600a54815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121769190613f3b565b92505081905550612189338860016129d7565b50505050505050565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61223461238d565b73ffffffffffffffffffffffffffffffffffffffff16612252611788565b73ffffffffffffffffffffffffffffffffffffffff16146122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90613c10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e9061471d565b60405180910390fd5b61232081612911565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612474836114ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124c582612395565b612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb906147af565b60405180910390fd5b600061250f836114ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061255157506125508185612198565b5b8061258f57508373ffffffffffffffffffffffffffffffffffffffff1661257784610b9e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125b8826114ef565b73ffffffffffffffffffffffffffffffffffffffff161461260e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260590614841565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361267d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612674906148d3565b60405180910390fd5b612688838383612dc8565b612693600082612401565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e39190613e75565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273a9190613f3b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127f9838383612dcd565b505050565b60005b8381101561290a5760016007600082825461281c9190613f3b565b925050819055506001600860008282546128369190613f3b565b9250508190555061284985600754612dd2565b82156128a4578473ffffffffffffffffffffffffffffffffffffffff167fd129cb3f6d79a399d6b34a401ba5ca705f56d9ea38f9885c8c9a4931976fa58160075460405161289791906133e5565b60405180910390a26128f7565b8473ffffffffffffffffffffffffffffffffffffffff167f28f72922bb3866e64334b43b18f6430877a94ada808fb43e26119371c0ea6599600754846040516128ee929190614948565b60405180910390a25b808061290290614978565b915050612801565b5050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129f2838383604051806020016040528060008152506127fe565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90614a0c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b5691906133b1565b60405180910390a3505050565b612b6e848484612598565b612b7a84848484612df0565b612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb090614a9e565b60405180910390fd5b50505050565b6060600d8054612bce90613c5f565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfa90613c5f565b8015612c475780601f10612c1c57610100808354040283529160200191612c47565b820191906000526020600020905b815481529060010190602001808311612c2a57829003601f168201915b5050505050905090565b606060008203612c98576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dac565b600082905060005b60008214612cca578080612cb390614978565b915050600a82612cc39190614aed565b9150612ca0565b60008167ffffffffffffffff811115612ce657612ce5613613565b5b6040519080825280601f01601f191660200182016040528015612d185781602001600182028036833780820191505090505b5090505b60008514612da557600182612d319190613e75565b9150600a85612d409190614b1e565b6030612d4c9190613f3b565b60f81b818381518110612d6257612d61614b4f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d9e9190614aed565b9450612d1c565b8093505050505b919050565b600082612dbe8584612f77565b1490509392505050565b505050565b505050565b612dec828260405180602001604052806000815250612fec565b5050565b6000612e118473ffffffffffffffffffffffffffffffffffffffff16613047565b15612f6a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e3a61238d565b8786866040518563ffffffff1660e01b8152600401612e5c9493929190614b7e565b6020604051808303816000875af1925050508015612e9857506040513d601f19601f82011682018060405250810190612e959190614bdf565b60015b612f1a573d8060008114612ec8576040519150601f19603f3d011682016040523d82523d6000602084013e612ecd565b606091505b506000815103612f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0990614a9e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f6f565b600190505b949350505050565b60008082905060005b8451811015612fe1576000858281518110612f9e57612f9d614b4f565b5b60200260200101519050808311612fc057612fb9838261306a565b9250612fcd565b612fca818461306a565b92505b508080612fd990614978565b915050612f80565b508091505092915050565b612ff68383613081565b6130036000848484612df0565b613042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303990614a9e565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e790614c58565b60405180910390fd5b6130f981612395565b15613139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313090614cc4565b60405180910390fd5b61314560008383612dc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131959190613f3b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325660008383612dcd565b5050565b82805461326690613c5f565b90600052602060002090601f01602090048101928261328857600085556132cf565b82601f106132a157805160ff19168380011785556132cf565b828001600101855582156132cf579182015b828111156132ce5782518255916020019190600101906132b3565b5b5090506132dc91906132e0565b5090565b5b808211156132f95760008160009055506001016132e1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61334681613311565b811461335157600080fd5b50565b6000813590506133638161333d565b92915050565b60006020828403121561337f5761337e613307565b5b600061338d84828501613354565b91505092915050565b60008115159050919050565b6133ab81613396565b82525050565b60006020820190506133c660008301846133a2565b92915050565b6000819050919050565b6133df816133cc565b82525050565b60006020820190506133fa60008301846133d6565b92915050565b613409816133cc565b811461341457600080fd5b50565b60008135905061342681613400565b92915050565b60006020828403121561344257613441613307565b5b600061345084828501613417565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613493578082015181840152602081019050613478565b838111156134a2576000848401525b50505050565b6000601f19601f8301169050919050565b60006134c482613459565b6134ce8185613464565b93506134de818560208601613475565b6134e7816134a8565b840191505092915050565b6000602082019050818103600083015261350c81846134b9565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061353f82613514565b9050919050565b61354f81613534565b82525050565b600060208201905061356a6000830184613546565b92915050565b61357981613534565b811461358457600080fd5b50565b60008135905061359681613570565b92915050565b600080604083850312156135b3576135b2613307565b5b60006135c185828601613587565b92505060206135d285828601613417565b9150509250929050565b6000602082840312156135f2576135f1613307565b5b600061360084828501613587565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61364b826134a8565b810181811067ffffffffffffffff8211171561366a57613669613613565b5b80604052505050565b600061367d6132fd565b90506136898282613642565b919050565b600067ffffffffffffffff8211156136a9576136a8613613565b5b6136b2826134a8565b9050602081019050919050565b82818337600083830152505050565b60006136e16136dc8461368e565b613673565b9050828152602081018484840111156136fd576136fc61360e565b5b6137088482856136bf565b509392505050565b600082601f83011261372557613724613609565b5b81356137358482602086016136ce565b91505092915050565b60006020828403121561375457613753613307565b5b600082013567ffffffffffffffff8111156137725761377161330c565b5b61377e84828501613710565b91505092915050565b61379081613396565b811461379b57600080fd5b50565b6000813590506137ad81613787565b92915050565b6000602082840312156137c9576137c8613307565b5b60006137d78482850161379e565b91505092915050565b6000806000606084860312156137f9576137f8613307565b5b600061380786828701613587565b935050602061381886828701613587565b925050604061382986828701613417565b9150509250925092565b600080fd5b600080fd5b60008083601f84011261385357613852613609565b5b8235905067ffffffffffffffff8111156138705761386f613833565b5b60208301915083600182028301111561388c5761388b613838565b5b9250929050565b600080600080606085870312156138ad576138ac613307565b5b60006138bb87828801613417565b94505060206138cc87828801613587565b935050604085013567ffffffffffffffff8111156138ed576138ec61330c565b5b6138f98782880161383d565b925092505092959194509250565b6000806040838503121561391e5761391d613307565b5b600061392c85828601613587565b925050602061393d8582860161379e565b9150509250929050565b600067ffffffffffffffff82111561396257613961613613565b5b61396b826134a8565b9050602081019050919050565b600061398b61398684613947565b613673565b9050828152602081018484840111156139a7576139a661360e565b5b6139b28482856136bf565b509392505050565b600082601f8301126139cf576139ce613609565b5b81356139df848260208601613978565b91505092915050565b60008060008060808587031215613a0257613a01613307565b5b6000613a1087828801613587565b9450506020613a2187828801613587565b9350506040613a3287828801613417565b925050606085013567ffffffffffffffff811115613a5357613a5261330c565b5b613a5f878288016139ba565b91505092959194509250565b6000819050919050565b613a7e81613a6b565b8114613a8957600080fd5b50565b600081359050613a9b81613a75565b92915050565b600060208284031215613ab757613ab6613307565b5b6000613ac584828501613a8c565b91505092915050565b60008083601f840112613ae457613ae3613609565b5b8235905067ffffffffffffffff811115613b0157613b00613833565b5b602083019150836020820283011115613b1d57613b1c613838565b5b9250929050565b600080600060408486031215613b3d57613b3c613307565b5b6000613b4b86828701613417565b935050602084013567ffffffffffffffff811115613b6c57613b6b61330c565b5b613b7886828701613ace565b92509250509250925092565b60008060408385031215613b9b57613b9a613307565b5b6000613ba985828601613587565b9250506020613bba85828601613587565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bfa602083613464565b9150613c0582613bc4565b602082019050919050565b60006020820190508181036000830152613c2981613bed565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c7757607f821691505b602082108103613c8a57613c89613c30565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613cec602c83613464565b9150613cf782613c90565b604082019050919050565b60006020820190508181036000830152613d1b81613cdf565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d7e602183613464565b9150613d8982613d22565b604082019050919050565b60006020820190508181036000830152613dad81613d71565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613e10603883613464565b9150613e1b82613db4565b604082019050919050565b60006020820190508181036000830152613e3f81613e03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e80826133cc565b9150613e8b836133cc565b925082821015613e9e57613e9d613e46565b5b828203905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613f05603183613464565b9150613f1082613ea9565b604082019050919050565b60006020820190508181036000830152613f3481613ef8565b9050919050565b6000613f46826133cc565b9150613f51836133cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f8657613f85613e46565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613fc7601483613464565b9150613fd282613f91565b602082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b7f4d6178207761766520737570706c792065786365656465642100000000000000600082015250565b6000614033601983613464565b915061403e82613ffd565b602082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b600081905092915050565b50565b6000614084600083614069565b915061408f82614074565b600082019050919050565b60006140a582614077565b9150819050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061410b602983613464565b9150614116826140af565b604082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061419d602a83613464565b91506141a882614141565b604082019050919050565b600060208201905081810360008301526141cc81614190565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614209601483613464565b9150614214826141d3565b602082019050919050565b60006020820190508181036000830152614238816141fc565b9050919050565b7f596f752063616e2774206d696e742074686174206d616e790000000000000000600082015250565b6000614275601883613464565b91506142808261423f565b602082019050919050565b600060208201905081810360008301526142a481614268565b9050919050565b60006142b6826133cc565b91506142c1836133cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142fa576142f9613e46565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b600061433b601383613464565b915061434682614305565b602082019050919050565b6000602082019050818103600083015261436a8161432e565b9050919050565b7f4d696e74696e6720697320706175736564210000000000000000000000000000600082015250565b60006143a7601283613464565b91506143b282614371565b602082019050919050565b600060208201905081810360008301526143d68161439a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614439602f83613464565b9150614444826143dd565b604082019050919050565b600060208201905081810360008301526144688161442c565b9050919050565b600081905092915050565b600061448582613459565b61448f818561446f565b935061449f818560208601613475565b80840191505092915050565b60008190508160005260206000209050919050565b600081546144cd81613c5f565b6144d7818661446f565b945060018216600081146144f2576001811461450357614536565b60ff19831686528186019350614536565b61450c856144ab565b60005b8381101561452e5781548189015260018201915060208101905061450f565b838801955050505b50505092915050565b600061454b828661447a565b9150614557828561447a565b915061456382846144c0565b9150819050949350505050565b7f57686974656c697374206d696e74696e67206973207061757365642100000000600082015250565b60006145a6601c83613464565b91506145b182614570565b602082019050919050565b600060208201905081810360008301526145d581614599565b9050919050565b60008160601b9050919050565b60006145f4826145dc565b9050919050565b6000614606826145e9565b9050919050565b61461e61461982613534565b6145fb565b82525050565b6000614630828461460d565b60148201915081905092915050565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b6000614675601483613464565b91506146808261463f565b602082019050919050565b600060208201905081810360008301526146a481614668565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614707602683613464565b9150614712826146ab565b604082019050919050565b60006020820190508181036000830152614736816146fa565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614799602c83613464565b91506147a48261473d565b604082019050919050565b600060208201905081810360008301526147c88161478c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061482b602583613464565b9150614836826147cf565b604082019050919050565b6000602082019050818103600083015261485a8161481e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148bd602483613464565b91506148c882614861565b604082019050919050565b600060208201905081810360008301526148ec816148b0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061491a826148f3565b61492481856148fe565b9350614934818560208601613475565b61493d816134a8565b840191505092915050565b600060408201905061495d60008301856133d6565b818103602083015261496f818461490f565b90509392505050565b6000614983826133cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149b5576149b4613e46565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006149f6601983613464565b9150614a01826149c0565b602082019050919050565b60006020820190508181036000830152614a25816149e9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a88603283613464565b9150614a9382614a2c565b604082019050919050565b60006020820190508181036000830152614ab781614a7b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614af8826133cc565b9150614b03836133cc565b925082614b1357614b12614abe565b5b828204905092915050565b6000614b29826133cc565b9150614b34836133cc565b925082614b4457614b43614abe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082019050614b936000830187613546565b614ba06020830186613546565b614bad60408301856133d6565b8181036060830152614bbf818461490f565b905095945050505050565b600081519050614bd98161333d565b92915050565b600060208284031215614bf557614bf4613307565b5b6000614c0384828501614bca565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c42602083613464565b9150614c4d82614c0c565b602082019050919050565b60006020820190508181036000830152614c7181614c35565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614cae601c83613464565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b905091905056fea26469706673582212205cba94d99859d8b8bb7d83e030e30163846a37e710e0afaf05eb4156ea19b48064736f6c634300080e0033

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

000000000000000000000000198b8de1c81532c857616a4e31006b305aa2c5ec

-----Decoded View---------------
Arg [0] : _beneficiary (address): 0x198b8De1c81532c857616a4e31006B305aA2c5eC

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000198b8de1c81532c857616a4e31006b305aa2c5ec


Deployed Bytecode Sourcemap

40195:6776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21774:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40274:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45075:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22719:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24279:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23802:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44270:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40883:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40992:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45515:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45621:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25029:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40366:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43656:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45817:466;;;;;;;;;;;;;:::i;:::-;;25439:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44679:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45191:90;;;;;;;;;;;;;:::i;:::-;;44895:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40846:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40813;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22413:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22143:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36608:103;;;;;;;;;;;;;:::i;:::-;;41028:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45409:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35957:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40461:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40948:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22888:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42731:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24572:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44759:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45710:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25695:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40649:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45287:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40534:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43852:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43096:552;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40911:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24798:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36866:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21774:305;21876:4;21928:25;21913:40;;;:11;:40;;;;:105;;;;21985:33;21970:48;;;:11;:48;;;;21913:105;:158;;;;22035:36;22059:11;22035:23;:36::i;:::-;21913:158;21893:178;;21774:305;;;:::o;40274:25::-;;;;:::o;45075:110::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45165:14:::1;45149:13;:30;;;;45075:110:::0;:::o;22719:100::-;22773:13;22806:5;22799:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22719:100;:::o;24279:221::-;24355:7;24383:16;24391:7;24383;:16::i;:::-;24375:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24468:15;:24;24484:7;24468:24;;;;;;;;;;;;;;;;;;;;;24461:31;;24279:221;;;:::o;23802:411::-;23883:13;23899:23;23914:7;23899:14;:23::i;:::-;23883:39;;23947:5;23941:11;;:2;:11;;;23933:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24041:5;24025:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24050:37;24067:5;24074:12;:10;:12::i;:::-;24050:16;:37::i;:::-;24025:62;24003:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24184:21;24193:2;24197:7;24184:8;:21::i;:::-;23872:341;23802:411;;:::o;44270:403::-;44336:7;44352:15;44370:29;;44352:47;;44581:1;44570:7;:12;44566:43;;44600:1;44593:8;;;;;44566:43;44634:10;:25;44645:13;;44634:25;;;;;;;;;;;:33;44660:6;44634:33;;;;;;;;;;;;;;;;44624:7;:43;;;;:::i;:::-;44617:50;;;44270:403;;;;:::o;40883:23::-;;;;:::o;40992:31::-;;;;;;;;;;;;;:::o;45515:100::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45599:10:::1;45587:9;:22;;;;;;;;;;;;:::i;:::-;;45515:100:::0;:::o;45621:83::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45692:6:::1;45677:12;;:21;;;;;;;;;;;;;;;;;;45621:83:::0;:::o;25029:339::-;25224:41;25243:12;:10;:12::i;:::-;25257:7;25224:18;:41::i;:::-;25216:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25332:28;25342:4;25348:2;25352:7;25332:9;:28::i;:::-;25029:339;;;:::o;40366:29::-;;;;:::o;43656:190::-;43764:11;41727:9;;41712:11;41703:6;;:20;;;;:::i;:::-;:33;;41695:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41888:1;41872:13;;:17;:62;;;;;41921:13;;41906:11;41893:10;;:24;;;;:::i;:::-;:41;;41872:62;41864:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36188:12:::1;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43794:46:::2;43804:9;43815:11;43828:5;43835:4;;43794:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:46::i;:::-;43656:190:::0;;;;;:::o;45817:466::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46101:7:::1;46122:11;;;;;;;;;;;46114:25;;46147:21;46114:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46100:73;;;46188:2;46180:11;;;::::0;::::1;;45854:429;45817:466::o:0;25439:185::-;25577:39;25594:4;25600:2;25604:7;25577:39;;;;;;;;;;;;:16;:39::i;:::-;25439:185;;;:::o;44679:74::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44742:5:::1;44735:4;:12;;;;44679:74:::0;:::o;45191:90::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45253:1:::1;45236:13;;:18;;;;;;;:::i;:::-;;;;;;;;45274:1;45261:10;:14;;;;45191:90::o:0;44895:174::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45033:30:::1;45001:29;:62;;;;44895:174:::0;:::o;40846:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40813:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22413:239::-;22485:7;22505:13;22521:7;:16;22529:7;22521:16;;;;;;;;;;;;;;;;;;;;;22505:32;;22573:1;22556:19;;:5;:19;;;22548:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22639:5;22632:12;;;22413:239;;;:::o;22143:208::-;22215:7;22260:1;22243:19;;:5;:19;;;22235:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22327:9;:16;22337:5;22327:16;;;;;;;;;;;;;;;;22320:23;;22143:208;;;:::o;36608:103::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36673:30:::1;36700:1;36673:18;:30::i;:::-;36608:103::o:0;41028:40::-;;;;;;;;;;;;;:::o;45409:100::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45493:10:::1;45481:9;:22;;;;;;;;;;;;:::i;:::-;;45409:100:::0;:::o;35957:87::-;36003:7;36030:6;;;;;;;;;;;36023:13;;35957:87;:::o;40461:35::-;;;;:::o;40948:37::-;;;;:::o;22888:104::-;22944:13;22977:7;22970:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22888:104;:::o;42731:359::-;42805:11;41727:9;;41712:11;41703:6;;:20;;;;:::i;:::-;:33;;41695:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41888:1;41872:13;;:17;:62;;;;;41921:13;;41906:11;41893:10;;:24;;;;:::i;:::-;:41;;41872:62;41864:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;42842:11:::1;42067:1;42046:18;;:22;42042:207;;;42178:1;42164:11;:15;:52;;;;;42198:18;;42183:11;:33;;42164:52;42156:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42042:207;42883:11:::2;42366:1;42334:29;;:33;42330:249;;;42513:29;;42472:10;:25;42483:13;;42472:25;;;;;;;;;;;:37;42498:10;42472:37;;;;;;;;;;;;;;;;42458:11;:51;;;;:::i;:::-;:84;;42450:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;42330:249;42912:11:::3;42676;42669:4;;:18;;;;:::i;:::-;42656:9;:31;;42648:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42941:12:::4;;;;;;;;;;;42940:13;42932:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;43026:11;42985:10;:25;42996:13;;42985:25;;;;;;;;;;;:37;43011:10;42985:37;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;43044:40;43054:10;43066:11;43079:4;43044:9;:40::i;:::-;42585:1:::3;42255::::2;41971::::1;42731:359:::0;;:::o;24572:155::-;24667:52;24686:12;:10;:12::i;:::-;24700:8;24710;24667:18;:52::i;:::-;24572:155;;:::o;44759:130::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44864:19:::1;44843:18;:40;;;;44759:130:::0;:::o;45710:101::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45799:6:::1;45775:21;;:30;;;;;;;;;;;;;;;;;;45710:101:::0;:::o;25695:328::-;25870:41;25889:12;:10;:12::i;:::-;25903:7;25870:18;:41::i;:::-;25862:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25976:39;25990:4;25996:2;26000:7;26009:5;25976:13;:39::i;:::-;25695:328;;;;:::o;40649:48::-;;;;:::o;45287:116::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45386:11:::1;45364:19;:33;;;;45287:116:::0;:::o;40534:32::-;;;;:::o;43852:412::-;43941:13;43982:17;43990:8;43982:7;:17::i;:::-;43966:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;44073:28;44104:10;:8;:10::i;:::-;44073:41;;44159:1;44134:14;44128:28;:32;:130;;;;;;;;;;;;;;;;;44196:14;44212:19;:8;:17;:19::i;:::-;44233:9;44179:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44128:130;44121:137;;;43852:412;;;:::o;43096:552::-;43211:11;41727:9;;41712:11;41703:6;;:20;;;;:::i;:::-;:33;;41695:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41888:1;41872:13;;:17;:62;;;;;41921:13;;41906:11;41893:10;;:24;;;;:::i;:::-;:41;;41872:62;41864:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;43248:11:::1;42067:1;42046:18;;:22;42042:207;;;42178:1;42164:11;:15;:52;;;;;42198:18;;42183:11;:33;;42164:52;42156:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42042:207;43289:11:::2;42366:1;42334:29;;:33;42330:249;;;42513:29;;42472:10;:25;42483:13;;42472:25;;;;;;;;;;;:37;42498:10;42472:37;;;;;;;;;;;;;;;;42458:11;:51;;;;:::i;:::-;:84;;42450:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;42330:249;43318:11:::3;42676;42669:4;;:18;;;;:::i;:::-;42656:9;:31;;42648:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43347:21:::4;;;;;;;;;;;43346:22;43338:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43416:93;43435:11;;43416:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43448:19;;43496:10;43479:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;43469:39;;;;;;43416:18;:93::i;:::-;43408:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;43584:11;43543:10;:25;43554:13;;43543:25;;;;;;;;;;;:37;43569:10;43543:37;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;43602:40;43612:10;43624:11;43637:4;43602:9;:40::i;:::-;42585:1:::3;42255::::2;41971::::1;43096:552:::0;;;;:::o;40911:32::-;;;;:::o;24798:164::-;24895:4;24919:18;:25;24938:5;24919:25;;;;;;;;;;;;;;;:35;24945:8;24919:35;;;;;;;;;;;;;;;;;;;;;;;;;24912:42;;24798:164;;;;:::o;36866:201::-;36188:12;:10;:12::i;:::-;36177:23;;:7;:5;:7::i;:::-;:23;;;36169:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36975:1:::1;36955:22;;:8;:22;;::::0;36947:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37031:28;37050:8;37031:18;:28::i;:::-;36866:201:::0;:::o;20197:157::-;20282:4;20321:25;20306:40;;;:11;:40;;;;20299:47;;20197:157;;;:::o;16980:98::-;17033:7;17060:10;17053:17;;16980:98;:::o;27533:127::-;27598:4;27650:1;27622:30;;:7;:16;27630:7;27622:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27615:37;;27533:127;;;:::o;31679:174::-;31781:2;31754:15;:24;31770:7;31754:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31837:7;31833:2;31799:46;;31808:23;31823:7;31808:14;:23::i;:::-;31799:46;;;;;;;;;;;;31679:174;;:::o;27827:348::-;27920:4;27945:16;27953:7;27945;:16::i;:::-;27937:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:13;28037:23;28052:7;28037:14;:23::i;:::-;28021:39;;28090:5;28079:16;;:7;:16;;;:52;;;;28099:32;28116:5;28123:7;28099:16;:32::i;:::-;28079:52;:87;;;;28159:7;28135:31;;:20;28147:7;28135:11;:20::i;:::-;:31;;;28079:87;28071:96;;;27827:348;;;;:::o;30936:625::-;31095:4;31068:31;;:23;31083:7;31068:14;:23::i;:::-;:31;;;31060:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31174:1;31160:16;;:2;:16;;;31152:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31230:39;31251:4;31257:2;31261:7;31230:20;:39::i;:::-;31334:29;31351:1;31355:7;31334:8;:29::i;:::-;31395:1;31376:9;:15;31386:4;31376:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31424:1;31407:9;:13;31417:2;31407:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31455:2;31436:7;:16;31444:7;31436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31494:7;31490:2;31475:27;;31484:4;31475:27;;;;;;;;;;;;31515:38;31535:4;31541:2;31545:7;31515:19;:38::i;:::-;30936:625;;;:::o;46289:408::-;46409:9;46404:288;46428:11;46424:1;:15;46404:288;;;46465:1;46455:6;;:11;;;;;;;:::i;:::-;;;;;;;;46489:1;46475:10;;:15;;;;;;;:::i;:::-;;;;;;;;46499:28;46509:9;46520:6;;46499:9;:28::i;:::-;46540:14;46536:149;;;46589:9;46572:35;;;46600:6;;46572:35;;;;;;:::i;:::-;;;;;;;;46536:149;;;46651:9;46639:36;;;46662:6;;46670:4;46639:36;;;;;;;:::i;:::-;;;;;;;;46536:149;46441:3;;;;;:::i;:::-;;;;46404:288;;;;46289:408;;;;:::o;37227:191::-;37301:16;37320:6;;;;;;;;;;;37301:25;;37346:8;37337:6;;:17;;;;;;;;;;;;;;;;;;37401:8;37370:40;;37391:8;37370:40;;;;;;;;;;;;37290:128;37227:191;:::o;46703:155::-;46799:53;46809:9;46820:11;46833:14;46799:53;;;;;;;;;;;;:9;:53::i;:::-;46703:155;;;:::o;31995:315::-;32150:8;32141:17;;:5;:17;;;32133:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32237:8;32199:18;:25;32218:5;32199:25;;;;;;;;;;;;;;;:35;32225:8;32199:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32283:8;32261:41;;32276:5;32261:41;;;32293:8;32261:41;;;;;;:::i;:::-;;;;;;;;31995:315;;;:::o;26905:::-;27062:28;27072:4;27078:2;27082:7;27062:9;:28::i;:::-;27109:48;27132:4;27138:2;27142:7;27151:5;27109:22;:48::i;:::-;27101:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26905:315;;;;:::o;46864:104::-;46924:13;46953:9;46946:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46864:104;:::o;17567:723::-;17623:13;17853:1;17844:5;:10;17840:53;;17871:10;;;;;;;;;;;;;;;;;;;;;17840:53;17903:12;17918:5;17903:20;;17934:14;17959:78;17974:1;17966:4;:9;17959:78;;17992:8;;;;;:::i;:::-;;;;18023:2;18015:10;;;;;:::i;:::-;;;17959:78;;;18047:19;18079:6;18069:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18047:39;;18097:154;18113:1;18104:5;:10;18097:154;;18141:1;18131:11;;;;;:::i;:::-;;;18208:2;18200:5;:10;;;;:::i;:::-;18187:2;:24;;;;:::i;:::-;18174:39;;18157:6;18164;18157:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18237:2;18228:11;;;;;:::i;:::-;;;18097:154;;;18275:6;18261:21;;;;;17567:723;;;;:::o;38653:190::-;38778:4;38831;38802:25;38815:5;38822:4;38802:12;:25::i;:::-;:33;38795:40;;38653:190;;;;;:::o;34246:126::-;;;;:::o;34757:125::-;;;;:::o;28517:110::-;28593:26;28603:2;28607:7;28593:26;;;;;;;;;;;;:9;:26::i;:::-;28517:110;;:::o;32875:799::-;33030:4;33051:15;:2;:13;;;:15::i;:::-;33047:620;;;33103:2;33087:36;;;33124:12;:10;:12::i;:::-;33138:4;33144:7;33153:5;33087:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33083:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33346:1;33329:6;:13;:18;33325:272;;33372:60;;;;;;;;;;:::i;:::-;;;;;;;;33325:272;33547:6;33541:13;33532:6;33528:2;33524:15;33517:38;33083:529;33220:41;;;33210:51;;;:6;:51;;;;33203:58;;;;;33047:620;33651:4;33644:11;;32875:799;;;;;;;:::o;39204:675::-;39287:7;39307:20;39330:4;39307:27;;39350:9;39345:497;39369:5;:12;39365:1;:16;39345:497;;;39403:20;39426:5;39432:1;39426:8;;;;;;;;:::i;:::-;;;;;;;;39403:31;;39469:12;39453;:28;39449:382;;39596:42;39611:12;39625;39596:14;:42::i;:::-;39581:57;;39449:382;;;39773:42;39788:12;39802;39773:14;:42::i;:::-;39758:57;;39449:382;39388:454;39383:3;;;;;:::i;:::-;;;;39345:497;;;;39859:12;39852:19;;;39204:675;;;;:::o;28854:321::-;28984:18;28990:2;28994:7;28984:5;:18::i;:::-;29035:54;29066:1;29070:2;29074:7;29083:5;29035:22;:54::i;:::-;29013:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28854:321;;;:::o;9023:326::-;9083:4;9340:1;9318:7;:19;;;:23;9311:30;;9023:326;;;:::o;39887:224::-;39955:13;40018:1;40012:4;40005:15;40047:1;40041:4;40034:15;40088:4;40082;40072:21;40063:30;;39887:224;;;;:::o;29511:439::-;29605:1;29591:16;;:2;:16;;;29583:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29664:16;29672:7;29664;:16::i;:::-;29663:17;29655:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29726:45;29755:1;29759:2;29763:7;29726:20;:45::i;:::-;29801:1;29784:9;:13;29794:2;29784:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29832:2;29813:7;:16;29821:7;29813:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29877:7;29873:2;29852:33;;29869:1;29852:33;;;;;;;;;;;;29898:44;29926:1;29930:2;29934:7;29898:19;:44::i;:::-;29511:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:122::-;2026:24;2044:5;2026:24;:::i;:::-;2019:5;2016:35;2006:63;;2065:1;2062;2055:12;2006:63;1953:122;:::o;2081:139::-;2127:5;2165:6;2152:20;2143:29;;2181:33;2208:5;2181:33;:::i;:::-;2081:139;;;;:::o;2226:329::-;2285:6;2334:2;2322:9;2313:7;2309:23;2305:32;2302:119;;;2340:79;;:::i;:::-;2302:119;2460:1;2485:53;2530:7;2521:6;2510:9;2506:22;2485:53;:::i;:::-;2475:63;;2431:117;2226:329;;;;:::o;2561:99::-;2613:6;2647:5;2641:12;2631:22;;2561:99;;;:::o;2666:169::-;2750:11;2784:6;2779:3;2772:19;2824:4;2819:3;2815:14;2800:29;;2666:169;;;;:::o;2841:307::-;2909:1;2919:113;2933:6;2930:1;2927:13;2919:113;;;3018:1;3013:3;3009:11;3003:18;2999:1;2994:3;2990:11;2983:39;2955:2;2952:1;2948:10;2943:15;;2919:113;;;3050:6;3047:1;3044:13;3041:101;;;3130:1;3121:6;3116:3;3112:16;3105:27;3041:101;2890:258;2841:307;;;:::o;3154:102::-;3195:6;3246:2;3242:7;3237:2;3230:5;3226:14;3222:28;3212:38;;3154:102;;;:::o;3262:364::-;3350:3;3378:39;3411:5;3378:39;:::i;:::-;3433:71;3497:6;3492:3;3433:71;:::i;:::-;3426:78;;3513:52;3558:6;3553:3;3546:4;3539:5;3535:16;3513:52;:::i;:::-;3590:29;3612:6;3590:29;:::i;:::-;3585:3;3581:39;3574:46;;3354:272;3262:364;;;;:::o;3632:313::-;3745:4;3783:2;3772:9;3768:18;3760:26;;3832:9;3826:4;3822:20;3818:1;3807:9;3803:17;3796:47;3860:78;3933:4;3924:6;3860:78;:::i;:::-;3852:86;;3632:313;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:117::-;5734:1;5731;5724:12;5748:117;5857:1;5854;5847:12;5871:180;5919:77;5916:1;5909:88;6016:4;6013:1;6006:15;6040:4;6037:1;6030:15;6057:281;6140:27;6162:4;6140:27;:::i;:::-;6132:6;6128:40;6270:6;6258:10;6255:22;6234:18;6222:10;6219:34;6216:62;6213:88;;;6281:18;;:::i;:::-;6213:88;6321:10;6317:2;6310:22;6100:238;6057:281;;:::o;6344:129::-;6378:6;6405:20;;:::i;:::-;6395:30;;6434:33;6462:4;6454:6;6434:33;:::i;:::-;6344:129;;;:::o;6479:308::-;6541:4;6631:18;6623:6;6620:30;6617:56;;;6653:18;;:::i;:::-;6617:56;6691:29;6713:6;6691:29;:::i;:::-;6683:37;;6775:4;6769;6765:15;6757:23;;6479:308;;;:::o;6793:154::-;6877:6;6872:3;6867;6854:30;6939:1;6930:6;6925:3;6921:16;6914:27;6793:154;;;:::o;6953:412::-;7031:5;7056:66;7072:49;7114:6;7072:49;:::i;:::-;7056:66;:::i;:::-;7047:75;;7145:6;7138:5;7131:21;7183:4;7176:5;7172:16;7221:3;7212:6;7207:3;7203:16;7200:25;7197:112;;;7228:79;;:::i;:::-;7197:112;7318:41;7352:6;7347:3;7342;7318:41;:::i;:::-;7037:328;6953:412;;;;;:::o;7385:340::-;7441:5;7490:3;7483:4;7475:6;7471:17;7467:27;7457:122;;7498:79;;:::i;:::-;7457:122;7615:6;7602:20;7640:79;7715:3;7707:6;7700:4;7692:6;7688:17;7640:79;:::i;:::-;7631:88;;7447:278;7385:340;;;;:::o;7731:509::-;7800:6;7849:2;7837:9;7828:7;7824:23;7820:32;7817:119;;;7855:79;;:::i;:::-;7817:119;8003:1;7992:9;7988:17;7975:31;8033:18;8025:6;8022:30;8019:117;;;8055:79;;:::i;:::-;8019:117;8160:63;8215:7;8206:6;8195:9;8191:22;8160:63;:::i;:::-;8150:73;;7946:287;7731:509;;;;:::o;8246:116::-;8316:21;8331:5;8316:21;:::i;:::-;8309:5;8306:32;8296:60;;8352:1;8349;8342:12;8296:60;8246:116;:::o;8368:133::-;8411:5;8449:6;8436:20;8427:29;;8465:30;8489:5;8465:30;:::i;:::-;8368:133;;;;:::o;8507:323::-;8563:6;8612:2;8600:9;8591:7;8587:23;8583:32;8580:119;;;8618:79;;:::i;:::-;8580:119;8738:1;8763:50;8805:7;8796:6;8785:9;8781:22;8763:50;:::i;:::-;8753:60;;8709:114;8507:323;;;;:::o;8836:619::-;8913:6;8921;8929;8978:2;8966:9;8957:7;8953:23;8949:32;8946:119;;;8984:79;;:::i;:::-;8946:119;9104:1;9129:53;9174:7;9165:6;9154:9;9150:22;9129:53;:::i;:::-;9119:63;;9075:117;9231:2;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9202:118;9359:2;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9330:118;8836:619;;;;;:::o;9461:117::-;9570:1;9567;9560:12;9584:117;9693:1;9690;9683:12;9720:552;9777:8;9787:6;9837:3;9830:4;9822:6;9818:17;9814:27;9804:122;;9845:79;;:::i;:::-;9804:122;9958:6;9945:20;9935:30;;9988:18;9980:6;9977:30;9974:117;;;10010:79;;:::i;:::-;9974:117;10124:4;10116:6;10112:17;10100:29;;10178:3;10170:4;10162:6;10158:17;10148:8;10144:32;10141:41;10138:128;;;10185:79;;:::i;:::-;10138:128;9720:552;;;;;:::o;10278:817::-;10366:6;10374;10382;10390;10439:2;10427:9;10418:7;10414:23;10410:32;10407:119;;;10445:79;;:::i;:::-;10407:119;10565:1;10590:53;10635:7;10626:6;10615:9;10611:22;10590:53;:::i;:::-;10580:63;;10536:117;10692:2;10718:53;10763:7;10754:6;10743:9;10739:22;10718:53;:::i;:::-;10708:63;;10663:118;10848:2;10837:9;10833:18;10820:32;10879:18;10871:6;10868:30;10865:117;;;10901:79;;:::i;:::-;10865:117;11014:64;11070:7;11061:6;11050:9;11046:22;11014:64;:::i;:::-;10996:82;;;;10791:297;10278:817;;;;;;;:::o;11101:468::-;11166:6;11174;11223:2;11211:9;11202:7;11198:23;11194:32;11191:119;;;11229:79;;:::i;:::-;11191:119;11349:1;11374:53;11419:7;11410:6;11399:9;11395:22;11374:53;:::i;:::-;11364:63;;11320:117;11476:2;11502:50;11544:7;11535:6;11524:9;11520:22;11502:50;:::i;:::-;11492:60;;11447:115;11101:468;;;;;:::o;11575:307::-;11636:4;11726:18;11718:6;11715:30;11712:56;;;11748:18;;:::i;:::-;11712:56;11786:29;11808:6;11786:29;:::i;:::-;11778:37;;11870:4;11864;11860:15;11852:23;;11575:307;;;:::o;11888:410::-;11965:5;11990:65;12006:48;12047:6;12006:48;:::i;:::-;11990:65;:::i;:::-;11981:74;;12078:6;12071:5;12064:21;12116:4;12109:5;12105:16;12154:3;12145:6;12140:3;12136:16;12133:25;12130:112;;;12161:79;;:::i;:::-;12130:112;12251:41;12285:6;12280:3;12275;12251:41;:::i;:::-;11971:327;11888:410;;;;;:::o;12317:338::-;12372:5;12421:3;12414:4;12406:6;12402:17;12398:27;12388:122;;12429:79;;:::i;:::-;12388:122;12546:6;12533:20;12571:78;12645:3;12637:6;12630:4;12622:6;12618:17;12571:78;:::i;:::-;12562:87;;12378:277;12317:338;;;;:::o;12661:943::-;12756:6;12764;12772;12780;12829:3;12817:9;12808:7;12804:23;12800:33;12797:120;;;12836:79;;:::i;:::-;12797:120;12956:1;12981:53;13026:7;13017:6;13006:9;13002:22;12981:53;:::i;:::-;12971:63;;12927:117;13083:2;13109:53;13154:7;13145:6;13134:9;13130:22;13109:53;:::i;:::-;13099:63;;13054:118;13211:2;13237:53;13282:7;13273:6;13262:9;13258:22;13237:53;:::i;:::-;13227:63;;13182:118;13367:2;13356:9;13352:18;13339:32;13398:18;13390:6;13387:30;13384:117;;;13420:79;;:::i;:::-;13384:117;13525:62;13579:7;13570:6;13559:9;13555:22;13525:62;:::i;:::-;13515:72;;13310:287;12661:943;;;;;;;:::o;13610:77::-;13647:7;13676:5;13665:16;;13610:77;;;:::o;13693:122::-;13766:24;13784:5;13766:24;:::i;:::-;13759:5;13756:35;13746:63;;13805:1;13802;13795:12;13746:63;13693:122;:::o;13821:139::-;13867:5;13905:6;13892:20;13883:29;;13921:33;13948:5;13921:33;:::i;:::-;13821:139;;;;:::o;13966:329::-;14025:6;14074:2;14062:9;14053:7;14049:23;14045:32;14042:119;;;14080:79;;:::i;:::-;14042:119;14200:1;14225:53;14270:7;14261:6;14250:9;14246:22;14225:53;:::i;:::-;14215:63;;14171:117;13966:329;;;;:::o;14318:568::-;14391:8;14401:6;14451:3;14444:4;14436:6;14432:17;14428:27;14418:122;;14459:79;;:::i;:::-;14418:122;14572:6;14559:20;14549:30;;14602:18;14594:6;14591:30;14588:117;;;14624:79;;:::i;:::-;14588:117;14738:4;14730:6;14726:17;14714:29;;14792:3;14784:4;14776:6;14772:17;14762:8;14758:32;14755:41;14752:128;;;14799:79;;:::i;:::-;14752:128;14318:568;;;;;:::o;14892:704::-;14987:6;14995;15003;15052:2;15040:9;15031:7;15027:23;15023:32;15020:119;;;15058:79;;:::i;:::-;15020:119;15178:1;15203:53;15248:7;15239:6;15228:9;15224:22;15203:53;:::i;:::-;15193:63;;15149:117;15333:2;15322:9;15318:18;15305:32;15364:18;15356:6;15353:30;15350:117;;;15386:79;;:::i;:::-;15350:117;15499:80;15571:7;15562:6;15551:9;15547:22;15499:80;:::i;:::-;15481:98;;;;15276:313;14892:704;;;;;:::o;15602:474::-;15670:6;15678;15727:2;15715:9;15706:7;15702:23;15698:32;15695:119;;;15733:79;;:::i;:::-;15695:119;15853:1;15878:53;15923:7;15914:6;15903:9;15899:22;15878:53;:::i;:::-;15868:63;;15824:117;15980:2;16006:53;16051:7;16042:6;16031:9;16027:22;16006:53;:::i;:::-;15996:63;;15951:118;15602:474;;;;;:::o;16082:182::-;16222:34;16218:1;16210:6;16206:14;16199:58;16082:182;:::o;16270:366::-;16412:3;16433:67;16497:2;16492:3;16433:67;:::i;:::-;16426:74;;16509:93;16598:3;16509:93;:::i;:::-;16627:2;16622:3;16618:12;16611:19;;16270:366;;;:::o;16642:419::-;16808:4;16846:2;16835:9;16831:18;16823:26;;16895:9;16889:4;16885:20;16881:1;16870:9;16866:17;16859:47;16923:131;17049:4;16923:131;:::i;:::-;16915:139;;16642:419;;;:::o;17067:180::-;17115:77;17112:1;17105:88;17212:4;17209:1;17202:15;17236:4;17233:1;17226:15;17253:320;17297:6;17334:1;17328:4;17324:12;17314:22;;17381:1;17375:4;17371:12;17402:18;17392:81;;17458:4;17450:6;17446:17;17436:27;;17392:81;17520:2;17512:6;17509:14;17489:18;17486:38;17483:84;;17539:18;;:::i;:::-;17483:84;17304:269;17253:320;;;:::o;17579:231::-;17719:34;17715:1;17707:6;17703:14;17696:58;17788:14;17783:2;17775:6;17771:15;17764:39;17579:231;:::o;17816:366::-;17958:3;17979:67;18043:2;18038:3;17979:67;:::i;:::-;17972:74;;18055:93;18144:3;18055:93;:::i;:::-;18173:2;18168:3;18164:12;18157:19;;17816:366;;;:::o;18188:419::-;18354:4;18392:2;18381:9;18377:18;18369:26;;18441:9;18435:4;18431:20;18427:1;18416:9;18412:17;18405:47;18469:131;18595:4;18469:131;:::i;:::-;18461:139;;18188:419;;;:::o;18613:220::-;18753:34;18749:1;18741:6;18737:14;18730:58;18822:3;18817:2;18809:6;18805:15;18798:28;18613:220;:::o;18839:366::-;18981:3;19002:67;19066:2;19061:3;19002:67;:::i;:::-;18995:74;;19078:93;19167:3;19078:93;:::i;:::-;19196:2;19191:3;19187:12;19180:19;;18839:366;;;:::o;19211:419::-;19377:4;19415:2;19404:9;19400:18;19392:26;;19464:9;19458:4;19454:20;19450:1;19439:9;19435:17;19428:47;19492:131;19618:4;19492:131;:::i;:::-;19484:139;;19211:419;;;:::o;19636:243::-;19776:34;19772:1;19764:6;19760:14;19753:58;19845:26;19840:2;19832:6;19828:15;19821:51;19636:243;:::o;19885:366::-;20027:3;20048:67;20112:2;20107:3;20048:67;:::i;:::-;20041:74;;20124:93;20213:3;20124:93;:::i;:::-;20242:2;20237:3;20233:12;20226:19;;19885:366;;;:::o;20257:419::-;20423:4;20461:2;20450:9;20446:18;20438:26;;20510:9;20504:4;20500:20;20496:1;20485:9;20481:17;20474:47;20538:131;20664:4;20538:131;:::i;:::-;20530:139;;20257:419;;;:::o;20682:180::-;20730:77;20727:1;20720:88;20827:4;20824:1;20817:15;20851:4;20848:1;20841:15;20868:191;20908:4;20928:20;20946:1;20928:20;:::i;:::-;20923:25;;20962:20;20980:1;20962:20;:::i;:::-;20957:25;;21001:1;20998;20995:8;20992:34;;;21006:18;;:::i;:::-;20992:34;21051:1;21048;21044:9;21036:17;;20868:191;;;;:::o;21065:236::-;21205:34;21201:1;21193:6;21189:14;21182:58;21274:19;21269:2;21261:6;21257:15;21250:44;21065:236;:::o;21307:366::-;21449:3;21470:67;21534:2;21529:3;21470:67;:::i;:::-;21463:74;;21546:93;21635:3;21546:93;:::i;:::-;21664:2;21659:3;21655:12;21648:19;;21307:366;;;:::o;21679:419::-;21845:4;21883:2;21872:9;21868:18;21860:26;;21932:9;21926:4;21922:20;21918:1;21907:9;21903:17;21896:47;21960:131;22086:4;21960:131;:::i;:::-;21952:139;;21679:419;;;:::o;22104:305::-;22144:3;22163:20;22181:1;22163:20;:::i;:::-;22158:25;;22197:20;22215:1;22197:20;:::i;:::-;22192:25;;22351:1;22283:66;22279:74;22276:1;22273:81;22270:107;;;22357:18;;:::i;:::-;22270:107;22401:1;22398;22394:9;22387:16;;22104:305;;;;:::o;22415:170::-;22555:22;22551:1;22543:6;22539:14;22532:46;22415:170;:::o;22591:366::-;22733:3;22754:67;22818:2;22813:3;22754:67;:::i;:::-;22747:74;;22830:93;22919:3;22830:93;:::i;:::-;22948:2;22943:3;22939:12;22932:19;;22591:366;;;:::o;22963:419::-;23129:4;23167:2;23156:9;23152:18;23144:26;;23216:9;23210:4;23206:20;23202:1;23191:9;23187:17;23180:47;23244:131;23370:4;23244:131;:::i;:::-;23236:139;;22963:419;;;:::o;23388:175::-;23528:27;23524:1;23516:6;23512:14;23505:51;23388:175;:::o;23569:366::-;23711:3;23732:67;23796:2;23791:3;23732:67;:::i;:::-;23725:74;;23808:93;23897:3;23808:93;:::i;:::-;23926:2;23921:3;23917:12;23910:19;;23569:366;;;:::o;23941:419::-;24107:4;24145:2;24134:9;24130:18;24122:26;;24194:9;24188:4;24184:20;24180:1;24169:9;24165:17;24158:47;24222:131;24348:4;24222:131;:::i;:::-;24214:139;;23941:419;;;:::o;24366:147::-;24467:11;24504:3;24489:18;;24366:147;;;;:::o;24519:114::-;;:::o;24639:398::-;24798:3;24819:83;24900:1;24895:3;24819:83;:::i;:::-;24812:90;;24911:93;25000:3;24911:93;:::i;:::-;25029:1;25024:3;25020:11;25013:18;;24639:398;;;:::o;25043:379::-;25227:3;25249:147;25392:3;25249:147;:::i;:::-;25242:154;;25413:3;25406:10;;25043:379;;;:::o;25428:228::-;25568:34;25564:1;25556:6;25552:14;25545:58;25637:11;25632:2;25624:6;25620:15;25613:36;25428:228;:::o;25662:366::-;25804:3;25825:67;25889:2;25884:3;25825:67;:::i;:::-;25818:74;;25901:93;25990:3;25901:93;:::i;:::-;26019:2;26014:3;26010:12;26003:19;;25662:366;;;:::o;26034:419::-;26200:4;26238:2;26227:9;26223:18;26215:26;;26287:9;26281:4;26277:20;26273:1;26262:9;26258:17;26251:47;26315:131;26441:4;26315:131;:::i;:::-;26307:139;;26034:419;;;:::o;26459:229::-;26599:34;26595:1;26587:6;26583:14;26576:58;26668:12;26663:2;26655:6;26651:15;26644:37;26459:229;:::o;26694:366::-;26836:3;26857:67;26921:2;26916:3;26857:67;:::i;:::-;26850:74;;26933:93;27022:3;26933:93;:::i;:::-;27051:2;27046:3;27042:12;27035:19;;26694:366;;;:::o;27066:419::-;27232:4;27270:2;27259:9;27255:18;27247:26;;27319:9;27313:4;27309:20;27305:1;27294:9;27290:17;27283:47;27347:131;27473:4;27347:131;:::i;:::-;27339:139;;27066:419;;;:::o;27491:170::-;27631:22;27627:1;27619:6;27615:14;27608:46;27491:170;:::o;27667:366::-;27809:3;27830:67;27894:2;27889:3;27830:67;:::i;:::-;27823:74;;27906:93;27995:3;27906:93;:::i;:::-;28024:2;28019:3;28015:12;28008:19;;27667:366;;;:::o;28039:419::-;28205:4;28243:2;28232:9;28228:18;28220:26;;28292:9;28286:4;28282:20;28278:1;28267:9;28263:17;28256:47;28320:131;28446:4;28320:131;:::i;:::-;28312:139;;28039:419;;;:::o;28464:174::-;28604:26;28600:1;28592:6;28588:14;28581:50;28464:174;:::o;28644:366::-;28786:3;28807:67;28871:2;28866:3;28807:67;:::i;:::-;28800:74;;28883:93;28972:3;28883:93;:::i;:::-;29001:2;28996:3;28992:12;28985:19;;28644:366;;;:::o;29016:419::-;29182:4;29220:2;29209:9;29205:18;29197:26;;29269:9;29263:4;29259:20;29255:1;29244:9;29240:17;29233:47;29297:131;29423:4;29297:131;:::i;:::-;29289:139;;29016:419;;;:::o;29441:348::-;29481:7;29504:20;29522:1;29504:20;:::i;:::-;29499:25;;29538:20;29556:1;29538:20;:::i;:::-;29533:25;;29726:1;29658:66;29654:74;29651:1;29648:81;29643:1;29636:9;29629:17;29625:105;29622:131;;;29733:18;;:::i;:::-;29622:131;29781:1;29778;29774:9;29763:20;;29441:348;;;;:::o;29795:169::-;29935:21;29931:1;29923:6;29919:14;29912:45;29795:169;:::o;29970:366::-;30112:3;30133:67;30197:2;30192:3;30133:67;:::i;:::-;30126:74;;30209:93;30298:3;30209:93;:::i;:::-;30327:2;30322:3;30318:12;30311:19;;29970:366;;;:::o;30342:419::-;30508:4;30546:2;30535:9;30531:18;30523:26;;30595:9;30589:4;30585:20;30581:1;30570:9;30566:17;30559:47;30623:131;30749:4;30623:131;:::i;:::-;30615:139;;30342:419;;;:::o;30767:168::-;30907:20;30903:1;30895:6;30891:14;30884:44;30767:168;:::o;30941:366::-;31083:3;31104:67;31168:2;31163:3;31104:67;:::i;:::-;31097:74;;31180:93;31269:3;31180:93;:::i;:::-;31298:2;31293:3;31289:12;31282:19;;30941:366;;;:::o;31313:419::-;31479:4;31517:2;31506:9;31502:18;31494:26;;31566:9;31560:4;31556:20;31552:1;31541:9;31537:17;31530:47;31594:131;31720:4;31594:131;:::i;:::-;31586:139;;31313:419;;;:::o;31738:234::-;31878:34;31874:1;31866:6;31862:14;31855:58;31947:17;31942:2;31934:6;31930:15;31923:42;31738:234;:::o;31978:366::-;32120:3;32141:67;32205:2;32200:3;32141:67;:::i;:::-;32134:74;;32217:93;32306:3;32217:93;:::i;:::-;32335:2;32330:3;32326:12;32319:19;;31978:366;;;:::o;32350:419::-;32516:4;32554:2;32543:9;32539:18;32531:26;;32603:9;32597:4;32593:20;32589:1;32578:9;32574:17;32567:47;32631:131;32757:4;32631:131;:::i;:::-;32623:139;;32350:419;;;:::o;32775:148::-;32877:11;32914:3;32899:18;;32775:148;;;;:::o;32929:377::-;33035:3;33063:39;33096:5;33063:39;:::i;:::-;33118:89;33200:6;33195:3;33118:89;:::i;:::-;33111:96;;33216:52;33261:6;33256:3;33249:4;33242:5;33238:16;33216:52;:::i;:::-;33293:6;33288:3;33284:16;33277:23;;33039:267;32929:377;;;;:::o;33312:141::-;33361:4;33384:3;33376:11;;33407:3;33404:1;33397:14;33441:4;33438:1;33428:18;33420:26;;33312:141;;;:::o;33483:845::-;33586:3;33623:5;33617:12;33652:36;33678:9;33652:36;:::i;:::-;33704:89;33786:6;33781:3;33704:89;:::i;:::-;33697:96;;33824:1;33813:9;33809:17;33840:1;33835:137;;;;33986:1;33981:341;;;;33802:520;;33835:137;33919:4;33915:9;33904;33900:25;33895:3;33888:38;33955:6;33950:3;33946:16;33939:23;;33835:137;;33981:341;34048:38;34080:5;34048:38;:::i;:::-;34108:1;34122:154;34136:6;34133:1;34130:13;34122:154;;;34210:7;34204:14;34200:1;34195:3;34191:11;34184:35;34260:1;34251:7;34247:15;34236:26;;34158:4;34155:1;34151:12;34146:17;;34122:154;;;34305:6;34300:3;34296:16;34289:23;;33988:334;;33802:520;;33590:738;;33483:845;;;;:::o;34334:589::-;34559:3;34581:95;34672:3;34663:6;34581:95;:::i;:::-;34574:102;;34693:95;34784:3;34775:6;34693:95;:::i;:::-;34686:102;;34805:92;34893:3;34884:6;34805:92;:::i;:::-;34798:99;;34914:3;34907:10;;34334:589;;;;;;:::o;34929:178::-;35069:30;35065:1;35057:6;35053:14;35046:54;34929:178;:::o;35113:366::-;35255:3;35276:67;35340:2;35335:3;35276:67;:::i;:::-;35269:74;;35352:93;35441:3;35352:93;:::i;:::-;35470:2;35465:3;35461:12;35454:19;;35113:366;;;:::o;35485:419::-;35651:4;35689:2;35678:9;35674:18;35666:26;;35738:9;35732:4;35728:20;35724:1;35713:9;35709:17;35702:47;35766:131;35892:4;35766:131;:::i;:::-;35758:139;;35485:419;;;:::o;35910:94::-;35943:8;35991:5;35987:2;35983:14;35962:35;;35910:94;;;:::o;36010:::-;36049:7;36078:20;36092:5;36078:20;:::i;:::-;36067:31;;36010:94;;;:::o;36110:100::-;36149:7;36178:26;36198:5;36178:26;:::i;:::-;36167:37;;36110:100;;;:::o;36216:157::-;36321:45;36341:24;36359:5;36341:24;:::i;:::-;36321:45;:::i;:::-;36316:3;36309:58;36216:157;;:::o;36379:256::-;36491:3;36506:75;36577:3;36568:6;36506:75;:::i;:::-;36606:2;36601:3;36597:12;36590:19;;36626:3;36619:10;;36379:256;;;;:::o;36641:170::-;36781:22;36777:1;36769:6;36765:14;36758:46;36641:170;:::o;36817:366::-;36959:3;36980:67;37044:2;37039:3;36980:67;:::i;:::-;36973:74;;37056:93;37145:3;37056:93;:::i;:::-;37174:2;37169:3;37165:12;37158:19;;36817:366;;;:::o;37189:419::-;37355:4;37393:2;37382:9;37378:18;37370:26;;37442:9;37436:4;37432:20;37428:1;37417:9;37413:17;37406:47;37470:131;37596:4;37470:131;:::i;:::-;37462:139;;37189:419;;;:::o;37614:225::-;37754:34;37750:1;37742:6;37738:14;37731:58;37823:8;37818:2;37810:6;37806:15;37799:33;37614:225;:::o;37845:366::-;37987:3;38008:67;38072:2;38067:3;38008:67;:::i;:::-;38001:74;;38084:93;38173:3;38084:93;:::i;:::-;38202:2;38197:3;38193:12;38186:19;;37845:366;;;:::o;38217:419::-;38383:4;38421:2;38410:9;38406:18;38398:26;;38470:9;38464:4;38460:20;38456:1;38445:9;38441:17;38434:47;38498:131;38624:4;38498:131;:::i;:::-;38490:139;;38217:419;;;:::o;38642:231::-;38782:34;38778:1;38770:6;38766:14;38759:58;38851:14;38846:2;38838:6;38834:15;38827:39;38642:231;:::o;38879:366::-;39021:3;39042:67;39106:2;39101:3;39042:67;:::i;:::-;39035:74;;39118:93;39207:3;39118:93;:::i;:::-;39236:2;39231:3;39227:12;39220:19;;38879:366;;;:::o;39251:419::-;39417:4;39455:2;39444:9;39440:18;39432:26;;39504:9;39498:4;39494:20;39490:1;39479:9;39475:17;39468:47;39532:131;39658:4;39532:131;:::i;:::-;39524:139;;39251:419;;;:::o;39676:224::-;39816:34;39812:1;39804:6;39800:14;39793:58;39885:7;39880:2;39872:6;39868:15;39861:32;39676:224;:::o;39906:366::-;40048:3;40069:67;40133:2;40128:3;40069:67;:::i;:::-;40062:74;;40145:93;40234:3;40145:93;:::i;:::-;40263:2;40258:3;40254:12;40247:19;;39906:366;;;:::o;40278:419::-;40444:4;40482:2;40471:9;40467:18;40459:26;;40531:9;40525:4;40521:20;40517:1;40506:9;40502:17;40495:47;40559:131;40685:4;40559:131;:::i;:::-;40551:139;;40278:419;;;:::o;40703:223::-;40843:34;40839:1;40831:6;40827:14;40820:58;40912:6;40907:2;40899:6;40895:15;40888:31;40703:223;:::o;40932:366::-;41074:3;41095:67;41159:2;41154:3;41095:67;:::i;:::-;41088:74;;41171:93;41260:3;41171:93;:::i;:::-;41289:2;41284:3;41280:12;41273:19;;40932:366;;;:::o;41304:419::-;41470:4;41508:2;41497:9;41493:18;41485:26;;41557:9;41551:4;41547:20;41543:1;41532:9;41528:17;41521:47;41585:131;41711:4;41585:131;:::i;:::-;41577:139;;41304:419;;;:::o;41729:98::-;41780:6;41814:5;41808:12;41798:22;;41729:98;;;:::o;41833:168::-;41916:11;41950:6;41945:3;41938:19;41990:4;41985:3;41981:14;41966:29;;41833:168;;;;:::o;42007:360::-;42093:3;42121:38;42153:5;42121:38;:::i;:::-;42175:70;42238:6;42233:3;42175:70;:::i;:::-;42168:77;;42254:52;42299:6;42294:3;42287:4;42280:5;42276:16;42254:52;:::i;:::-;42331:29;42353:6;42331:29;:::i;:::-;42326:3;42322:39;42315:46;;42097:270;42007:360;;;;:::o;42373:419::-;42512:4;42550:2;42539:9;42535:18;42527:26;;42563:71;42631:1;42620:9;42616:17;42607:6;42563:71;:::i;:::-;42681:9;42675:4;42671:20;42666:2;42655:9;42651:18;42644:48;42709:76;42780:4;42771:6;42709:76;:::i;:::-;42701:84;;42373:419;;;;;:::o;42798:233::-;42837:3;42860:24;42878:5;42860:24;:::i;:::-;42851:33;;42906:66;42899:5;42896:77;42893:103;;42976:18;;:::i;:::-;42893:103;43023:1;43016:5;43012:13;43005:20;;42798:233;;;:::o;43037:175::-;43177:27;43173:1;43165:6;43161:14;43154:51;43037:175;:::o;43218:366::-;43360:3;43381:67;43445:2;43440:3;43381:67;:::i;:::-;43374:74;;43457:93;43546:3;43457:93;:::i;:::-;43575:2;43570:3;43566:12;43559:19;;43218:366;;;:::o;43590:419::-;43756:4;43794:2;43783:9;43779:18;43771:26;;43843:9;43837:4;43833:20;43829:1;43818:9;43814:17;43807:47;43871:131;43997:4;43871:131;:::i;:::-;43863:139;;43590:419;;;:::o;44015:237::-;44155:34;44151:1;44143:6;44139:14;44132:58;44224:20;44219:2;44211:6;44207:15;44200:45;44015:237;:::o;44258:366::-;44400:3;44421:67;44485:2;44480:3;44421:67;:::i;:::-;44414:74;;44497:93;44586:3;44497:93;:::i;:::-;44615:2;44610:3;44606:12;44599:19;;44258:366;;;:::o;44630:419::-;44796:4;44834:2;44823:9;44819:18;44811:26;;44883:9;44877:4;44873:20;44869:1;44858:9;44854:17;44847:47;44911:131;45037:4;44911:131;:::i;:::-;44903:139;;44630:419;;;:::o;45055:180::-;45103:77;45100:1;45093:88;45200:4;45197:1;45190:15;45224:4;45221:1;45214:15;45241:185;45281:1;45298:20;45316:1;45298:20;:::i;:::-;45293:25;;45332:20;45350:1;45332:20;:::i;:::-;45327:25;;45371:1;45361:35;;45376:18;;:::i;:::-;45361:35;45418:1;45415;45411:9;45406:14;;45241:185;;;;:::o;45432:176::-;45464:1;45481:20;45499:1;45481:20;:::i;:::-;45476:25;;45515:20;45533:1;45515:20;:::i;:::-;45510:25;;45554:1;45544:35;;45559:18;;:::i;:::-;45544:35;45600:1;45597;45593:9;45588:14;;45432:176;;;;:::o;45614:180::-;45662:77;45659:1;45652:88;45759:4;45756:1;45749:15;45783:4;45780:1;45773:15;45800:640;45995:4;46033:3;46022:9;46018:19;46010:27;;46047:71;46115:1;46104:9;46100:17;46091:6;46047:71;:::i;:::-;46128:72;46196:2;46185:9;46181:18;46172:6;46128:72;:::i;:::-;46210;46278:2;46267:9;46263:18;46254:6;46210:72;:::i;:::-;46329:9;46323:4;46319:20;46314:2;46303:9;46299:18;46292:48;46357:76;46428:4;46419:6;46357:76;:::i;:::-;46349:84;;45800:640;;;;;;;:::o;46446:141::-;46502:5;46533:6;46527:13;46518:22;;46549:32;46575:5;46549:32;:::i;:::-;46446:141;;;;:::o;46593:349::-;46662:6;46711:2;46699:9;46690:7;46686:23;46682:32;46679:119;;;46717:79;;:::i;:::-;46679:119;46837:1;46862:63;46917:7;46908:6;46897:9;46893:22;46862:63;:::i;:::-;46852:73;;46808:127;46593:349;;;;:::o;46948:182::-;47088:34;47084:1;47076:6;47072:14;47065:58;46948:182;:::o;47136:366::-;47278:3;47299:67;47363:2;47358:3;47299:67;:::i;:::-;47292:74;;47375:93;47464:3;47375:93;:::i;:::-;47493:2;47488:3;47484:12;47477:19;;47136:366;;;:::o;47508:419::-;47674:4;47712:2;47701:9;47697:18;47689:26;;47761:9;47755:4;47751:20;47747:1;47736:9;47732:17;47725:47;47789:131;47915:4;47789:131;:::i;:::-;47781:139;;47508:419;;;:::o;47933:178::-;48073:30;48069:1;48061:6;48057:14;48050:54;47933:178;:::o;48117:366::-;48259:3;48280:67;48344:2;48339:3;48280:67;:::i;:::-;48273:74;;48356:93;48445:3;48356:93;:::i;:::-;48474:2;48469:3;48465:12;48458:19;;48117:366;;;:::o;48489:419::-;48655:4;48693:2;48682:9;48678:18;48670:26;;48742:9;48736:4;48732:20;48728:1;48717:9;48713:17;48706:47;48770:131;48896:4;48770:131;:::i;:::-;48762:139;;48489:419;;;:::o

Swarm Source

ipfs://5cba94d99859d8b8bb7d83e030e30163846a37e710e0afaf05eb4156ea19b480
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.