ETH Price: $3,133.57 (-8.82%)
Gas: 7 Gwei

Token

HD Mooncats (HDMC)
 

Overview

Max Total Supply

0 HDMC

Holders

60

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HDMC
0x26c1e466CE41070585d6876dC17B7bD9295C41d5
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:
HDMooncats

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-01
*/

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/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/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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        require(_msgSender() == owner || ERC721.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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

// File: @openzeppelin/contracts/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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/HDMooncats.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;




interface MooncatsContract {

    // Events

    event CatRescued(address indexed to, bytes5 indexed catId);
    event CatNamed(bytes5 indexed catId, bytes32 catName);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event CatAdopted(bytes5 indexed catId, uint price, address indexed from, address indexed to);
    event AdoptionOffered(bytes5 indexed catId, uint price, address indexed toAddress);
    event AdoptionOfferCancelled(bytes5 indexed catId);
    event AdoptionRequested(bytes5 indexed catId, uint price, address indexed from);
    event AdoptionRequestCancelled(bytes5 indexed catId);
    event GenesisCatsAdded(bytes5[16] catIds);

    // Read contract

    function name() external view returns (string memory);

    function remainingGenesisCats() external view returns (uint16);

    function totalSupply() external view returns (uint16);

    function mode() external view returns (uint8);

    function getCatDetails(bytes5) external view returns (bytes5 id, address owner, bytes32 catName, address onlyOfferTo, uint256 offerPrice, address requester, uint256 requestPrice);

    function decimals() external view returns (uint8);

    function getCatOwners() external view returns (address[] memory);

    function catOwners(bytes5 catId) external view returns (address);

    function rescueOrder(uint256 order) external view returns (bytes5 catId);

    function getCatIds() external view returns (bytes5[] memory);

    function balanceOf(address) external view returns (uint256);

    function getCatNames() external view returns (bytes32[] memory);

    function adoptionOffers(bytes5) external view returns (bool exists, bytes5 catId, address seller, uint256 price, address onlyOfferTo);

    function catNames(bytes5 catId) external view returns (bytes32);

    function symbol() external view returns (string memory);

    function getCatRequestPrices() external view returns (uint256[] memory);

    function searchSeed() external view returns (bytes32);

    function imageGenerationCodeMD5() external view returns (bytes16);

    function adoptionRequests(bytes5) external view returns (bool exists, bytes5 catId, address requester, uint256 price);

    function getCatOfferPrices() external view returns (uint256[] memory);

    function rescueIndex() external view returns (uint16);

    function pendingWithdrawals(address) external view returns (uint256);

    // Write contract

    function makeAdoptionOffer(bytes5 catId, uint256 price) external;

    function activate() external;

    function acceptAdoptionOffer(bytes5 catId) external payable;

    function withdraw() external;

    function rescueCat(bytes32 seed) external;

    function cancelAdoptionOffer(bytes5 catId) external;

    function nameCat(bytes5 catId, bytes32 catName) external;

    function activateInTestMode() external;

    function cancelAdoptionRequest(bytes5 catId) external;

    function disableBeforeActivation() external;

    function addGenesisCatGroup() external;

    function makeAdoptionOfferToAddress(bytes5 catId, uint256 price, address to) external;

    function acceptAdoptionRequest(bytes5 catId) external payable;

    function giveCat(bytes5 catId, address to) external;

}

interface WrapperContract {

    // Events

    event Wrapped(bytes5 indexed catId, uint tokenID);
    event Unwrapped(bytes5 indexed catId, uint tokenID);

    // Read contract

    function _baseURI() external view returns (string memory);

    function _catIDToTokenID(bytes5) external view returns (uint);

    function _moonCats() external view returns (address);

    function _owner() external view returns (address);

    function _tokenIDToCatID(uint) external view returns (bytes5);

    function balanceOf(address) external view returns (uint);

    function baseURI() external view returns (string memory);

    function getApproved(uint) external view returns (address);

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function name() external view returns (string memory);

    function ownerOf(uint) external view returns (address);

    function supportsInterface(bytes4) external view returns (bool);

    function symbol() external view returns (string memory);

    function tokenByIndex(uint) external view returns (uint);

    function tokenOfOwnerByIndex(address owner, uint index) external view returns (uint);

    function tokenURI(uint) external view returns (uint);

    function totalSupply() external view returns (uint);

    // Write contract

    function approve(address to, uint tokenId) external;

    function renounceOwnership() external;

    function safeTransferFrom(address from, address to, uint tokenId) external;

    function safeTransferFrom(address from, address to, uint tokenId, bytes memory _data) external;

    function setApprovalForAll(address operator, bool approved) external;

    function setBaseURI(string memory _newBaseURI) external;

    function transferFrom(address from, address to, uint tokenId) external;

    function unwrap(uint tokenId) external;

    function wrap(bytes5 catId) external;
}

interface ForeignToken {

    function balanceOf(address) external view returns (uint);

    function transfer(address, uint) external returns (bool);
}

interface ForeignNFT {

    function transferFrom(address from, address to, uint _tokenId) external payable;

}




contract HDMooncats is Ownable, ERC721 {

    // MD5 hash of the megaimage (80k x 80k pixels) containing 25440 cats
    string public imageHash = "6d834cc1d92d2e05656da65819749732";

    address payable public mooncatsAddress = payable(0x60cd862c9C687A9dE49aecdC3A99b74A4fc54aB6);
    address public wrapperAddress = payable(0x7C40c393DC0f283F318791d746d894DdD3693572);
    string public _baseTokenURI;

    uint public minted = 0;

    address payable public splitter;
    address payable public ercRecipient;

    event Mint(address indexed owner, uint indexed _rescueOrder);

    constructor(address _feeSplitter, address _ercRecipient) payable ERC721("HD Mooncats", "HDMC") {
        splitter = payable(_feeSplitter);
        ercRecipient = payable(_ercRecipient);
    }

    /**
     * @dev Mint an HD Mooncat. The HDMC will be given to the user currently holding the OG mooncat.
     */
    function mint(uint _rescueOrder) public payable {
        // Take mint fee
        require(msg.value >= mintFee(), "Please include mint fee");

        // Check if token already exists
        require(!_exists(_rescueOrder), "Token already minted");

        bytes5 catId = MooncatsContract(mooncatsAddress).rescueOrder(_rescueOrder);
        address owner = MooncatsContract(mooncatsAddress).catOwners(catId);
        if (owner == wrapperAddress) {
            uint tokenId = WrapperContract(wrapperAddress)._catIDToTokenID(catId);
            owner = WrapperContract(wrapperAddress).ownerOf(tokenId);
        }

        _mint(owner, _rescueOrder);
        minted += 1;
        Mint(owner, _rescueOrder);
    }

    /**
     * @dev Returns the current minting fee
     */
    function mintFee() public view returns (uint) {
        if (minted <= 999) {
            return 0.01 ether;
        } else if (minted <= 4999) {
            return 0.05 ether;
        } else if (minted <= 14999) {
            return 0.10 ether;
        } else {
            return 0.20 ether;
        }
    }

    /**
     * @dev Withdraw the contract balance to the dev address
     */
    function withdraw() public {
        uint amount = address(this).balance;
        (bool success,) = splitter.call{value: amount}("");
        require(success, "Failed to send ether");
    }

    /**
     * @dev Withdraw ERC20 tokens from the contract
     */
    function withdrawFungible(address _tokenContract) public {
      ForeignToken token = ForeignToken(_tokenContract);
      uint256 amount = token.balanceOf(address(this));
      token.transfer(ercRecipient, amount);
    }

    /**
     * @dev Withdraw ERC721 tokens from the contract
     */
    function withdrawNonFungible(address _tokenContract, uint256 _tokenId) public {
        ForeignNFT(_tokenContract).transferFrom(address(this), ercRecipient, _tokenId);
    }

    /**
     * @dev Returns a URI for a given token ID's metadata
     */
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId)));
    }

    function setBaseTokenURI(string memory __baseTokenURI) public onlyOwner {
        _baseTokenURI = __baseTokenURI;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeSplitter","type":"address"},{"internalType":"address","name":"_ercRecipient","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_rescueOrder","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"ercRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rescueOrder","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mooncatsAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splitter","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapperAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280602081526020017f3664383334636331643932643265303536353664613635383139373439373332815250600790805190602001906200005192919062000308565b507360cd862c9c687a9de49aecdc3a99b74a4fc54ab6600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737c40c393dc0f283f318791d746d894ddd3693572600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b556040516200416f3803806200416f8339818101604052810190620001269190620003cf565b6040518060400160405280600b81526020017f4844204d6f6f6e636174730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f48444d43000000000000000000000000000000000000000000000000000000008152506000620001a46200030060201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600190805190602001906200025a92919062000308565b5080600290805190602001906200027392919062000308565b50505081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620004c3565b600033905090565b828054620003169062000444565b90600052602060002090601f0160209004810192826200033a576000855562000386565b82601f106200035557805160ff191683800117855562000386565b8280016001018555821562000386579182015b828111156200038557825182559160200191906001019062000368565b5b50905062000395919062000399565b5090565b5b80821115620003b45760008160009055506001016200039a565b5090565b600081519050620003c981620004a9565b92915050565b60008060408385031215620003e357600080fd5b6000620003f385828601620003b8565b92505060206200040685828601620003b8565b9150509250929050565b60006200041d8262000424565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200045d57607f821691505b602082108114156200047457620004736200047a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620004b48162000410565b8114620004c057600080fd5b50565b613c9c80620004d36000396000f3fe6080604052600436106101c25760003560e01c80635da8f662116100f7578063a0712d6811610095578063cfc86f7b11610064578063cfc86f7b1461060f578063e985e9c51461063a578063f2fde38b14610677578063f7a7c265146106a0576101c2565b8063a0712d6814610564578063a22cb46514610580578063b88d4fde146105a9578063c87b56dd146105d2576101c2565b8063715018a6116100d1578063715018a6146104cc5780637df8b802146104e35780638da5cb5b1461050e57806395d89b4114610539576101c2565b80635da8f662146104295780636352211e1461045257806370a082311461048f576101c2565b806330176e13116101645780633e1d139f1161013e5780633e1d139f1461037f57806342842e0e146103aa5780634f02c420146103d357806351605d80146103fe576101c2565b806330176e13146103145780633ccfd60b1461033d5780633cd8045e14610354576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b31461029757806313966db5146102c057806323b872dd146102eb576101c2565b80630121240e146101c757806301ffc9a7146101f257806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101dc6106c9565b6040516101e99190612f79565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190612a02565b6106ef565b6040516102269190613040565b60405180910390f35b34801561023b57600080fd5b506102446107d1565b6040516102519190613076565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190612abe565b610863565b60405161028e9190612f5e565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b9919061299d565b6108e8565b005b3480156102cc57600080fd5b506102d5610a00565b6040516102e291906132d8565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612897565b610a60565b005b34801561032057600080fd5b5061033b60048036038101906103369190612a7d565b610ac0565b005b34801561034957600080fd5b50610352610b56565b005b34801561036057600080fd5b50610369610c2d565b6040516103769190612f79565b60405180910390f35b34801561038b57600080fd5b50610394610c53565b6040516103a19190612f79565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190612897565b610c79565b005b3480156103df57600080fd5b506103e8610c99565b6040516103f591906132d8565b60405180910390f35b34801561040a57600080fd5b50610413610c9f565b6040516104209190613076565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b919061299d565b610d2d565b005b34801561045e57600080fd5b5061047960048036038101906104749190612abe565b610dc2565b6040516104869190612f5e565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612809565b610e74565b6040516104c391906132d8565b60405180910390f35b3480156104d857600080fd5b506104e1610f2c565b005b3480156104ef57600080fd5b506104f8611066565b6040516105059190612f5e565b60405180910390f35b34801561051a57600080fd5b5061052361108c565b6040516105309190612f5e565b60405180910390f35b34801561054557600080fd5b5061054e6110b5565b60405161055b9190613076565b60405180910390f35b61057e60048036038101906105799190612abe565b611147565b005b34801561058c57600080fd5b506105a760048036038101906105a29190612961565b611559565b005b3480156105b557600080fd5b506105d060048036038101906105cb91906128e6565b6116da565b005b3480156105de57600080fd5b506105f960048036038101906105f49190612abe565b61173c565b6040516106069190613076565b60405180910390f35b34801561061b57600080fd5b50610624611770565b6040516106319190613076565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061285b565b6117fe565b60405161066e9190613040565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612809565b611892565b005b3480156106ac57600080fd5b506106c760048036038101906106c29190612809565b611a3b565b005b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ca57506107c982611b82565b5b9050919050565b6060600180546107e0906135c2565b80601f016020809104026020016040519081016040528092919081815260200182805461080c906135c2565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b5050505050905090565b600061086e82611bec565b6108ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a490613218565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f382610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90613298565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610983611c58565b73ffffffffffffffffffffffffffffffffffffffff1614806109b257506109b1816109ac611c58565b6117fe565b5b6109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e890613198565b60405180910390fd5b6109fb8383611c60565b505050565b60006103e7600b5411610a1c57662386f26fc100009050610a5d565b611387600b5411610a365766b1a2bc2ec500009050610a5d565b613a97600b5411610a515767016345785d8a00009050610a5d565b6702c68af0bb14000090505b90565b610a71610a6b611c58565b82611d19565b610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa7906132b8565b60405180910390fd5b610abb838383611df7565b505050565b610ac8611c58565b73ffffffffffffffffffffffffffffffffffffffff16610ae661108c565b73ffffffffffffffffffffffffffffffffffffffff1614610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613238565b60405180910390fd5b80600a9080519060200190610b529291906125d9565b5050565b60004790506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610ba390612f49565b60006040518083038185875af1925050503d8060008114610be0576040519150601f19603f3d011682016040523d82523d6000602084013e610be5565b606091505b5050905080610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090613258565b60405180910390fd5b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c94838383604051806020016040528060008152506116da565b505050565b600b5481565b60078054610cac906135c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd8906135c2565b8015610d255780601f10610cfa57610100808354040283529160200191610d25565b820191906000526020600020905b815481529060010190602001808311610d0857829003601f168201915b505050505081565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd30600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610d8c93929190612fbd565b600060405180830381600087803b158015610da657600080fd5b505af1158015610dba573d6000803e3d6000fd5b505050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906131d8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc906131b8565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f34611c58565b73ffffffffffffffffffffffffffffffffffffffff16610f5261108c565b73ffffffffffffffffffffffffffffffffffffffff1614610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f90613238565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546110c4906135c2565b80601f01602080910402602001604051908101604052809291908181526020018280546110f0906135c2565b801561113d5780601f106111125761010080835404028352916020019161113d565b820191906000526020600020905b81548152906001019060200180831161112057829003601f168201915b5050505050905090565b61114f610a00565b341015611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890613098565b60405180910390fd5b61119a81611bec565b156111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d1906130b8565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663434b1208836040518263ffffffff1660e01b815260040161123791906132d8565b60206040518083038186803b15801561124f57600080fd5b505afa158015611263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112879190612a54565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633894ca57836040518263ffffffff1660e01b81526004016112e6919061305b565b60206040518083038186803b1580156112fe57600080fd5b505afa158015611312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113369190612832565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ec576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ce879a8846040518263ffffffff1660e01b81526004016113eb919061305b565b60206040518083038186803b15801561140357600080fd5b505afa158015611417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143b9190612ae7565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b815260040161149891906132d8565b60206040518083038186803b1580156114b057600080fd5b505afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e89190612832565b9150505b6114f68184612053565b6001600b600082825461150991906133dd565b92505081905550828173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3505050565b611561611c58565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613158565b60405180910390fd5b80600660006115dc611c58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611689611c58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ce9190613040565b60405180910390a35050565b6116eb6116e5611c58565b83611d19565b61172a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611721906132b8565b60405180910390fd5b61173684848484612221565b50505050565b6060600a6117498361227d565b60405160200161175a929190612f25565b6040516020818303038152906040529050919050565b600a805461177d906135c2565b80601f01602080910402602001604051908101604052809291908181526020018280546117a9906135c2565b80156117f65780601f106117cb576101008083540402835291602001916117f6565b820191906000526020600020905b8154815290600101906020018083116117d957829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61189a611c58565b73ffffffffffffffffffffffffffffffffffffffff166118b861108c565b73ffffffffffffffffffffffffffffffffffffffff161461190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613238565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611975906130f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a7b9190612f5e565b60206040518083038186803b158015611a9357600080fd5b505afa158015611aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acb9190612ae7565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401611b2a929190612f94565b602060405180830381600087803b158015611b4457600080fd5b505af1158015611b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7c91906129d9565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cd383610dc2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2482611bec565b611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90613178565b60405180910390fd5b6000611d6e83610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ddd57508373ffffffffffffffffffffffffffffffffffffffff16611dc584610863565b73ffffffffffffffffffffffffffffffffffffffff16145b80611dee5750611ded81856117fe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e1782610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6490613278565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490613138565b60405180910390fd5b611ee883838361242a565b611ef3600082611c60565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f439190613464565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f9a91906133dd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba906131f8565b60405180910390fd5b6120cc81611bec565b1561210c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210390613118565b60405180910390fd5b6121186000838361242a565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461216891906133dd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61222c848484611df7565b6122388484848461242f565b612277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226e906130d8565b60405180910390fd5b50505050565b606060008214156122c5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612425565b600082905060005b600082146122f75780806122e090613625565b915050600a826122f09190613433565b91506122cd565b60008167ffffffffffffffff811115612339577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561236b5781602001600182028036833780820191505090505b5090505b6000851461241e576001826123849190613464565b9150600a85612393919061366e565b603061239f91906133dd565b60f81b8183815181106123db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124179190613433565b945061236f565b8093505050505b919050565b505050565b60006124508473ffffffffffffffffffffffffffffffffffffffff166125c6565b156125b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612479611c58565b8786866040518563ffffffff1660e01b815260040161249b9493929190612ff4565b602060405180830381600087803b1580156124b557600080fd5b505af19250505080156124e657506040513d601f19601f820116820180604052508101906124e39190612a2b565b60015b612569573d8060008114612516576040519150601f19603f3d011682016040523d82523d6000602084013e61251b565b606091505b50600081511415612561576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612558906130d8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125be565b600190505b949350505050565b600080823b905060008111915050919050565b8280546125e5906135c2565b90600052602060002090601f016020900481019282612607576000855561264e565b82601f1061262057805160ff191683800117855561264e565b8280016001018555821561264e579182015b8281111561264d578251825591602001919060010190612632565b5b50905061265b919061265f565b5090565b5b80821115612678576000816000905550600101612660565b5090565b600061268f61268a84613318565b6132f3565b9050828152602081018484840111156126a757600080fd5b6126b2848285613580565b509392505050565b60006126cd6126c884613349565b6132f3565b9050828152602081018484840111156126e557600080fd5b6126f0848285613580565b509392505050565b60008135905061270781613bf3565b92915050565b60008151905061271c81613bf3565b92915050565b60008135905061273181613c0a565b92915050565b60008151905061274681613c0a565b92915050565b60008135905061275b81613c21565b92915050565b60008151905061277081613c21565b92915050565b60008151905061278581613c38565b92915050565b600082601f83011261279c57600080fd5b81356127ac84826020860161267c565b91505092915050565b600082601f8301126127c657600080fd5b81356127d68482602086016126ba565b91505092915050565b6000813590506127ee81613c4f565b92915050565b60008151905061280381613c4f565b92915050565b60006020828403121561281b57600080fd5b6000612829848285016126f8565b91505092915050565b60006020828403121561284457600080fd5b60006128528482850161270d565b91505092915050565b6000806040838503121561286e57600080fd5b600061287c858286016126f8565b925050602061288d858286016126f8565b9150509250929050565b6000806000606084860312156128ac57600080fd5b60006128ba868287016126f8565b93505060206128cb868287016126f8565b92505060406128dc868287016127df565b9150509250925092565b600080600080608085870312156128fc57600080fd5b600061290a878288016126f8565b945050602061291b878288016126f8565b935050604061292c878288016127df565b925050606085013567ffffffffffffffff81111561294957600080fd5b6129558782880161278b565b91505092959194509250565b6000806040838503121561297457600080fd5b6000612982858286016126f8565b925050602061299385828601612722565b9150509250929050565b600080604083850312156129b057600080fd5b60006129be858286016126f8565b92505060206129cf858286016127df565b9150509250929050565b6000602082840312156129eb57600080fd5b60006129f984828501612737565b91505092915050565b600060208284031215612a1457600080fd5b6000612a228482850161274c565b91505092915050565b600060208284031215612a3d57600080fd5b6000612a4b84828501612761565b91505092915050565b600060208284031215612a6657600080fd5b6000612a7484828501612776565b91505092915050565b600060208284031215612a8f57600080fd5b600082013567ffffffffffffffff811115612aa957600080fd5b612ab5848285016127b5565b91505092915050565b600060208284031215612ad057600080fd5b6000612ade848285016127df565b91505092915050565b600060208284031215612af957600080fd5b6000612b07848285016127f4565b91505092915050565b612b198161354a565b82525050565b612b28816134aa565b82525050565b612b3781613498565b82525050565b612b46816134bc565b82525050565b612b55816134f4565b82525050565b6000612b668261338f565b612b7081856133a5565b9350612b8081856020860161358f565b612b898161375b565b840191505092915050565b6000612b9f8261339a565b612ba981856133c1565b9350612bb981856020860161358f565b612bc28161375b565b840191505092915050565b6000612bd88261339a565b612be281856133d2565b9350612bf281856020860161358f565b80840191505092915050565b60008154612c0b816135c2565b612c1581866133d2565b94506001821660008114612c305760018114612c4157612c74565b60ff19831686528186019350612c74565b612c4a8561337a565b60005b83811015612c6c57815481890152600182019150602081019050612c4d565b838801955050505b50505092915050565b6000612c8a6017836133c1565b9150612c958261376c565b602082019050919050565b6000612cad6014836133c1565b9150612cb882613795565b602082019050919050565b6000612cd06032836133c1565b9150612cdb826137be565b604082019050919050565b6000612cf36026836133c1565b9150612cfe8261380d565b604082019050919050565b6000612d16601c836133c1565b9150612d218261385c565b602082019050919050565b6000612d396024836133c1565b9150612d4482613885565b604082019050919050565b6000612d5c6019836133c1565b9150612d67826138d4565b602082019050919050565b6000612d7f602c836133c1565b9150612d8a826138fd565b604082019050919050565b6000612da26038836133c1565b9150612dad8261394c565b604082019050919050565b6000612dc5602a836133c1565b9150612dd08261399b565b604082019050919050565b6000612de86029836133c1565b9150612df3826139ea565b604082019050919050565b6000612e0b6020836133c1565b9150612e1682613a39565b602082019050919050565b6000612e2e602c836133c1565b9150612e3982613a62565b604082019050919050565b6000612e516020836133c1565b9150612e5c82613ab1565b602082019050919050565b6000612e746014836133c1565b9150612e7f82613ada565b602082019050919050565b6000612e976029836133c1565b9150612ea282613b03565b604082019050919050565b6000612eba6021836133c1565b9150612ec582613b52565b604082019050919050565b6000612edd6000836133b6565b9150612ee882613ba1565b600082019050919050565b6000612f006031836133c1565b9150612f0b82613ba4565b604082019050919050565b612f1f81613540565b82525050565b6000612f318285612bfe565b9150612f3d8284612bcd565b91508190509392505050565b6000612f5482612ed0565b9150819050919050565b6000602082019050612f736000830184612b2e565b92915050565b6000602082019050612f8e6000830184612b1f565b92915050565b6000604082019050612fa96000830185612b10565b612fb66020830184612f16565b9392505050565b6000606082019050612fd26000830186612b2e565b612fdf6020830185612b10565b612fec6040830184612f16565b949350505050565b60006080820190506130096000830187612b2e565b6130166020830186612b2e565b6130236040830185612f16565b81810360608301526130358184612b5b565b905095945050505050565b60006020820190506130556000830184612b3d565b92915050565b60006020820190506130706000830184612b4c565b92915050565b600060208201905081810360008301526130908184612b94565b905092915050565b600060208201905081810360008301526130b181612c7d565b9050919050565b600060208201905081810360008301526130d181612ca0565b9050919050565b600060208201905081810360008301526130f181612cc3565b9050919050565b6000602082019050818103600083015261311181612ce6565b9050919050565b6000602082019050818103600083015261313181612d09565b9050919050565b6000602082019050818103600083015261315181612d2c565b9050919050565b6000602082019050818103600083015261317181612d4f565b9050919050565b6000602082019050818103600083015261319181612d72565b9050919050565b600060208201905081810360008301526131b181612d95565b9050919050565b600060208201905081810360008301526131d181612db8565b9050919050565b600060208201905081810360008301526131f181612ddb565b9050919050565b6000602082019050818103600083015261321181612dfe565b9050919050565b6000602082019050818103600083015261323181612e21565b9050919050565b6000602082019050818103600083015261325181612e44565b9050919050565b6000602082019050818103600083015261327181612e67565b9050919050565b6000602082019050818103600083015261329181612e8a565b9050919050565b600060208201905081810360008301526132b181612ead565b9050919050565b600060208201905081810360008301526132d181612ef3565b9050919050565b60006020820190506132ed6000830184612f16565b92915050565b60006132fd61330e565b905061330982826135f4565b919050565b6000604051905090565b600067ffffffffffffffff8211156133335761333261372c565b5b61333c8261375b565b9050602081019050919050565b600067ffffffffffffffff8211156133645761336361372c565b5b61336d8261375b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006133e882613540565b91506133f383613540565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134285761342761369f565b5b828201905092915050565b600061343e82613540565b915061344983613540565b925082613459576134586136ce565b5b828204905092915050565b600061346f82613540565b915061347a83613540565b92508282101561348d5761348c61369f565b5b828203905092915050565b60006134a382613520565b9050919050565b60006134b582613520565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffff00000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006135558261355c565b9050919050565b60006135678261356e565b9050919050565b600061357982613520565b9050919050565b82818337600083830152505050565b60005b838110156135ad578082015181840152602081019050613592565b838111156135bc576000848401525b50505050565b600060028204905060018216806135da57607f821691505b602082108114156135ee576135ed6136fd565b5b50919050565b6135fd8261375b565b810181811067ffffffffffffffff8211171561361c5761361b61372c565b5b80604052505050565b600061363082613540565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136635761366261369f565b5b600182019050919050565b600061367982613540565b915061368483613540565b925082613694576136936136ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f506c6561736520696e636c756465206d696e7420666565000000000000000000600082015250565b7f546f6b656e20616c7265616479206d696e746564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613bfc81613498565b8114613c0757600080fd5b50565b613c13816134bc565b8114613c1e57600080fd5b50565b613c2a816134c8565b8114613c3557600080fd5b50565b613c41816134f4565b8114613c4c57600080fd5b50565b613c5881613540565b8114613c6357600080fd5b5056fea2646970667358221220458fe9551b5cbb688ab72a1a7f3f46bd20de60bdeed9594b186109da424f5efb64736f6c634300080300330000000000000000000000009cb2ad884820e594ecdc9bfb368bccae2476bc23000000000000000000000000a453fd30b502dba988a869b4a72b4a9e1dd33d7a

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80635da8f662116100f7578063a0712d6811610095578063cfc86f7b11610064578063cfc86f7b1461060f578063e985e9c51461063a578063f2fde38b14610677578063f7a7c265146106a0576101c2565b8063a0712d6814610564578063a22cb46514610580578063b88d4fde146105a9578063c87b56dd146105d2576101c2565b8063715018a6116100d1578063715018a6146104cc5780637df8b802146104e35780638da5cb5b1461050e57806395d89b4114610539576101c2565b80635da8f662146104295780636352211e1461045257806370a082311461048f576101c2565b806330176e13116101645780633e1d139f1161013e5780633e1d139f1461037f57806342842e0e146103aa5780634f02c420146103d357806351605d80146103fe576101c2565b806330176e13146103145780633ccfd60b1461033d5780633cd8045e14610354576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b31461029757806313966db5146102c057806323b872dd146102eb576101c2565b80630121240e146101c757806301ffc9a7146101f257806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101dc6106c9565b6040516101e99190612f79565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190612a02565b6106ef565b6040516102269190613040565b60405180910390f35b34801561023b57600080fd5b506102446107d1565b6040516102519190613076565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190612abe565b610863565b60405161028e9190612f5e565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b9919061299d565b6108e8565b005b3480156102cc57600080fd5b506102d5610a00565b6040516102e291906132d8565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612897565b610a60565b005b34801561032057600080fd5b5061033b60048036038101906103369190612a7d565b610ac0565b005b34801561034957600080fd5b50610352610b56565b005b34801561036057600080fd5b50610369610c2d565b6040516103769190612f79565b60405180910390f35b34801561038b57600080fd5b50610394610c53565b6040516103a19190612f79565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190612897565b610c79565b005b3480156103df57600080fd5b506103e8610c99565b6040516103f591906132d8565b60405180910390f35b34801561040a57600080fd5b50610413610c9f565b6040516104209190613076565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b919061299d565b610d2d565b005b34801561045e57600080fd5b5061047960048036038101906104749190612abe565b610dc2565b6040516104869190612f5e565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612809565b610e74565b6040516104c391906132d8565b60405180910390f35b3480156104d857600080fd5b506104e1610f2c565b005b3480156104ef57600080fd5b506104f8611066565b6040516105059190612f5e565b60405180910390f35b34801561051a57600080fd5b5061052361108c565b6040516105309190612f5e565b60405180910390f35b34801561054557600080fd5b5061054e6110b5565b60405161055b9190613076565b60405180910390f35b61057e60048036038101906105799190612abe565b611147565b005b34801561058c57600080fd5b506105a760048036038101906105a29190612961565b611559565b005b3480156105b557600080fd5b506105d060048036038101906105cb91906128e6565b6116da565b005b3480156105de57600080fd5b506105f960048036038101906105f49190612abe565b61173c565b6040516106069190613076565b60405180910390f35b34801561061b57600080fd5b50610624611770565b6040516106319190613076565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061285b565b6117fe565b60405161066e9190613040565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612809565b611892565b005b3480156106ac57600080fd5b506106c760048036038101906106c29190612809565b611a3b565b005b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ca57506107c982611b82565b5b9050919050565b6060600180546107e0906135c2565b80601f016020809104026020016040519081016040528092919081815260200182805461080c906135c2565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b5050505050905090565b600061086e82611bec565b6108ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a490613218565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f382610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90613298565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610983611c58565b73ffffffffffffffffffffffffffffffffffffffff1614806109b257506109b1816109ac611c58565b6117fe565b5b6109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e890613198565b60405180910390fd5b6109fb8383611c60565b505050565b60006103e7600b5411610a1c57662386f26fc100009050610a5d565b611387600b5411610a365766b1a2bc2ec500009050610a5d565b613a97600b5411610a515767016345785d8a00009050610a5d565b6702c68af0bb14000090505b90565b610a71610a6b611c58565b82611d19565b610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa7906132b8565b60405180910390fd5b610abb838383611df7565b505050565b610ac8611c58565b73ffffffffffffffffffffffffffffffffffffffff16610ae661108c565b73ffffffffffffffffffffffffffffffffffffffff1614610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613238565b60405180910390fd5b80600a9080519060200190610b529291906125d9565b5050565b60004790506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610ba390612f49565b60006040518083038185875af1925050503d8060008114610be0576040519150601f19603f3d011682016040523d82523d6000602084013e610be5565b606091505b5050905080610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090613258565b60405180910390fd5b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c94838383604051806020016040528060008152506116da565b505050565b600b5481565b60078054610cac906135c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd8906135c2565b8015610d255780601f10610cfa57610100808354040283529160200191610d25565b820191906000526020600020905b815481529060010190602001808311610d0857829003601f168201915b505050505081565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd30600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610d8c93929190612fbd565b600060405180830381600087803b158015610da657600080fd5b505af1158015610dba573d6000803e3d6000fd5b505050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906131d8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc906131b8565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f34611c58565b73ffffffffffffffffffffffffffffffffffffffff16610f5261108c565b73ffffffffffffffffffffffffffffffffffffffff1614610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f90613238565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546110c4906135c2565b80601f01602080910402602001604051908101604052809291908181526020018280546110f0906135c2565b801561113d5780601f106111125761010080835404028352916020019161113d565b820191906000526020600020905b81548152906001019060200180831161112057829003601f168201915b5050505050905090565b61114f610a00565b341015611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890613098565b60405180910390fd5b61119a81611bec565b156111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d1906130b8565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663434b1208836040518263ffffffff1660e01b815260040161123791906132d8565b60206040518083038186803b15801561124f57600080fd5b505afa158015611263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112879190612a54565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633894ca57836040518263ffffffff1660e01b81526004016112e6919061305b565b60206040518083038186803b1580156112fe57600080fd5b505afa158015611312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113369190612832565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ec576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ce879a8846040518263ffffffff1660e01b81526004016113eb919061305b565b60206040518083038186803b15801561140357600080fd5b505afa158015611417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143b9190612ae7565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b815260040161149891906132d8565b60206040518083038186803b1580156114b057600080fd5b505afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e89190612832565b9150505b6114f68184612053565b6001600b600082825461150991906133dd565b92505081905550828173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3505050565b611561611c58565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613158565b60405180910390fd5b80600660006115dc611c58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611689611c58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ce9190613040565b60405180910390a35050565b6116eb6116e5611c58565b83611d19565b61172a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611721906132b8565b60405180910390fd5b61173684848484612221565b50505050565b6060600a6117498361227d565b60405160200161175a929190612f25565b6040516020818303038152906040529050919050565b600a805461177d906135c2565b80601f01602080910402602001604051908101604052809291908181526020018280546117a9906135c2565b80156117f65780601f106117cb576101008083540402835291602001916117f6565b820191906000526020600020905b8154815290600101906020018083116117d957829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61189a611c58565b73ffffffffffffffffffffffffffffffffffffffff166118b861108c565b73ffffffffffffffffffffffffffffffffffffffff161461190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613238565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611975906130f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a7b9190612f5e565b60206040518083038186803b158015611a9357600080fd5b505afa158015611aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acb9190612ae7565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401611b2a929190612f94565b602060405180830381600087803b158015611b4457600080fd5b505af1158015611b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7c91906129d9565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cd383610dc2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2482611bec565b611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90613178565b60405180910390fd5b6000611d6e83610dc2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ddd57508373ffffffffffffffffffffffffffffffffffffffff16611dc584610863565b73ffffffffffffffffffffffffffffffffffffffff16145b80611dee5750611ded81856117fe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e1782610dc2565b73ffffffffffffffffffffffffffffffffffffffff1614611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6490613278565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490613138565b60405180910390fd5b611ee883838361242a565b611ef3600082611c60565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f439190613464565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f9a91906133dd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba906131f8565b60405180910390fd5b6120cc81611bec565b1561210c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210390613118565b60405180910390fd5b6121186000838361242a565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461216891906133dd565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61222c848484611df7565b6122388484848461242f565b612277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226e906130d8565b60405180910390fd5b50505050565b606060008214156122c5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612425565b600082905060005b600082146122f75780806122e090613625565b915050600a826122f09190613433565b91506122cd565b60008167ffffffffffffffff811115612339577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561236b5781602001600182028036833780820191505090505b5090505b6000851461241e576001826123849190613464565b9150600a85612393919061366e565b603061239f91906133dd565b60f81b8183815181106123db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124179190613433565b945061236f565b8093505050505b919050565b505050565b60006124508473ffffffffffffffffffffffffffffffffffffffff166125c6565b156125b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612479611c58565b8786866040518563ffffffff1660e01b815260040161249b9493929190612ff4565b602060405180830381600087803b1580156124b557600080fd5b505af19250505080156124e657506040513d601f19601f820116820180604052508101906124e39190612a2b565b60015b612569573d8060008114612516576040519150601f19603f3d011682016040523d82523d6000602084013e61251b565b606091505b50600081511415612561576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612558906130d8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125be565b600190505b949350505050565b600080823b905060008111915050919050565b8280546125e5906135c2565b90600052602060002090601f016020900481019282612607576000855561264e565b82601f1061262057805160ff191683800117855561264e565b8280016001018555821561264e579182015b8281111561264d578251825591602001919060010190612632565b5b50905061265b919061265f565b5090565b5b80821115612678576000816000905550600101612660565b5090565b600061268f61268a84613318565b6132f3565b9050828152602081018484840111156126a757600080fd5b6126b2848285613580565b509392505050565b60006126cd6126c884613349565b6132f3565b9050828152602081018484840111156126e557600080fd5b6126f0848285613580565b509392505050565b60008135905061270781613bf3565b92915050565b60008151905061271c81613bf3565b92915050565b60008135905061273181613c0a565b92915050565b60008151905061274681613c0a565b92915050565b60008135905061275b81613c21565b92915050565b60008151905061277081613c21565b92915050565b60008151905061278581613c38565b92915050565b600082601f83011261279c57600080fd5b81356127ac84826020860161267c565b91505092915050565b600082601f8301126127c657600080fd5b81356127d68482602086016126ba565b91505092915050565b6000813590506127ee81613c4f565b92915050565b60008151905061280381613c4f565b92915050565b60006020828403121561281b57600080fd5b6000612829848285016126f8565b91505092915050565b60006020828403121561284457600080fd5b60006128528482850161270d565b91505092915050565b6000806040838503121561286e57600080fd5b600061287c858286016126f8565b925050602061288d858286016126f8565b9150509250929050565b6000806000606084860312156128ac57600080fd5b60006128ba868287016126f8565b93505060206128cb868287016126f8565b92505060406128dc868287016127df565b9150509250925092565b600080600080608085870312156128fc57600080fd5b600061290a878288016126f8565b945050602061291b878288016126f8565b935050604061292c878288016127df565b925050606085013567ffffffffffffffff81111561294957600080fd5b6129558782880161278b565b91505092959194509250565b6000806040838503121561297457600080fd5b6000612982858286016126f8565b925050602061299385828601612722565b9150509250929050565b600080604083850312156129b057600080fd5b60006129be858286016126f8565b92505060206129cf858286016127df565b9150509250929050565b6000602082840312156129eb57600080fd5b60006129f984828501612737565b91505092915050565b600060208284031215612a1457600080fd5b6000612a228482850161274c565b91505092915050565b600060208284031215612a3d57600080fd5b6000612a4b84828501612761565b91505092915050565b600060208284031215612a6657600080fd5b6000612a7484828501612776565b91505092915050565b600060208284031215612a8f57600080fd5b600082013567ffffffffffffffff811115612aa957600080fd5b612ab5848285016127b5565b91505092915050565b600060208284031215612ad057600080fd5b6000612ade848285016127df565b91505092915050565b600060208284031215612af957600080fd5b6000612b07848285016127f4565b91505092915050565b612b198161354a565b82525050565b612b28816134aa565b82525050565b612b3781613498565b82525050565b612b46816134bc565b82525050565b612b55816134f4565b82525050565b6000612b668261338f565b612b7081856133a5565b9350612b8081856020860161358f565b612b898161375b565b840191505092915050565b6000612b9f8261339a565b612ba981856133c1565b9350612bb981856020860161358f565b612bc28161375b565b840191505092915050565b6000612bd88261339a565b612be281856133d2565b9350612bf281856020860161358f565b80840191505092915050565b60008154612c0b816135c2565b612c1581866133d2565b94506001821660008114612c305760018114612c4157612c74565b60ff19831686528186019350612c74565b612c4a8561337a565b60005b83811015612c6c57815481890152600182019150602081019050612c4d565b838801955050505b50505092915050565b6000612c8a6017836133c1565b9150612c958261376c565b602082019050919050565b6000612cad6014836133c1565b9150612cb882613795565b602082019050919050565b6000612cd06032836133c1565b9150612cdb826137be565b604082019050919050565b6000612cf36026836133c1565b9150612cfe8261380d565b604082019050919050565b6000612d16601c836133c1565b9150612d218261385c565b602082019050919050565b6000612d396024836133c1565b9150612d4482613885565b604082019050919050565b6000612d5c6019836133c1565b9150612d67826138d4565b602082019050919050565b6000612d7f602c836133c1565b9150612d8a826138fd565b604082019050919050565b6000612da26038836133c1565b9150612dad8261394c565b604082019050919050565b6000612dc5602a836133c1565b9150612dd08261399b565b604082019050919050565b6000612de86029836133c1565b9150612df3826139ea565b604082019050919050565b6000612e0b6020836133c1565b9150612e1682613a39565b602082019050919050565b6000612e2e602c836133c1565b9150612e3982613a62565b604082019050919050565b6000612e516020836133c1565b9150612e5c82613ab1565b602082019050919050565b6000612e746014836133c1565b9150612e7f82613ada565b602082019050919050565b6000612e976029836133c1565b9150612ea282613b03565b604082019050919050565b6000612eba6021836133c1565b9150612ec582613b52565b604082019050919050565b6000612edd6000836133b6565b9150612ee882613ba1565b600082019050919050565b6000612f006031836133c1565b9150612f0b82613ba4565b604082019050919050565b612f1f81613540565b82525050565b6000612f318285612bfe565b9150612f3d8284612bcd565b91508190509392505050565b6000612f5482612ed0565b9150819050919050565b6000602082019050612f736000830184612b2e565b92915050565b6000602082019050612f8e6000830184612b1f565b92915050565b6000604082019050612fa96000830185612b10565b612fb66020830184612f16565b9392505050565b6000606082019050612fd26000830186612b2e565b612fdf6020830185612b10565b612fec6040830184612f16565b949350505050565b60006080820190506130096000830187612b2e565b6130166020830186612b2e565b6130236040830185612f16565b81810360608301526130358184612b5b565b905095945050505050565b60006020820190506130556000830184612b3d565b92915050565b60006020820190506130706000830184612b4c565b92915050565b600060208201905081810360008301526130908184612b94565b905092915050565b600060208201905081810360008301526130b181612c7d565b9050919050565b600060208201905081810360008301526130d181612ca0565b9050919050565b600060208201905081810360008301526130f181612cc3565b9050919050565b6000602082019050818103600083015261311181612ce6565b9050919050565b6000602082019050818103600083015261313181612d09565b9050919050565b6000602082019050818103600083015261315181612d2c565b9050919050565b6000602082019050818103600083015261317181612d4f565b9050919050565b6000602082019050818103600083015261319181612d72565b9050919050565b600060208201905081810360008301526131b181612d95565b9050919050565b600060208201905081810360008301526131d181612db8565b9050919050565b600060208201905081810360008301526131f181612ddb565b9050919050565b6000602082019050818103600083015261321181612dfe565b9050919050565b6000602082019050818103600083015261323181612e21565b9050919050565b6000602082019050818103600083015261325181612e44565b9050919050565b6000602082019050818103600083015261327181612e67565b9050919050565b6000602082019050818103600083015261329181612e8a565b9050919050565b600060208201905081810360008301526132b181612ead565b9050919050565b600060208201905081810360008301526132d181612ef3565b9050919050565b60006020820190506132ed6000830184612f16565b92915050565b60006132fd61330e565b905061330982826135f4565b919050565b6000604051905090565b600067ffffffffffffffff8211156133335761333261372c565b5b61333c8261375b565b9050602081019050919050565b600067ffffffffffffffff8211156133645761336361372c565b5b61336d8261375b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006133e882613540565b91506133f383613540565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134285761342761369f565b5b828201905092915050565b600061343e82613540565b915061344983613540565b925082613459576134586136ce565b5b828204905092915050565b600061346f82613540565b915061347a83613540565b92508282101561348d5761348c61369f565b5b828203905092915050565b60006134a382613520565b9050919050565b60006134b582613520565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffff00000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006135558261355c565b9050919050565b60006135678261356e565b9050919050565b600061357982613520565b9050919050565b82818337600083830152505050565b60005b838110156135ad578082015181840152602081019050613592565b838111156135bc576000848401525b50505050565b600060028204905060018216806135da57607f821691505b602082108114156135ee576135ed6136fd565b5b50919050565b6135fd8261375b565b810181811067ffffffffffffffff8211171561361c5761361b61372c565b5b80604052505050565b600061363082613540565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136635761366261369f565b5b600182019050919050565b600061367982613540565b915061368483613540565b925082613694576136936136ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f506c6561736520696e636c756465206d696e7420666565000000000000000000600082015250565b7f546f6b656e20616c7265616479206d696e746564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613bfc81613498565b8114613c0757600080fd5b50565b613c13816134bc565b8114613c1e57600080fd5b50565b613c2a816134c8565b8114613c3557600080fd5b50565b613c41816134f4565b8114613c4c57600080fd5b50565b613c5881613540565b8114613c6357600080fd5b5056fea2646970667358221220458fe9551b5cbb688ab72a1a7f3f46bd20de60bdeed9594b186109da424f5efb64736f6c63430008030033

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

0000000000000000000000009cb2ad884820e594ecdc9bfb368bccae2476bc23000000000000000000000000a453fd30b502dba988a869b4a72b4a9e1dd33d7a

-----Decoded View---------------
Arg [0] : _feeSplitter (address): 0x9CB2aD884820e594ecdc9bFb368bccAe2476Bc23
Arg [1] : _ercRecipient (address): 0xA453Fd30B502dbA988a869B4a72B4A9e1dD33d7A

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009cb2ad884820e594ecdc9bfb368bccae2476bc23
Arg [1] : 000000000000000000000000a453fd30b502dba988a869b4a72b4a9e1dd33d7a


Deployed Bytecode Sourcemap

41386:3270:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41578:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21561:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22493:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23960:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23490:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43106:318;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24850:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44530:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43512:193;;;;;;;;;;;;;:::i;:::-;;41834:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41872:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25226:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41803:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41509:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44088:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22187:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21917:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35124:148;;;;;;;;;;;;;:::i;:::-;;41677:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34473:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22662:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42307:728;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24253:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25448:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44348:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41767:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24619:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35427:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43784:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41578:92;;;;;;;;;;;;;:::o;21561:292::-;21663:4;21702:25;21687:40;;;:11;:40;;;;:105;;;;21759:33;21744:48;;;:11;:48;;;;21687:105;:158;;;;21809:36;21833:11;21809:23;:36::i;:::-;21687:158;21680:165;;21561:292;;;:::o;22493:100::-;22547:13;22580:5;22573:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22493:100;:::o;23960:221::-;24036:7;24064:16;24072:7;24064;:16::i;:::-;24056:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24149:15;:24;24165:7;24149:24;;;;;;;;;;;;;;;;;;;;;24142:31;;23960:221;;;:::o;23490:404::-;23571:13;23587:23;23602:7;23587:14;:23::i;:::-;23571:39;;23635:5;23629:11;;:2;:11;;;;23621:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23715:5;23699:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23724:44;23748:5;23755:12;:10;:12::i;:::-;23724:23;:44::i;:::-;23699:69;23691:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;23865:21;23874:2;23878:7;23865:8;:21::i;:::-;23490:404;;;:::o;43106:318::-;43146:4;43177:3;43167:6;;:13;43163:254;;43204:10;43197:17;;;;43163:254;43246:4;43236:6;;:14;43232:185;;43274:10;43267:17;;;;43232:185;43316:5;43306:6;;:15;43302:115;;43345:10;43338:17;;;;43302:115;43395:10;43388:17;;43106:318;;:::o;24850:305::-;25011:41;25030:12;:10;:12::i;:::-;25044:7;25011:18;:41::i;:::-;25003:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25119:28;25129:4;25135:2;25139:7;25119:9;:28::i;:::-;24850:305;;;:::o;44530:121::-;34704:12;:10;:12::i;:::-;34693:23;;:7;:5;:7::i;:::-;:23;;;34685:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44629:14:::1;44613:13;:30;;;;;;;;;;;;:::i;:::-;;44530:121:::0;:::o;43512:193::-;43550:11;43564:21;43550:35;;43597:12;43614:8;;;;;;;;;;;:13;;43635:6;43614:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:50;;;43665:7;43657:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;43512:193;;:::o;41834:31::-;;;;;;;;;;;;;:::o;41872:35::-;;;;;;;;;;;;;:::o;25226:151::-;25330:39;25347:4;25353:2;25357:7;25330:39;;;;;;;;;;;;:16;:39::i;:::-;25226:151;;;:::o;41803:22::-;;;;:::o;41509:60::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44088:175::-;44188:14;44177:39;;;44225:4;44232:12;;;;;;;;;;;44246:8;44177:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44088:175;;:::o;22187:239::-;22259:7;22279:13;22295:7;:16;22303:7;22295:16;;;;;;;;;;;;;;;;;;;;;22279:32;;22347:1;22330:19;;:5;:19;;;;22322:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22413:5;22406:12;;;22187:239;;;:::o;21917:208::-;21989:7;22034:1;22017:19;;:5;:19;;;;22009:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22101:9;:16;22111:5;22101:16;;;;;;;;;;;;;;;;22094:23;;21917:208;;;:::o;35124:148::-;34704:12;:10;:12::i;:::-;34693:23;;:7;:5;:7::i;:::-;:23;;;34685:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35231:1:::1;35194:40;;35215:6;::::0;::::1;;;;;;;;35194:40;;;;;;;;;;;;35262:1;35245:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;35124:148::o:0;41677:83::-;;;;;;;;;;;;;:::o;34473:87::-;34519:7;34546:6;;;;;;;;;;;34539:13;;34473:87;:::o;22662:104::-;22718:13;22751:7;22744:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22662:104;:::o;42307:728::-;42413:9;:7;:9::i;:::-;42400;:22;;42392:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42514:21;42522:12;42514:7;:21::i;:::-;42513:22;42505:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;42573:12;42605:15;;;;;;;;;;;42588:45;;;42634:12;42588:59;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42573:74;;42658:13;42691:15;;;;;;;;;;;42674:43;;;42718:5;42674:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42658:66;;42748:14;;;;;;;;;;;42739:23;;:5;:23;;;42735:196;;;42779:12;42810:14;;;;;;;;;;;42794:47;;;42842:5;42794:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42779:69;;42887:14;;;;;;;;;;;42871:39;;;42911:7;42871:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42863:56;;42735:196;;42943:26;42949:5;42956:12;42943:5;:26::i;:::-;42990:1;42980:6;;:11;;;;;;;:::i;:::-;;;;;;;;43014:12;43007:5;43002:25;;;;;;;;;;;;42307:728;;;:::o;24253:295::-;24368:12;:10;:12::i;:::-;24356:24;;:8;:24;;;;24348:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24468:8;24423:18;:32;24442:12;:10;:12::i;:::-;24423:32;;;;;;;;;;;;;;;:42;24456:8;24423:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24521:8;24492:48;;24507:12;:10;:12::i;:::-;24492:48;;;24531:8;24492:48;;;;;;:::i;:::-;;;;;;;;24253:295;;:::o;25448:285::-;25580:41;25599:12;:10;:12::i;:::-;25613:7;25580:18;:41::i;:::-;25572:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25686:39;25700:4;25706:2;25710:7;25719:5;25686:13;:39::i;:::-;25448:285;;;;:::o;44348:174::-;44414:13;44471;44486:26;44503:8;44486:16;:26::i;:::-;44454:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44440:74;;44348:174;;;:::o;41767:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24619:164::-;24716:4;24740:18;:25;24759:5;24740:25;;;;;;;;;;;;;;;:35;24766:8;24740:35;;;;;;;;;;;;;;;;;;;;;;;;;24733:42;;24619:164;;;;:::o;35427:244::-;34704:12;:10;:12::i;:::-;34693:23;;:7;:5;:7::i;:::-;:23;;;34685:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35536:1:::1;35516:22;;:8;:22;;;;35508:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35626:8;35597:38;;35618:6;::::0;::::1;;;;;;;;35597:38;;;;;;;;;;;;35655:8;35646:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;35427:244:::0;:::o;43784:224::-;43850:18;43884:14;43850:49;;43908:14;43925:5;:15;;;43949:4;43925:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43908:47;;43964:5;:14;;;43979:12;;;;;;;;;;;43993:6;43964:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43784:224;;;:::o;20057:157::-;20142:4;20181:25;20166:40;;;:11;:40;;;;20159:47;;20057:157;;;:::o;27200:127::-;27265:4;27317:1;27289:30;;:7;:16;27297:7;27289:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27282:37;;27200:127;;;:::o;16847:98::-;16900:7;16927:10;16920:17;;16847:98;:::o;31084:174::-;31186:2;31159:15;:24;31175:7;31159:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31242:7;31238:2;31204:46;;31213:23;31228:7;31213:14;:23::i;:::-;31204:46;;;;;;;;;;;;31084:174;;:::o;27494:355::-;27587:4;27612:16;27620:7;27612;:16::i;:::-;27604:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27688:13;27704:23;27719:7;27704:14;:23::i;:::-;27688:39;;27757:5;27746:16;;:7;:16;;;:51;;;;27790:7;27766:31;;:20;27778:7;27766:11;:20::i;:::-;:31;;;27746:51;:94;;;;27801:39;27825:5;27832:7;27801:23;:39::i;:::-;27746:94;27738:103;;;27494:355;;;;:::o;30422:544::-;30547:4;30520:31;;:23;30535:7;30520:14;:23::i;:::-;:31;;;30512:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30630:1;30616:16;;:2;:16;;;;30608:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30686:39;30707:4;30713:2;30717:7;30686:20;:39::i;:::-;30790:29;30807:1;30811:7;30790:8;:29::i;:::-;30851:1;30832:9;:15;30842:4;30832:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30880:1;30863:9;:13;30873:2;30863:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30911:2;30892:7;:16;30900:7;30892:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30950:7;30946:2;30931:27;;30940:4;30931:27;;;;;;;;;;;;30422:544;;;:::o;29114:382::-;29208:1;29194:16;;:2;:16;;;;29186:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29267:16;29275:7;29267;:16::i;:::-;29266:17;29258:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29329:45;29358:1;29362:2;29366:7;29329:20;:45::i;:::-;29404:1;29387:9;:13;29397:2;29387:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29435:2;29416:7;:16;29424:7;29416:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29480:7;29476:2;29455:33;;29472:1;29455:33;;;;;;;;;;;;29114:382;;:::o;26615:272::-;26729:28;26739:4;26745:2;26749:7;26729:9;:28::i;:::-;26776:48;26799:4;26805:2;26809:7;26818:5;26776:22;:48::i;:::-;26768:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26615:272;;;;:::o;17502:723::-;17558:13;17788:1;17779:5;:10;17775:53;;;17806:10;;;;;;;;;;;;;;;;;;;;;17775:53;17838:12;17853:5;17838:20;;17869:14;17894:78;17909:1;17901:4;:9;17894:78;;17927:8;;;;;:::i;:::-;;;;17958:2;17950:10;;;;;:::i;:::-;;;17894:78;;;17982:19;18014:6;18004:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17982:39;;18032:154;18048:1;18039:5;:10;18032:154;;18076:1;18066:11;;;;;:::i;:::-;;;18143:2;18135:5;:10;;;;:::i;:::-;18122:2;:24;;;;:::i;:::-;18109:39;;18092:6;18099;18092:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18172:2;18163:11;;;;;:::i;:::-;;;18032:154;;;18210:6;18196:21;;;;;17502:723;;;;:::o;33279:93::-;;;;:::o;31823:843::-;31944:4;31970:15;:2;:13;;;:15::i;:::-;31966:693;;;32022:2;32006:36;;;32043:12;:10;:12::i;:::-;32057:4;32063:7;32072:5;32006:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32002:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32269:1;32252:6;:13;:18;32248:341;;;32295:60;;;;;;;;;;:::i;:::-;;;;;;;;32248:341;32539:6;32533:13;32524:6;32520:2;32516:15;32509:38;32002:602;32139:45;;;32129:55;;;:6;:55;;;;32122:62;;;;;31966:693;32643:4;32636:11;;31823:843;;;;;;;:::o;8964:422::-;9024:4;9232:12;9343:7;9331:20;9323:28;;9377:1;9370:4;:8;9363:15;;;8964:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1001:133::-;;1082:6;1069:20;1060:29;;1098:30;1122:5;1098:30;:::i;:::-;1050:84;;;;:::o;1140:137::-;;1225:6;1219:13;1210:22;;1241:30;1265:5;1241:30;:::i;:::-;1200:77;;;;:::o;1283:137::-;;1366:6;1353:20;1344:29;;1382:32;1408:5;1382:32;:::i;:::-;1334:86;;;;:::o;1426:141::-;;1513:6;1507:13;1498:22;;1529:32;1555:5;1529:32;:::i;:::-;1488:79;;;;:::o;1573:141::-;;1660:6;1654:13;1645:22;;1676:32;1702:5;1676:32;:::i;:::-;1635:79;;;;:::o;1733:271::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:78;1994:3;1986:6;1979:4;1971:6;1967:17;1920:78;:::i;:::-;1911:87;;1794:210;;;;;:::o;2024:273::-;;2129:3;2122:4;2114:6;2110:17;2106:27;2096:2;;2147:1;2144;2137:12;2096:2;2187:6;2174:20;2212:79;2287:3;2279:6;2272:4;2264:6;2260:17;2212:79;:::i;:::-;2203:88;;2086:211;;;;;:::o;2303:139::-;;2387:6;2374:20;2365:29;;2403:33;2430:5;2403:33;:::i;:::-;2355:87;;;;:::o;2448:143::-;;2536:6;2530:13;2521:22;;2552:33;2579:5;2552:33;:::i;:::-;2511:80;;;;:::o;2597:262::-;;2705:2;2693:9;2684:7;2680:23;2676:32;2673:2;;;2721:1;2718;2711:12;2673:2;2764:1;2789:53;2834:7;2825:6;2814:9;2810:22;2789:53;:::i;:::-;2779:63;;2735:117;2663:196;;;;:::o;2865:284::-;;2984:2;2972:9;2963:7;2959:23;2955:32;2952:2;;;3000:1;2997;2990:12;2952:2;3043:1;3068:64;3124:7;3115:6;3104:9;3100:22;3068:64;:::i;:::-;3058:74;;3014:128;2942:207;;;;:::o;3155:407::-;;;3280:2;3268:9;3259:7;3255:23;3251:32;3248:2;;;3296:1;3293;3286:12;3248:2;3339:1;3364:53;3409:7;3400:6;3389:9;3385:22;3364:53;:::i;:::-;3354:63;;3310:117;3466:2;3492:53;3537:7;3528:6;3517:9;3513:22;3492:53;:::i;:::-;3482:63;;3437:118;3238:324;;;;;:::o;3568:552::-;;;;3710:2;3698:9;3689:7;3685:23;3681:32;3678:2;;;3726:1;3723;3716:12;3678:2;3769:1;3794:53;3839:7;3830:6;3819:9;3815:22;3794:53;:::i;:::-;3784:63;;3740:117;3896:2;3922:53;3967:7;3958:6;3947:9;3943:22;3922:53;:::i;:::-;3912:63;;3867:118;4024:2;4050:53;4095:7;4086:6;4075:9;4071:22;4050:53;:::i;:::-;4040:63;;3995:118;3668:452;;;;;:::o;4126:809::-;;;;;4294:3;4282:9;4273:7;4269:23;4265:33;4262:2;;;4311:1;4308;4301:12;4262:2;4354:1;4379:53;4424:7;4415:6;4404:9;4400:22;4379:53;:::i;:::-;4369:63;;4325:117;4481:2;4507:53;4552:7;4543:6;4532:9;4528:22;4507:53;:::i;:::-;4497:63;;4452:118;4609:2;4635:53;4680:7;4671:6;4660:9;4656:22;4635:53;:::i;:::-;4625:63;;4580:118;4765:2;4754:9;4750:18;4737:32;4796:18;4788:6;4785:30;4782:2;;;4828:1;4825;4818:12;4782:2;4856:62;4910:7;4901:6;4890:9;4886:22;4856:62;:::i;:::-;4846:72;;4708:220;4252:683;;;;;;;:::o;4941:401::-;;;5063:2;5051:9;5042:7;5038:23;5034:32;5031:2;;;5079:1;5076;5069:12;5031:2;5122:1;5147:53;5192:7;5183:6;5172:9;5168:22;5147:53;:::i;:::-;5137:63;;5093:117;5249:2;5275:50;5317:7;5308:6;5297:9;5293:22;5275:50;:::i;:::-;5265:60;;5220:115;5021:321;;;;;:::o;5348:407::-;;;5473:2;5461:9;5452:7;5448:23;5444:32;5441:2;;;5489:1;5486;5479:12;5441:2;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5431:324;;;;;:::o;5761:278::-;;5877:2;5865:9;5856:7;5852:23;5848:32;5845:2;;;5893:1;5890;5883:12;5845:2;5936:1;5961:61;6014:7;6005:6;5994:9;5990:22;5961:61;:::i;:::-;5951:71;;5907:125;5835:204;;;;:::o;6045:260::-;;6152:2;6140:9;6131:7;6127:23;6123:32;6120:2;;;6168:1;6165;6158:12;6120:2;6211:1;6236:52;6280:7;6271:6;6260:9;6256:22;6236:52;:::i;:::-;6226:62;;6182:116;6110:195;;;;:::o;6311:282::-;;6429:2;6417:9;6408:7;6404:23;6400:32;6397:2;;;6445:1;6442;6435:12;6397:2;6488:1;6513:63;6568:7;6559:6;6548:9;6544:22;6513:63;:::i;:::-;6503:73;;6459:127;6387:206;;;;:::o;6599:282::-;;6717:2;6705:9;6696:7;6692:23;6688:32;6685:2;;;6733:1;6730;6723:12;6685:2;6776:1;6801:63;6856:7;6847:6;6836:9;6832:22;6801:63;:::i;:::-;6791:73;;6747:127;6675:206;;;;:::o;6887:375::-;;7005:2;6993:9;6984:7;6980:23;6976:32;6973:2;;;7021:1;7018;7011:12;6973:2;7092:1;7081:9;7077:17;7064:31;7122:18;7114:6;7111:30;7108:2;;;7154:1;7151;7144:12;7108:2;7182:63;7237:7;7228:6;7217:9;7213:22;7182:63;:::i;:::-;7172:73;;7035:220;6963:299;;;;:::o;7268:262::-;;7376:2;7364:9;7355:7;7351:23;7347:32;7344:2;;;7392:1;7389;7382:12;7344:2;7435:1;7460:53;7505:7;7496:6;7485:9;7481:22;7460:53;:::i;:::-;7450:63;;7406:117;7334:196;;;;:::o;7536:284::-;;7655:2;7643:9;7634:7;7630:23;7626:32;7623:2;;;7671:1;7668;7661:12;7623:2;7714:1;7739:64;7795:7;7786:6;7775:9;7771:22;7739:64;:::i;:::-;7729:74;;7685:128;7613:207;;;;:::o;7826:147::-;7921:45;7960:5;7921:45;:::i;:::-;7916:3;7909:58;7899:74;;:::o;7979:142::-;8082:32;8108:5;8082:32;:::i;:::-;8077:3;8070:45;8060:61;;:::o;8127:118::-;8214:24;8232:5;8214:24;:::i;:::-;8209:3;8202:37;8192:53;;:::o;8251:109::-;8332:21;8347:5;8332:21;:::i;:::-;8327:3;8320:34;8310:50;;:::o;8366:115::-;8451:23;8468:5;8451:23;:::i;:::-;8446:3;8439:36;8429:52;;:::o;8487:360::-;;8601:38;8633:5;8601:38;:::i;:::-;8655:70;8718:6;8713:3;8655:70;:::i;:::-;8648:77;;8734:52;8779:6;8774:3;8767:4;8760:5;8756:16;8734:52;:::i;:::-;8811:29;8833:6;8811:29;:::i;:::-;8806:3;8802:39;8795:46;;8577:270;;;;;:::o;8853:364::-;;8969:39;9002:5;8969:39;:::i;:::-;9024:71;9088:6;9083:3;9024:71;:::i;:::-;9017:78;;9104:52;9149:6;9144:3;9137:4;9130:5;9126:16;9104:52;:::i;:::-;9181:29;9203:6;9181:29;:::i;:::-;9176:3;9172:39;9165:46;;8945:272;;;;;:::o;9223:377::-;;9357:39;9390:5;9357:39;:::i;:::-;9412:89;9494:6;9489:3;9412:89;:::i;:::-;9405:96;;9510:52;9555:6;9550:3;9543:4;9536:5;9532:16;9510:52;:::i;:::-;9587:6;9582:3;9578:16;9571:23;;9333:267;;;;;:::o;9630:845::-;;9770:5;9764:12;9799:36;9825:9;9799:36;:::i;:::-;9851:89;9933:6;9928:3;9851:89;:::i;:::-;9844:96;;9971:1;9960:9;9956:17;9987:1;9982:137;;;;10133:1;10128:341;;;;9949:520;;9982:137;10066:4;10062:9;10051;10047:25;10042:3;10035:38;10102:6;10097:3;10093:16;10086:23;;9982:137;;10128:341;10195:38;10227:5;10195:38;:::i;:::-;10255:1;10269:154;10283:6;10280:1;10277:13;10269:154;;;10357:7;10351:14;10347:1;10342:3;10338:11;10331:35;10407:1;10398:7;10394:15;10383:26;;10305:4;10302:1;10298:12;10293:17;;10269:154;;;10452:6;10447:3;10443:16;10436:23;;10135:334;;9949:520;;9737:738;;;;;;:::o;10481:366::-;;10644:67;10708:2;10703:3;10644:67;:::i;:::-;10637:74;;10720:93;10809:3;10720:93;:::i;:::-;10838:2;10833:3;10829:12;10822:19;;10627:220;;;:::o;10853:366::-;;11016:67;11080:2;11075:3;11016:67;:::i;:::-;11009:74;;11092:93;11181:3;11092:93;:::i;:::-;11210:2;11205:3;11201:12;11194:19;;10999:220;;;:::o;11225:366::-;;11388:67;11452:2;11447:3;11388:67;:::i;:::-;11381:74;;11464:93;11553:3;11464:93;:::i;:::-;11582:2;11577:3;11573:12;11566:19;;11371:220;;;:::o;11597:366::-;;11760:67;11824:2;11819:3;11760:67;:::i;:::-;11753:74;;11836:93;11925:3;11836:93;:::i;:::-;11954:2;11949:3;11945:12;11938:19;;11743:220;;;:::o;11969:366::-;;12132:67;12196:2;12191:3;12132:67;:::i;:::-;12125:74;;12208:93;12297:3;12208:93;:::i;:::-;12326:2;12321:3;12317:12;12310:19;;12115:220;;;:::o;12341:366::-;;12504:67;12568:2;12563:3;12504:67;:::i;:::-;12497:74;;12580:93;12669:3;12580:93;:::i;:::-;12698:2;12693:3;12689:12;12682:19;;12487:220;;;:::o;12713:366::-;;12876:67;12940:2;12935:3;12876:67;:::i;:::-;12869:74;;12952:93;13041:3;12952:93;:::i;:::-;13070:2;13065:3;13061:12;13054:19;;12859:220;;;:::o;13085:366::-;;13248:67;13312:2;13307:3;13248:67;:::i;:::-;13241:74;;13324:93;13413:3;13324:93;:::i;:::-;13442:2;13437:3;13433:12;13426:19;;13231:220;;;:::o;13457:366::-;;13620:67;13684:2;13679:3;13620:67;:::i;:::-;13613:74;;13696:93;13785:3;13696:93;:::i;:::-;13814:2;13809:3;13805:12;13798:19;;13603:220;;;:::o;13829:366::-;;13992:67;14056:2;14051:3;13992:67;:::i;:::-;13985:74;;14068:93;14157:3;14068:93;:::i;:::-;14186:2;14181:3;14177:12;14170:19;;13975:220;;;:::o;14201:366::-;;14364:67;14428:2;14423:3;14364:67;:::i;:::-;14357:74;;14440:93;14529:3;14440:93;:::i;:::-;14558:2;14553:3;14549:12;14542:19;;14347:220;;;:::o;14573:366::-;;14736:67;14800:2;14795:3;14736:67;:::i;:::-;14729:74;;14812:93;14901:3;14812:93;:::i;:::-;14930:2;14925:3;14921:12;14914:19;;14719:220;;;:::o;14945:366::-;;15108:67;15172:2;15167:3;15108:67;:::i;:::-;15101:74;;15184:93;15273:3;15184:93;:::i;:::-;15302:2;15297:3;15293:12;15286:19;;15091:220;;;:::o;15317:366::-;;15480:67;15544:2;15539:3;15480:67;:::i;:::-;15473:74;;15556:93;15645:3;15556:93;:::i;:::-;15674:2;15669:3;15665:12;15658:19;;15463:220;;;:::o;15689:366::-;;15852:67;15916:2;15911:3;15852:67;:::i;:::-;15845:74;;15928:93;16017:3;15928:93;:::i;:::-;16046:2;16041:3;16037:12;16030:19;;15835:220;;;:::o;16061:366::-;;16224:67;16288:2;16283:3;16224:67;:::i;:::-;16217:74;;16300:93;16389:3;16300:93;:::i;:::-;16418:2;16413:3;16409:12;16402:19;;16207:220;;;:::o;16433:366::-;;16596:67;16660:2;16655:3;16596:67;:::i;:::-;16589:74;;16672:93;16761:3;16672:93;:::i;:::-;16790:2;16785:3;16781:12;16774:19;;16579:220;;;:::o;16805:398::-;;16985:83;17066:1;17061:3;16985:83;:::i;:::-;16978:90;;17077:93;17166:3;17077:93;:::i;:::-;17195:1;17190:3;17186:11;17179:18;;16968:235;;;:::o;17209:366::-;;17372:67;17436:2;17431:3;17372:67;:::i;:::-;17365:74;;17448:93;17537:3;17448:93;:::i;:::-;17566:2;17561:3;17557:12;17550:19;;17355:220;;;:::o;17581:118::-;17668:24;17686:5;17668:24;:::i;:::-;17663:3;17656:37;17646:53;;:::o;17705:429::-;;17904:92;17992:3;17983:6;17904:92;:::i;:::-;17897:99;;18013:95;18104:3;18095:6;18013:95;:::i;:::-;18006:102;;18125:3;18118:10;;17886:248;;;;;:::o;18140:379::-;;18346:147;18489:3;18346:147;:::i;:::-;18339:154;;18510:3;18503:10;;18328:191;;;:::o;18525:222::-;;18656:2;18645:9;18641:18;18633:26;;18669:71;18737:1;18726:9;18722:17;18713:6;18669:71;:::i;:::-;18623:124;;;;:::o;18753:254::-;;18900:2;18889:9;18885:18;18877:26;;18913:87;18997:1;18986:9;18982:17;18973:6;18913:87;:::i;:::-;18867:140;;;;:::o;19013:348::-;;19180:2;19169:9;19165:18;19157:26;;19193:79;19269:1;19258:9;19254:17;19245:6;19193:79;:::i;:::-;19282:72;19350:2;19339:9;19335:18;19326:6;19282:72;:::i;:::-;19147:214;;;;;:::o;19367:458::-;;19562:2;19551:9;19547:18;19539:26;;19575:71;19643:1;19632:9;19628:17;19619:6;19575:71;:::i;:::-;19656:80;19732:2;19721:9;19717:18;19708:6;19656:80;:::i;:::-;19746:72;19814:2;19803:9;19799:18;19790:6;19746:72;:::i;:::-;19529:296;;;;;;:::o;19831:640::-;;20064:3;20053:9;20049:19;20041:27;;20078:71;20146:1;20135:9;20131:17;20122:6;20078:71;:::i;:::-;20159:72;20227:2;20216:9;20212:18;20203:6;20159:72;:::i;:::-;20241;20309:2;20298:9;20294:18;20285:6;20241:72;:::i;:::-;20360:9;20354:4;20350:20;20345:2;20334:9;20330:18;20323:48;20388:76;20459:4;20450:6;20388:76;:::i;:::-;20380:84;;20031:440;;;;;;;:::o;20477:210::-;;20602:2;20591:9;20587:18;20579:26;;20615:65;20677:1;20666:9;20662:17;20653:6;20615:65;:::i;:::-;20569:118;;;;:::o;20693:218::-;;20822:2;20811:9;20807:18;20799:26;;20835:69;20901:1;20890:9;20886:17;20877:6;20835:69;:::i;:::-;20789:122;;;;:::o;20917:313::-;;21068:2;21057:9;21053:18;21045:26;;21117:9;21111:4;21107:20;21103:1;21092:9;21088:17;21081:47;21145:78;21218:4;21209:6;21145:78;:::i;:::-;21137:86;;21035:195;;;;:::o;21236:419::-;;21440:2;21429:9;21425:18;21417:26;;21489:9;21483:4;21479:20;21475:1;21464:9;21460:17;21453:47;21517:131;21643:4;21517:131;:::i;:::-;21509:139;;21407:248;;;:::o;21661:419::-;;21865:2;21854:9;21850:18;21842:26;;21914:9;21908:4;21904:20;21900:1;21889:9;21885:17;21878:47;21942:131;22068:4;21942:131;:::i;:::-;21934:139;;21832:248;;;:::o;22086:419::-;;22290:2;22279:9;22275:18;22267:26;;22339:9;22333:4;22329:20;22325:1;22314:9;22310:17;22303:47;22367:131;22493:4;22367:131;:::i;:::-;22359:139;;22257:248;;;:::o;22511:419::-;;22715:2;22704:9;22700:18;22692:26;;22764:9;22758:4;22754:20;22750:1;22739:9;22735:17;22728:47;22792:131;22918:4;22792:131;:::i;:::-;22784:139;;22682:248;;;:::o;22936:419::-;;23140:2;23129:9;23125:18;23117:26;;23189:9;23183:4;23179:20;23175:1;23164:9;23160:17;23153:47;23217:131;23343:4;23217:131;:::i;:::-;23209:139;;23107:248;;;:::o;23361:419::-;;23565:2;23554:9;23550:18;23542:26;;23614:9;23608:4;23604:20;23600:1;23589:9;23585:17;23578:47;23642:131;23768:4;23642:131;:::i;:::-;23634:139;;23532:248;;;:::o;23786:419::-;;23990:2;23979:9;23975:18;23967:26;;24039:9;24033:4;24029:20;24025:1;24014:9;24010:17;24003:47;24067:131;24193:4;24067:131;:::i;:::-;24059:139;;23957:248;;;:::o;24211:419::-;;24415:2;24404:9;24400:18;24392:26;;24464:9;24458:4;24454:20;24450:1;24439:9;24435:17;24428:47;24492:131;24618:4;24492:131;:::i;:::-;24484:139;;24382:248;;;:::o;24636:419::-;;24840:2;24829:9;24825:18;24817:26;;24889:9;24883:4;24879:20;24875:1;24864:9;24860:17;24853:47;24917:131;25043:4;24917:131;:::i;:::-;24909:139;;24807:248;;;:::o;25061:419::-;;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:131;25468:4;25342:131;:::i;:::-;25334:139;;25232:248;;;:::o;25486:419::-;;25690:2;25679:9;25675:18;25667:26;;25739:9;25733:4;25729:20;25725:1;25714:9;25710:17;25703:47;25767:131;25893:4;25767:131;:::i;:::-;25759:139;;25657:248;;;:::o;25911:419::-;;26115:2;26104:9;26100:18;26092:26;;26164:9;26158:4;26154:20;26150:1;26139:9;26135:17;26128:47;26192:131;26318:4;26192:131;:::i;:::-;26184:139;;26082:248;;;:::o;26336:419::-;;26540:2;26529:9;26525:18;26517:26;;26589:9;26583:4;26579:20;26575:1;26564:9;26560:17;26553:47;26617:131;26743:4;26617:131;:::i;:::-;26609:139;;26507:248;;;:::o;26761:419::-;;26965:2;26954:9;26950:18;26942:26;;27014:9;27008:4;27004:20;27000:1;26989:9;26985:17;26978:47;27042:131;27168:4;27042:131;:::i;:::-;27034:139;;26932:248;;;:::o;27186:419::-;;27390:2;27379:9;27375:18;27367:26;;27439:9;27433:4;27429:20;27425:1;27414:9;27410:17;27403:47;27467:131;27593:4;27467:131;:::i;:::-;27459:139;;27357:248;;;:::o;27611:419::-;;27815:2;27804:9;27800:18;27792:26;;27864:9;27858:4;27854:20;27850:1;27839:9;27835:17;27828:47;27892:131;28018:4;27892:131;:::i;:::-;27884:139;;27782:248;;;:::o;28036:419::-;;28240:2;28229:9;28225:18;28217:26;;28289:9;28283:4;28279:20;28275:1;28264:9;28260:17;28253:47;28317:131;28443:4;28317:131;:::i;:::-;28309:139;;28207:248;;;:::o;28461:419::-;;28665:2;28654:9;28650:18;28642:26;;28714:9;28708:4;28704:20;28700:1;28689:9;28685:17;28678:47;28742:131;28868:4;28742:131;:::i;:::-;28734:139;;28632:248;;;:::o;28886:222::-;;29017:2;29006:9;29002:18;28994:26;;29030:71;29098:1;29087:9;29083:17;29074:6;29030:71;:::i;:::-;28984:124;;;;:::o;29114:129::-;;29175:20;;:::i;:::-;29165:30;;29204:33;29232:4;29224:6;29204:33;:::i;:::-;29155:88;;;:::o;29249:75::-;;29315:2;29309:9;29299:19;;29289:35;:::o;29330:307::-;;29481:18;29473:6;29470:30;29467:2;;;29503:18;;:::i;:::-;29467:2;29541:29;29563:6;29541:29;:::i;:::-;29533:37;;29625:4;29619;29615:15;29607:23;;29396:241;;;:::o;29643:308::-;;29795:18;29787:6;29784:30;29781:2;;;29817:18;;:::i;:::-;29781:2;29855:29;29877:6;29855:29;:::i;:::-;29847:37;;29939:4;29933;29929:15;29921:23;;29710:241;;;:::o;29957:141::-;;30029:3;30021:11;;30052:3;30049:1;30042:14;30086:4;30083:1;30073:18;30065:26;;30011:87;;;:::o;30104:98::-;;30189:5;30183:12;30173:22;;30162:40;;;:::o;30208:99::-;;30294:5;30288:12;30278:22;;30267:40;;;:::o;30313:168::-;;30430:6;30425:3;30418:19;30470:4;30465:3;30461:14;30446:29;;30408:73;;;;:::o;30487:147::-;;30625:3;30610:18;;30600:34;;;;:::o;30640:169::-;;30758:6;30753:3;30746:19;30798:4;30793:3;30789:14;30774:29;;30736:73;;;;:::o;30815:148::-;;30954:3;30939:18;;30929:34;;;;:::o;30969:305::-;;31028:20;31046:1;31028:20;:::i;:::-;31023:25;;31062:20;31080:1;31062:20;:::i;:::-;31057:25;;31216:1;31148:66;31144:74;31141:1;31138:81;31135:2;;;31222:18;;:::i;:::-;31135:2;31266:1;31263;31259:9;31252:16;;31013:261;;;;:::o;31280:185::-;;31337:20;31355:1;31337:20;:::i;:::-;31332:25;;31371:20;31389:1;31371:20;:::i;:::-;31366:25;;31410:1;31400:2;;31415:18;;:::i;:::-;31400:2;31457:1;31454;31450:9;31445:14;;31322:143;;;;:::o;31471:191::-;;31531:20;31549:1;31531:20;:::i;:::-;31526:25;;31565:20;31583:1;31565:20;:::i;:::-;31560:25;;31604:1;31601;31598:8;31595:2;;;31609:18;;:::i;:::-;31595:2;31654:1;31651;31647:9;31639:17;;31516:146;;;;:::o;31668:96::-;;31734:24;31752:5;31734:24;:::i;:::-;31723:35;;31713:51;;;:::o;31770:104::-;;31844:24;31862:5;31844:24;:::i;:::-;31833:35;;31823:51;;;:::o;31880:90::-;;31957:5;31950:13;31943:21;31932:32;;31922:48;;;:::o;31976:149::-;;32052:66;32045:5;32041:78;32030:89;;32020:105;;;:::o;32131:149::-;;32207:66;32200:5;32196:78;32185:89;;32175:105;;;:::o;32286:126::-;;32363:42;32356:5;32352:54;32341:65;;32331:81;;;:::o;32418:77::-;;32484:5;32473:16;;32463:32;;;:::o;32501:134::-;;32592:37;32623:5;32592:37;:::i;:::-;32579:50;;32569:66;;;:::o;32641:126::-;;32724:37;32755:5;32724:37;:::i;:::-;32711:50;;32701:66;;;:::o;32773:113::-;;32856:24;32874:5;32856:24;:::i;:::-;32843:37;;32833:53;;;:::o;32892:154::-;32976:6;32971:3;32966;32953:30;33038:1;33029:6;33024:3;33020:16;33013:27;32943:103;;;:::o;33052:307::-;33120:1;33130:113;33144:6;33141:1;33138:13;33130:113;;;33229:1;33224:3;33220:11;33214:18;33210:1;33205:3;33201:11;33194:39;33166:2;33163:1;33159:10;33154:15;;33130:113;;;33261:6;33258:1;33255:13;33252:2;;;33341:1;33332:6;33327:3;33323:16;33316:27;33252:2;33101:258;;;;:::o;33365:320::-;;33446:1;33440:4;33436:12;33426:22;;33493:1;33487:4;33483:12;33514:18;33504:2;;33570:4;33562:6;33558:17;33548:27;;33504:2;33632;33624:6;33621:14;33601:18;33598:38;33595:2;;;33651:18;;:::i;:::-;33595:2;33416:269;;;;:::o;33691:281::-;33774:27;33796:4;33774:27;:::i;:::-;33766:6;33762:40;33904:6;33892:10;33889:22;33868:18;33856:10;33853:34;33850:62;33847:2;;;33915:18;;:::i;:::-;33847:2;33955:10;33951:2;33944:22;33734:238;;;:::o;33978:233::-;;34040:24;34058:5;34040:24;:::i;:::-;34031:33;;34086:66;34079:5;34076:77;34073:2;;;34156:18;;:::i;:::-;34073:2;34203:1;34196:5;34192:13;34185:20;;34021:190;;;:::o;34217:176::-;;34266:20;34284:1;34266:20;:::i;:::-;34261:25;;34300:20;34318:1;34300:20;:::i;:::-;34295:25;;34339:1;34329:2;;34344:18;;:::i;:::-;34329:2;34385:1;34382;34378:9;34373:14;;34251:142;;;;:::o;34399:180::-;34447:77;34444:1;34437:88;34544:4;34541:1;34534:15;34568:4;34565:1;34558:15;34585:180;34633:77;34630:1;34623:88;34730:4;34727:1;34720:15;34754:4;34751:1;34744:15;34771:180;34819:77;34816:1;34809:88;34916:4;34913:1;34906:15;34940:4;34937:1;34930:15;34957:180;35005:77;35002:1;34995:88;35102:4;35099:1;35092:15;35126:4;35123:1;35116:15;35143:102;;35235:2;35231:7;35226:2;35219:5;35215:14;35211:28;35201:38;;35191:54;;;:::o;35251:173::-;35391:25;35387:1;35379:6;35375:14;35368:49;35357:67;:::o;35430:170::-;35570:22;35566:1;35558:6;35554:14;35547:46;35536:64;:::o;35606:237::-;35746:34;35742:1;35734:6;35730:14;35723:58;35815:20;35810:2;35802:6;35798:15;35791:45;35712:131;:::o;35849:225::-;35989:34;35985:1;35977:6;35973:14;35966:58;36058:8;36053:2;36045:6;36041:15;36034:33;35955:119;:::o;36080:178::-;36220:30;36216:1;36208:6;36204:14;36197:54;36186:72;:::o;36264:223::-;36404:34;36400:1;36392:6;36388:14;36381:58;36473:6;36468:2;36460:6;36456:15;36449:31;36370:117;:::o;36493:175::-;36633:27;36629:1;36621:6;36617:14;36610:51;36599:69;:::o;36674:231::-;36814:34;36810:1;36802:6;36798:14;36791:58;36883:14;36878:2;36870:6;36866:15;36859:39;36780:125;:::o;36911:243::-;37051:34;37047:1;37039:6;37035:14;37028:58;37120:26;37115:2;37107:6;37103:15;37096:51;37017:137;:::o;37160:229::-;37300:34;37296:1;37288:6;37284:14;37277:58;37369:12;37364:2;37356:6;37352:15;37345:37;37266:123;:::o;37395:228::-;37535:34;37531:1;37523:6;37519:14;37512:58;37604:11;37599:2;37591:6;37587:15;37580:36;37501:122;:::o;37629:182::-;37769:34;37765:1;37757:6;37753:14;37746:58;37735:76;:::o;37817:231::-;37957:34;37953:1;37945:6;37941:14;37934:58;38026:14;38021:2;38013:6;38009:15;38002:39;37923:125;:::o;38054:182::-;38194:34;38190:1;38182:6;38178:14;38171:58;38160:76;:::o;38242:170::-;38382:22;38378:1;38370:6;38366:14;38359:46;38348:64;:::o;38418:228::-;38558:34;38554:1;38546:6;38542:14;38535:58;38627:11;38622:2;38614:6;38610:15;38603:36;38524:122;:::o;38652:220::-;38792:34;38788:1;38780:6;38776:14;38769:58;38861:3;38856:2;38848:6;38844:15;38837:28;38758:114;:::o;38878:::-;38984:8;:::o;38998:236::-;39138:34;39134:1;39126:6;39122:14;39115:58;39207:19;39202:2;39194:6;39190:15;39183:44;39104:130;:::o;39240:122::-;39313:24;39331:5;39313:24;:::i;:::-;39306:5;39303:35;39293:2;;39352:1;39349;39342:12;39293:2;39283:79;:::o;39368:116::-;39438:21;39453:5;39438:21;:::i;:::-;39431:5;39428:32;39418:2;;39474:1;39471;39464:12;39418:2;39408:76;:::o;39490:120::-;39562:23;39579:5;39562:23;:::i;:::-;39555:5;39552:34;39542:2;;39600:1;39597;39590:12;39542:2;39532:78;:::o;39616:120::-;39688:23;39705:5;39688:23;:::i;:::-;39681:5;39678:34;39668:2;;39726:1;39723;39716:12;39668:2;39658:78;:::o;39742:122::-;39815:24;39833:5;39815:24;:::i;:::-;39808:5;39805:35;39795:2;;39854:1;39851;39844:12;39795:2;39785:79;:::o

Swarm Source

ipfs://458fe9551b5cbb688ab72a1a7f3f46bd20de60bdeed9594b186109da424f5efb
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.