ETH Price: $3,482.25 (+1.98%)

Token

NFTCCTiger (NFTCCT)
 

Overview

Max Total Supply

840 NFTCCT

Holders

175

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
newworldip.eth
Balance
1 NFTCCT
0xAAbd9a88bB2d21b72420572007ea8784C5124809
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:
Ccnft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-24
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/ccnft.sol


pragma solidity 0.8.7;







/**
ERROR TABLE (saves gas and contract size)
    ER1:    Ownable: caller is not the owner
    ER2: "Ownable: new owner is the zero address"
    ER3: "Address: insufficient balance"
    ER4: "Address: unable to send value, recipient may have reverted"
    ER5: "Address: low-level call failed"
    ER6: "Address: low-level call with value failed"
    ER7: "Address: insufficient balance for call"
    ER8: "Address: call to non-contract"
    ER9: "Address: low-level static call failed"
    ER10: "Address: static call to non-contract"
    ER11: "Address: low-level delegate call failed"
    ER12: "Address: delegate call to non-contract"
    ER13: "Strings: hex length insufficient"
    ER14: "ERC721: balance query for the zero address"
    ER15: "ERC721: owner query for nonexistent token"
    ER16: ERC721Metadata: URI query for nonexistent token
    ER17: ERC721: approval to current owner
    ER18: ERC721: approve caller is not owner nor approved for all
    ER19: ERC721: approved query for nonexistent token
    ER20: ERC721: approve to caller
    ER21: ERC721: transfer caller is not owner nor approved
    ER22: ERC721: transfer caller is not owner nor approved
    ER23: ERC721: transfer to non ERC721Receiver implementer
    ER24: ERC721: operator query for nonexistent token
    ER25: ERC721: transfer to non ERC721Receiver implementer
    ER26: ERC721: mint to the zero address
    ER27: ERC721: token already minted
    ER28: ERC721: transfer of token that is not own
    ER29: ERC721: transfer to the zero address
    ER30: ERC721: transfer to non ERC721Receiver implementer
    ER31: ERC721Enumerable: owner index out of bounds
    ER32: ERC721Enumerable: global index out of bounds
    ER33: insufficient funds
    ER34: XMartianNFT: checkMintQty() Exceeds Max Mint QTY
    ER35: the contract is paused
    ER36: max NFT limit exceeded for collection
    ER37: max NFT limit exceeded for collection
    ER38: max NFT limit exceeded
    ER39: ERC721Metadata: URI query for nonexistent token
*/




contract Ccnft is ERC721Enumerable, Ownable {
    using Strings for uint256;


    uint16 public maxMintQty = 200;
    uint16 public constant MAX_SUPPLY = 2_500;
    bool public autoFloor = true;
    bool public paused = true;

    string public baseExtension = ".json";
    string public placeHolderURL;
    string[] public baseURIs;

    mapping(uint8 => uint32) public currentSubCollectionSupply;
    mapping(uint8 => uint256) public cost;

    mapping(uint8 => uint16) public maxSubCollectionMints;
    mapping(uint256 => uint8) public addressUrlType;
    mapping(uint256 => uint256) public urlToId;
    mapping(uint256 => string) public idUrlCustom;

    // USAGE: customMintables[address] = customMintableNFTS
    mapping(address => uint8) public customMintables;

    // USAGE: giveAwayAllowance[subCollectionNumber][address] = number address can claim
    mapping(uint8 => mapping(address => uint8)) public giveAwayAllowance;
    // USAGE: remainingReserved[subCollectionNumber] = number of remaining items reserved for presale addresses
    mapping(uint8 => uint16) public remainingReserved;
    // USAGE: holderReservedCount[subCollectionNumber][address] = number of reserved items for address
    mapping(uint8 => mapping(address => uint16)) public holderReservedCount;

    function batchAddCustomMintables(
        address[] memory addr,
        uint8[] memory count
    ) external onlyOwner {
        _iterateBatchAddCustomMintables(addr, count);
    }

    function _iterateBatchAddCustomMintables(
        address[] memory addr,
        uint8[] memory count
    ) internal {
        for (uint16 i = 0; i < addr.length; i++) {
            customMintables[addr[i]] = count[i];
        }
    }

    function batchAddGiveAwayAllowance(
        address[] memory addr,
        uint8[] memory count,
        uint8[] memory collectionNumber
    ) external onlyOwner {

        _iterateBatchAddToGiveAway(addr,count,collectionNumber);
    }

    function _iterateBatchAddToGiveAway(
        address[] memory addr,
        uint8[] memory count,
        uint8[] memory collectionNumber
    ) internal {
        for (uint16 i = 0; i < addr.length; i++) {
            giveAwayAllowance[collectionNumber[i]][addr[i]] = count[i];
        }
    }

    function batchAddHolderReservedCount(
        address[] memory addr,
        uint8[] memory count,
        uint8[] memory collectionNumber
    ) external onlyOwner {
    
        _iterateBatchAddHolderReservedCount(addr,count,collectionNumber);
    }

    function _iterateBatchAddHolderReservedCount(
        address[] memory addr,
        uint8[] memory count,
        uint8[] memory collectionNumber
    ) internal {
        for (uint16 i = 0; i < addr.length; i++) {
            holderReservedCount[collectionNumber[i]][addr[i]] = count[i];
            remainingReserved[collectionNumber[i]] = remainingReserved[collectionNumber[i]] + count[i];
        }
    }

    constructor(
        string memory _name,
        string memory _symbol,
        string[] memory _initBaseURIs,
        string memory _placeHolderURL,
        address[] memory payees,
         uint256[] memory shares_
    ) ERC721(_name, _symbol) {
        setBaseURIs(_initBaseURIs);
        placeHolderURL = _placeHolderURL;

        cost[0] = 75000000000000000 ;

        maxSubCollectionMints[0] = 2500;

        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

  // internal
    function _baseURIs() public view virtual returns (string[] memory) {
        return baseURIs;
    }

    function mint1(uint8 mintQty) public payable { _iterateMint(0, mintQty); }

    // public
    function _iterateMint(uint8 subCollection, uint8 mintQty) internal {
        checkPaused();
        checkMintQty(mintQty, maxMintQty);
        uint256 _afterMintSupply = totalSupply() + mintQty;
        checkMaxSupply(_afterMintSupply);
        checkSupplyAndReserved(subCollection, mintQty);
    // if the msgSender has a free giveaway allowance
        if(mintQty <= giveAwayAllowance[subCollection][_msgSender()]){
            // subtract mint qty from giveAway allowance
            giveAwayAllowance[subCollection][_msgSender()] = mintQty;
        } else {
            checkTxCost(msg.value, (cost[subCollection] * mintQty));
        }
        for (uint256 i; i < mintQty; i++) {
            _mintTx(subCollection);
        }
    }

    function getTxCost(uint8 subCollection, uint8 mintQty) public view returns (uint256 value){
        if(mintQty <= giveAwayAllowance[subCollection][_msgSender()]){
            return 0;
        } else {
            return (cost[subCollection] * mintQty);
        }
    }


    function _mintTx(uint8 subCollection) internal {
        uint256 tokenId = totalSupply() + 1;
        addressUrlType[tokenId] = subCollection;
        currentSubCollectionSupply[subCollection]++;
        urlToId[tokenId] = currentSubCollectionSupply[subCollection];
        _safeMint(_msgSender(), tokenId);
    }


    function _mintCustom() internal {
        checkPaused();
        if(customMintables[_msgSender()] > 0 || _msgSender() == owner()){
            if (_msgSender() != owner()) {
                customMintables[_msgSender()]--;
                require(msg.value >= cost[4] , "insufficient funds");
            }
            uint256 tokenId = totalSupply() + 1;
            currentSubCollectionSupply[4]++;
            addressUrlType[tokenId] = 4;
            _safeMint(_msgSender(), tokenId);
            idUrlCustom[tokenId] = placeHolderURL;
        }
    }


    function _setPrice(
        uint256 costSubCol0

    ) internal {
        cost[0] = costSubCol0;
     }

    function setPrice(
        uint256 Mint1Cost_
    ) external onlyOwner {
        cost[0] = Mint1Cost_;
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
          tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ER39"
        );

        string[] memory currentBaseURI = _baseURIs();
        if (addressUrlType[tokenId] == 4) {
            return bytes(idUrlCustom[tokenId]).length > 0
                ? string(abi.encodePacked(idUrlCustom[tokenId], baseExtension))
                : "";
        } else {
            return bytes(currentBaseURI[addressUrlType[tokenId]]).length > 0
                ? string(abi.encodePacked(currentBaseURI[addressUrlType[tokenId]], urlToId[tokenId].toString(), baseExtension))
                : "";
        }
    }

    //only owner
    function togglePaused() external onlyOwner {
        paused?
        paused = false:
        paused = true;
    }

    function toggleAutoFloor() external onlyOwner {
        autoFloor?
        autoFloor = false:
        autoFloor = true;
    }

    function setBaseURIs(string[] memory _newBaseURIs) public onlyOwner {baseURIs = _newBaseURIs;}
    function setMaxMintQty(uint16 new_maxMintQty) public onlyOwner {maxMintQty = new_maxMintQty;}
    function setCustomUrl(uint256 tokenId, string memory newUrl) public onlyOwner  {idUrlCustom[tokenId] = newUrl;}
    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {baseExtension = _newBaseExtension;}

    // check functions with Revert statements
    function checkMaxSupply(uint256 afterMintSupply_) internal pure {
        require(afterMintSupply_ <= MAX_SUPPLY, "ER38");
    }

    function checkSupplyAndReserved(uint8 collectionNumber, uint16 mintQty) internal {
        address sender = _msgSender();
        uint16 holderReserved_ = holderReservedCount[collectionNumber][sender];
        uint16 remainingReserved_ = remainingReserved[collectionNumber];
        uint16 maxSubCollectionMints_ = maxSubCollectionMints[collectionNumber];
        if(holderReserved_ == 0) {
            require(
                currentSubCollectionSupply[collectionNumber] + mintQty <= maxSubCollectionMints_ - remainingReserved_,
                "ER36"
            );
        } else {
            require(
                currentSubCollectionSupply[collectionNumber] + mintQty <= maxSubCollectionMints_,
                "ER37"
            );
            if(mintQty >= holderReserved_) {
                remainingReserved[collectionNumber] = remainingReserved_ - holderReserved_;
                holderReservedCount[collectionNumber][sender] = 0;
            } else {
                remainingReserved[collectionNumber] = remainingReserved_ - mintQty;
                holderReservedCount[collectionNumber][sender] = holderReserved_ - mintQty;
            }
        }
    }

    function checkTxCost(uint256 msgValue, uint256 totalMintCost) internal pure {
        require(msgValue >= totalMintCost, "ER33");
    }

    function checkMintQty(uint8 mintQty, uint16 maxMintQty_) internal pure {
        require(mintQty <= maxMintQty_, "ER34");
    }

    function checkPaused() internal view {
        require(!paused || _msgSender() == owner(), "ER35");
    }


     event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;


    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }

    fallback() external payable {  }
    receive() external payable {emit PaymentReceived(_msgSender(), msg.value);}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string[]","name":"_initBaseURIs","type":"string[]"},{"internalType":"string","name":"_placeHolderURL","type":"string"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURIs","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressUrlType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[],"name":"autoFloor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"baseURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"uint8[]","name":"count","type":"uint8[]"}],"name":"batchAddCustomMintables","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"uint8[]","name":"count","type":"uint8[]"},{"internalType":"uint8[]","name":"collectionNumber","type":"uint8[]"}],"name":"batchAddGiveAwayAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"uint8[]","name":"count","type":"uint8[]"},{"internalType":"uint8[]","name":"collectionNumber","type":"uint8[]"}],"name":"batchAddHolderReservedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"currentSubCollectionSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"customMintables","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"subCollection","type":"uint8"},{"internalType":"uint8","name":"mintQty","type":"uint8"}],"name":"getTxCost","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"giveAwayAllowance","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"holderReservedCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idUrlCustom","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":[],"name":"maxMintQty","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"maxSubCollectionMints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintQty","type":"uint8"}],"name":"mint1","outputs":[],"stateMutability":"payable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeHolderURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"remainingReserved","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_newBaseURIs","type":"string[]"}],"name":"setBaseURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newUrl","type":"string"}],"name":"setCustomUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"new_maxMintQty","type":"uint16"}],"name":"setMaxMintQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Mint1Cost_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAutoFloor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"urlToId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

600a805463ffffffff60a01b19166220201960a31b17905560c06040526005608081905264173539b7b760d91b60a09081526200004091600b919062000537565b503480156200004e57600080fd5b5060405162004b7a38038062004b7a8339810160408190526200007191620008c7565b8551869086906200008a90600090602085019062000537565b508051620000a090600190602084019062000537565b505050620000bd620000b76200027e60201b60201c565b62000282565b620000c884620002d4565b8251620000dd90600c90602086019062000537565b506000805267010a741a462780007ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3755560106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01805461ffff19166109c41790558051825114620001b25760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002055760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620001a9565b60005b825181101562000271576200025c8382815181106200022b576200022b62000ab3565b602002602001015183838151811062000248576200024862000ab3565b60200260200101516200034960201b60201c565b80620002688162000a7f565b91505062000208565b5050505050505062000adf565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620003305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001a9565b80516200034590600d906020840190620005c6565b5050565b6001600160a01b038216620003b65760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620001a9565b60008111620004085760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620001a9565b6001600160a01b0382166000908152601a602052604090205415620004845760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620001a9565b601c8054600181019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319166001600160a01b0384169081179091556000908152601a60205260409020819055601854620004ee90829062000a27565b601855604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054620005459062000a42565b90600052602060002090601f016020900481019282620005695760008555620005b4565b82601f106200058457805160ff1916838001178555620005b4565b82800160010185558215620005b4579182015b82811115620005b457825182559160200191906001019062000597565b50620005c292915062000626565b5090565b82805482825590600052602060002090810192821562000618579160200282015b828111156200061857825180516200060791849160209091019062000537565b5091602001919060010190620005e7565b50620005c29291506200063d565b5b80821115620005c2576000815560010162000627565b80821115620005c25760006200065482826200065e565b506001016200063d565b5080546200066c9062000a42565b6000825580601f106200067d575050565b601f0160209004906000526020600020908101906200069d919062000626565b50565b600082601f830112620006b257600080fd5b81516020620006cb620006c58362000a01565b620009ce565b80838252828201915082860187848660051b8901011115620006ec57600080fd5b6000805b86811015620007235782516001600160a01b038116811462000710578283fd5b85529385019391850191600101620006f0565b509198975050505050505050565b600082601f8301126200074357600080fd5b8151602062000756620006c58362000a01565b80838252828201915082860187848660051b89010111156200077757600080fd5b6000805b86811015620007235782516001600160401b038111156200079a578283fd5b620007aa8b88838d010162000832565b86525093850193918501916001016200077b565b600082601f830112620007d057600080fd5b81516020620007e3620006c58362000a01565b80838252828201915082860187848660051b89010111156200080457600080fd5b60005b85811015620008255781518452928401929084019060010162000807565b5090979650505050505050565b600082601f8301126200084457600080fd5b81516001600160401b0381111562000860576200086062000ac9565b602062000876601f8301601f19168201620009ce565b82815285828487010111156200088b57600080fd5b60005b83811015620008ab5785810183015182820184015282016200088e565b83811115620008bd5760008385840101525b5095945050505050565b60008060008060008060c08789031215620008e157600080fd5b86516001600160401b0380821115620008f957600080fd5b620009078a838b0162000832565b975060208901519150808211156200091e57600080fd5b6200092c8a838b0162000832565b965060408901519150808211156200094357600080fd5b620009518a838b0162000731565b955060608901519150808211156200096857600080fd5b620009768a838b0162000832565b945060808901519150808211156200098d57600080fd5b6200099b8a838b01620006a0565b935060a0890151915080821115620009b257600080fd5b50620009c189828a01620007be565b9150509295509295509295565b604051601f8201601f191681016001600160401b0381118282101715620009f957620009f962000ac9565b604052919050565b60006001600160401b0382111562000a1d5762000a1d62000ac9565b5060051b60200190565b6000821982111562000a3d5762000a3d62000a9d565b500190565b600181811c9082168062000a5757607f821691505b6020821081141562000a7957634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000a965762000a9662000a9d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61408b8062000aef6000396000f3fe6080604052600436106103605760003560e01c8063895ab7bb116101c4578063b88d4fde116100f6578063d0124af51161009a578063e985e9c51161006c578063e985e9c514610ba2578063ee74f03514610beb578063f2fde38b14610c00578063f45f511214610c2057005b8063d0124af514610b17578063d79779b214610b37578063da3ef23f14610b6d578063e33b7de314610b8d57005b8063cd07a561116100d3578063cd07a56114610a7d578063cd5e9e1414610a9f578063ce7c2ac214610acc578063cea7149914610b0257005b8063b88d4fde14610a28578063c668286214610a48578063c87b56dd14610a5d57005b806395d89b4111610168578063a0d8b06e1161013a578063a0d8b06e14610996578063a22cb465146109c7578063b4f47cc4146109e7578063b87af86214610a0757005b806395d89b41146109185780639852595c1461092d5780639a637df7146109635780639c08623d1461098357005b80638fae83ea116101a15780638fae83ea14610870578063915642061461089d57806391b7f5ed146108bd57806393a7d319146108dd57005b8063895ab7bb146108125780638b83209b146108325780638da5cb5b1461085257005b806336566f061161029d5780634afa8750116102415780636352211e116102135780636352211e1461078c57806368ed8ffc146107ac57806370a08231146107dd578063715018a6146107fd57005b80634afa8750146106ef5780634f6ccce71461072b5780635a7426eb1461074b5780635c975abb1461076b57005b8063406072a91161027a578063406072a91461063c57806342842e0e14610682578063438b6300146106a257806348b75044146106cf57005b806336566f06146105f05780633688236d146106055780633a98ef391461062757005b806312e8f18b1161030457806323b872dd116102e157806323b872dd1461056757806328c7ab46146105875780632f745c59146105a757806332cb6b0c146105c757005b806312e8f18b146104f057806318160ddd14610532578063191655871461054757005b80630904a8761161033d5780630904a8761461043a578063095ea7b3146104685780630fee97e61461048857806310ec7374146104d057005b806301ffc9a7146103ab57806306fdde03146103e0578063081812fc1461040257005b366103a9577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b005b3480156103b757600080fd5b506103cb6103c63660046138cf565b610c50565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103f5610c7b565b6040516103d79190613c47565b34801561040e57600080fd5b5061042261041d366004613962565b610d0d565b6040516001600160a01b0390911681526020016103d7565b34801561044657600080fd5b5061045a610455366004613a08565b610da7565b6040519081526020016103d7565b34801561047457600080fd5b506103a96104833660046136e2565b610e02565b34801561049457600080fd5b506104bb6104a33660046139d1565b600e6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016103d7565b3480156104dc57600080fd5b506103a96104eb36600461393e565b610f18565b3480156104fc57600080fd5b5061052061050b36600461359d565b60146020526000908152604090205460ff1681565b60405160ff90911681526020016103d7565b34801561053e57600080fd5b5060085461045a565b34801561055357600080fd5b506103a961056236600461359d565b610f64565b34801561057357600080fd5b506103a96105823660046135f3565b611092565b34801561059357600080fd5b506103a96105a2366004613772565b6110c3565b3480156105b357600080fd5b5061045a6105c23660046136e2565b6110f8565b3480156105d357600080fd5b506105dd6109c481565b60405161ffff90911681526020016103d7565b3480156105fc57600080fd5b506103a961118e565b34801561061157600080fd5b50600a546105dd90600160a01b900461ffff1681565b34801561063357600080fd5b5060185461045a565b34801561064857600080fd5b5061045a6106573660046135ba565b6001600160a01b039182166000908152601e6020908152604080832093909416825291909152205490565b34801561068e57600080fd5b506103a961069d3660046135f3565b6111f1565b3480156106ae57600080fd5b506106c26106bd36600461359d565b61120c565b6040516103d79190613c03565b3480156106db57600080fd5b506103a96106ea3660046135ba565b6112ae565b3480156106fb57600080fd5b506105dd61070a3660046139ec565b601760209081526000928352604080842090915290825290205461ffff1681565b34801561073757600080fd5b5061045a610746366004613962565b611496565b34801561075757600080fd5b506103f5610766366004613962565b611529565b34801561077757600080fd5b50600a546103cb90600160b81b900460ff1681565b34801561079857600080fd5b506104226107a7366004613962565b6115c3565b3480156107b857600080fd5b506105dd6107c73660046139d1565b60106020526000908152604090205461ffff1681565b3480156107e957600080fd5b5061045a6107f836600461359d565b61163a565b34801561080957600080fd5b506103a96116c1565b34801561081e57600080fd5b506103a961082d36600461370e565b6116f7565b34801561083e57600080fd5b5061042261084d366004613962565b61172f565b34801561085e57600080fd5b50600a546001600160a01b0316610422565b34801561087c57600080fd5b5061045a61088b3660046139d1565b600f6020526000908152604090205481565b3480156108a957600080fd5b506103f56108b8366004613962565b61175f565b3480156108c957600080fd5b506103a96108d8366004613962565b61178a565b3480156108e957600080fd5b506105206108f83660046139ec565b601560209081526000928352604080842090915290825290205460ff1681565b34801561092457600080fd5b506103f56117e1565b34801561093957600080fd5b5061045a61094836600461359d565b6001600160a01b03166000908152601b602052604090205490565b34801561096f57600080fd5b506103a961097e366004613994565b6117f0565b6103a96109913660046139d1565b611839565b3480156109a257600080fd5b506105dd6109b13660046139d1565b60166020526000908152604090205461ffff1681565b3480156109d357600080fd5b506103a96109e23660046136b4565b611844565b3480156109f357600080fd5b506103a9610a023660046137fa565b61184f565b348015610a1357600080fd5b50600a546103cb90600160b01b900460ff1681565b348015610a3457600080fd5b506103a9610a43366004613634565b61188c565b348015610a5457600080fd5b506103f56118c4565b348015610a6957600080fd5b506103f5610a78366004613962565b6118d1565b348015610a8957600080fd5b50610a92611a60565b6040516103d79190613ba1565b348015610aab57600080fd5b5061045a610aba366004613962565b60126020526000908152604090205481565b348015610ad857600080fd5b5061045a610ae736600461359d565b6001600160a01b03166000908152601a602052604090205490565b348015610b0e57600080fd5b506103a9611b39565b348015610b2357600080fd5b506103a9610b32366004613772565b611b98565b348015610b4357600080fd5b5061045a610b5236600461359d565b6001600160a01b03166000908152601d602052604090205490565b348015610b7957600080fd5b506103a9610b88366004613909565b611bcd565b348015610b9957600080fd5b5060195461045a565b348015610bae57600080fd5b506103cb610bbd3660046135ba565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bf757600080fd5b506103f5611c0a565b348015610c0c57600080fd5b506103a9610c1b36600461359d565b611c17565b348015610c2c57600080fd5b50610520610c3b366004613962565b60116020526000908152604090205460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610c755750610c7582611caf565b92915050565b606060008054610c8a90613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb690613f0e565b8015610d035780601f10610cd857610100808354040283529160200191610d03565b820191906000526020600020905b815481529060010190602001808311610ce657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d8b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60ff8281166000908152601560209081526040808320338452909152812054909190811690831611610ddb57506000610c75565b60ff8381166000908152600f6020526040902054610dfb91841690613e89565b9392505050565b6000610e0d826115c3565b9050806001600160a01b0316836001600160a01b03161415610e7b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d82565b336001600160a01b0382161480610e975750610e978133610bbd565b610f095760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d82565b610f138383611cff565b505050565b600a546001600160a01b03163314610f425760405162461bcd60e51b8152600401610d8290613d3d565b600a805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b6001600160a01b0381166000908152601a6020526040902054610f995760405162461bcd60e51b8152600401610d8290613cac565b6000610fa460195490565b610fae9047613e3e565b90506000610fdb8383610fd6866001600160a01b03166000908152601b602052604090205490565b611d6d565b905080610ffa5760405162461bcd60e51b8152600401610d8290613cf2565b6001600160a01b0383166000908152601b602052604081208054839290611022908490613e3e565b92505081905550806019600082825461103b9190613e3e565b9091555061104b90508382611db3565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b61109c3382611ecc565b6110b85760405162461bcd60e51b8152600401610d8290613d72565b610f13838383611fc2565b600a546001600160a01b031633146110ed5760405162461bcd60e51b8152600401610d8290613d3d565b610f1383838361216d565b60006111038361163a565b82106111655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d82565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146111b85760405162461bcd60e51b8152600401610d8290613d3d565b600a54600160b81b900460ff166111de57600a805460ff60b81b1916600160b81b179055565b600a805460ff60b81b1916905560005b50565b610f138383836040518060200160405280600081525061188c565b606060006112198361163a565b905060008167ffffffffffffffff81111561123657611236614006565b60405190808252806020026020018201604052801561125f578160200160208202803683370190505b50905060005b828110156112a65761127785826110f8565b82828151811061128957611289613ff0565b60209081029190910101528061129e81613f65565b915050611265565b509392505050565b6001600160a01b0381166000908152601a60205260409020546112e35760405162461bcd60e51b8152600401610d8290613cac565b6001600160a01b0382166000908152601d60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561133b57600080fd5b505afa15801561134f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611373919061397b565b61137d9190613e3e565b905060006113b68383610fd687876001600160a01b039182166000908152601e6020908152604080832093909416825291909152205490565b9050806113d55760405162461bcd60e51b8152600401610d8290613cf2565b6001600160a01b038085166000908152601e602090815260408083209387168352929052908120805483929061140c908490613e3e565b90915550506001600160a01b0384166000908152601d602052604081208054839290611439908490613e3e565b9091555061144a90508484836122e8565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60006114a160085490565b82106115045760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d82565b6008828154811061151757611517613ff0565b90600052602060002001549050919050565b6013602052600090815260409020805461154290613f0e565b80601f016020809104026020016040519081016040528092919081815260200182805461156e90613f0e565b80156115bb5780601f10611590576101008083540402835291602001916115bb565b820191906000526020600020905b81548152906001019060200180831161159e57829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b031680610c755760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d82565b60006001600160a01b0382166116a55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d82565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146116eb5760405162461bcd60e51b8152600401610d8290613d3d565b6116f5600061233a565b565b600a546001600160a01b031633146117215760405162461bcd60e51b8152600401610d8290613d3d565b61172b828261238c565b5050565b6000601c828154811061174457611744613ff0565b6000918252602090912001546001600160a01b031692915050565b600d818154811061176f57600080fd5b90600052602060002001600091509050805461154290613f0e565b600a546001600160a01b031633146117b45760405162461bcd60e51b8152600401610d8290613d3d565b60008052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37555565b606060018054610c8a90613f0e565b600a546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610d8290613d3d565b60008281526013602090815260409091208251610f13928401906132e4565b6111ee600082612427565b61172b338383612528565b600a546001600160a01b031633146118795760405162461bcd60e51b8152600401610d8290613d3d565b805161172b90600d906020840190613368565b6118963383611ecc565b6118b25760405162461bcd60e51b8152600401610d8290613d72565b6118be848484846125f7565b50505050565b600b805461154290613f0e565b6000818152600260205260409020546060906001600160a01b03166119215760405162461bcd60e51b8152600401610d82906020808252600490820152634552333960e01b604082015260600190565b600061192b611a60565b60008481526011602052604090205490915060ff16600414156119b5576000838152601360205260408120805461196190613f0e565b90501161197d5760405180602001604052806000815250610dfb565b600083815260136020908152604091829020915161199f9291600b9101613b4f565b6040516020818303038152906040529392505050565b6000838152601160205260408120548251839160ff169081106119da576119da613ff0565b602002602001015151116119fd5760405180602001604052806000815250610dfb565b6000838152601160205260409020548151829160ff16908110611a2257611a22613ff0565b6020026020010151611a46601260008681526020019081526020016000205461262a565b600b60405160200161199f93929190613b1d565b50919050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015611b30578382906000526020600020018054611aa390613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611acf90613f0e565b8015611b1c5780601f10611af157610100808354040283529160200191611b1c565b820191906000526020600020905b815481529060010190602001808311611aff57829003601f168201915b505050505081526020019060010190611a84565b50505050905090565b600a546001600160a01b03163314611b635760405162461bcd60e51b8152600401610d8290613d3d565b600a54600160b01b900460ff16611b8957600a805460ff60b01b1916600160b01b179055565b600a805460ff60b01b19169055565b600a546001600160a01b03163314611bc25760405162461bcd60e51b8152600401610d8290613d3d565b610f13838383612728565b600a546001600160a01b03163314611bf75760405162461bcd60e51b8152600401610d8290613d3d565b805161172b90600b9060208401906132e4565b600c805461154290613f0e565b600a546001600160a01b03163314611c415760405162461bcd60e51b8152600401610d8290613d3d565b6001600160a01b038116611ca65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d82565b6111ee8161233a565b60006001600160e01b031982166380ac58cd60e01b1480611ce057506001600160e01b03198216635b5e139f60e01b145b80610c7557506301ffc9a760e01b6001600160e01b0319831614610c75565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d34826115c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6018546001600160a01b0384166000908152601a602052604081205490918391611d979086613e89565b611da19190613e75565b611dab9190613ecb565b949350505050565b80471015611e035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d82565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e50576040519150601f19603f3d011682016040523d82523d6000602084013e611e55565b606091505b5050905080610f135760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d82565b6000818152600260205260408120546001600160a01b0316611f455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d82565b6000611f50836115c3565b9050806001600160a01b0316846001600160a01b03161480611f8b5750836001600160a01b0316611f8084610d0d565b6001600160a01b0316145b80611dab57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316611fd5826115c3565b6001600160a01b03161461203d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d82565b6001600160a01b03821661209f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d82565b6120aa8383836127f7565b6120b5600082611cff565b6001600160a01b03831660009081526003602052604081208054600192906120de908490613ecb565b90915550506001600160a01b038216600090815260036020526040812080546001929061210c908490613e3e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b83518161ffff1610156118be57828161ffff168151811061219357612193613ff0565b602002602001015160ff1660176000848461ffff16815181106121b8576121b8613ff0565b602002602001015160ff1660ff1681526020019081526020016000206000868461ffff16815181106121ec576121ec613ff0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff191661ffff92831617905583518491831690811061223457612234613ff0565b602002602001015160ff1660166000848461ffff168151811061225957612259613ff0565b60209081029190910181015160ff16825281019190915260400160002054612285919061ffff16613e18565b60166000848461ffff168151811061229f5761229f613ff0565b602002602001015160ff1660ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555080806122e090613f43565b915050612170565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f139084906128af565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b82518161ffff161015610f1357818161ffff16815181106123b2576123b2613ff0565b602002602001015160146000858461ffff16815181106123d4576123d4613ff0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061241f90613f43565b91505061238f565b61242f612981565b600a54612448908290600160a01b900461ffff166129d9565b60008160ff1661245760085490565b6124619190613e3e565b905061246c81612a19565b612479838360ff16612a54565b60ff83811660009081526015602090815260408083203384529091529020548116908316116124d45760ff83811660009081526015602090815260408083203384529091529020805460ff19169184169190911790556124ff565b60ff8381166000908152600f60205260409020546124ff9134916124fa91861690613e89565b612c5e565b60005b8260ff168110156118be5761251684612c97565b8061252081613f65565b915050612502565b816001600160a01b0316836001600160a01b0316141561258a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d82565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612602848484611fc2565b61260e84848484612d3c565b6118be5760405162461bcd60e51b8152600401610d8290613c5a565b60608161264e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612678578061266281613f65565b91506126719050600a83613e75565b9150612652565b60008167ffffffffffffffff81111561269357612693614006565b6040519080825280601f01601f1916602001820160405280156126bd576020820181803683370190505b5090505b8415611dab576126d2600183613ecb565b91506126df600a86613f9a565b6126ea906030613e3e565b60f81b8183815181106126ff576126ff613ff0565b60200101906001600160f81b031916908160001a905350612721600a86613e75565b94506126c1565b60005b83518161ffff1610156118be57828161ffff168151811061274e5761274e613ff0565b602002602001015160156000848461ffff168151811061277057612770613ff0565b602002602001015160ff1660ff1681526020019081526020016000206000868461ffff16815181106127a4576127a4613ff0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806127ef90613f43565b91505061272b565b6001600160a01b0383166128525761284d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612875565b816001600160a01b0316836001600160a01b031614612875576128758382612e49565b6001600160a01b03821661288c57610f1381612ee6565b826001600160a01b0316826001600160a01b031614610f1357610f138282612f95565b6000612904826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fd99092919063ffffffff16565b805190915015610f13578080602001905181019061292291906138b2565b610f135760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d82565b600a54600160b81b900460ff1615806129a45750600a546001600160a01b031633145b6116f55760405162461bcd60e51b8152600401610d82906020808252600490820152634552333560e01b604082015260600190565b8061ffff168260ff16111561172b5760405162461bcd60e51b8152600401610d829060208082526004908201526311548ccd60e21b604082015260600190565b6109c48111156111ee5760405162461bcd60e51b8152600401610d829060208082526004908201526308aa466760e31b604082015260600190565b60ff82166000818152601760209081526040808320338085529083528184205494845260168352818420546010909352922054919261ffff90811692918116911682612b1357612aa48282613ea8565b60ff87166000908152600e602052604090205461ffff91821691612ad1919088169063ffffffff16613e56565b63ffffffff161115612b0e5760405162461bcd60e51b8152600401610d829060208082526004908201526322a9199b60e11b604082015260600190565b612c56565b60ff86166000908152600e602052604090205461ffff80831691612b3f9188169063ffffffff16613e56565b63ffffffff161115612b7c5760405162461bcd60e51b8152600401610d82906020808252600490820152634552333760e01b604082015260600190565b8261ffff168561ffff1610612be157612b958383613ea8565b60ff87166000908152601660209081526040808320805461ffff9590951661ffff19958616179055601782528083206001600160a01b0389168452909152902080549091169055612c56565b612beb8583613ea8565b60ff87166000908152601660205260409020805461ffff191661ffff92909216919091179055612c1b8584613ea8565b60ff871660009081526017602090815260408083206001600160a01b03891684529091529020805461ffff191661ffff929092169190911790555b505050505050565b8082101561172b5760405162461bcd60e51b8152600401610d82906020808252600490820152634552333360e01b604082015260600190565b6000612ca260085490565b612cad906001613e3e565b6000818152601160209081526040808320805460ff191660ff88169081179091558352600e9091528120805492935063ffffffff9092169190612cef83613f80565b82546101009290920a63ffffffff81810219909316918316021790915560ff84166000908152600e60209081526040808320548684526012909252909120911690555061172b3382612fe8565b60006001600160a01b0384163b15612e3e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d80903390899088908890600401613b64565b602060405180830381600087803b158015612d9a57600080fd5b505af1925050508015612dca575060408051601f3d908101601f19168201909252612dc7918101906138ec565b60015b612e24573d808015612df8576040519150601f19603f3d011682016040523d82523d6000602084013e612dfd565b606091505b508051612e1c5760405162461bcd60e51b8152600401610d8290613c5a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dab565b506001949350505050565b60006001612e568461163a565b612e609190613ecb565b600083815260076020526040902054909150808214612eb3576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612ef890600190613ecb565b60008381526009602052604081205460088054939450909284908110612f2057612f20613ff0565b906000526020600020015490508060088381548110612f4157612f41613ff0565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f7957612f79613fda565b6001900381819060005260206000200160009055905550505050565b6000612fa08361163a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060611dab8484600085613002565b61172b82826040518060200160405280600081525061312a565b6060824710156130635760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d82565b843b6130b15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d82565b600080866001600160a01b031685876040516130cd9190613b01565b60006040518083038185875af1925050503d806000811461310a576040519150601f19603f3d011682016040523d82523d6000602084013e61310f565b606091505b509150915061311f82828661315d565b979650505050505050565b6131348383613196565b6131416000848484612d3c565b610f135760405162461bcd60e51b8152600401610d8290613c5a565b6060831561316c575081610dfb565b82511561317c5782518084602001fd5b8160405162461bcd60e51b8152600401610d829190613c47565b6001600160a01b0382166131ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d82565b6000818152600260205260409020546001600160a01b0316156132515760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d82565b61325d600083836127f7565b6001600160a01b0382166000908152600360205260408120805460019290613286908490613e3e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546132f090613f0e565b90600052602060002090601f0160209004810192826133125760008555613358565b82601f1061332b57805160ff1916838001178555613358565b82800160010185558215613358579182015b8281111561335857825182559160200191906001019061333d565b506133649291506133c1565b5090565b8280548282559060005260206000209081019282156133b5579160200282015b828111156133b557825180516133a59184916020909101906132e4565b5091602001919060010190613388565b506133649291506133d6565b5b8082111561336457600081556001016133c2565b808211156133645760006133ea82826133f3565b506001016133d6565b5080546133ff90613f0e565b6000825580601f1061340f575050565b601f0160209004906000526020600020908101906111ee91906133c1565b600067ffffffffffffffff83111561344757613447614006565b61345a601f8401601f1916602001613dc3565b905082815283838301111561346e57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261349657600080fd5b813560206134ab6134a683613df4565b613dc3565b80838252828201915082860187848660051b89010111156134cb57600080fd5b60005b858110156134f35781356134e18161401c565b845292840192908401906001016134ce565b5090979650505050505050565b600082601f83011261351157600080fd5b813560206135216134a683613df4565b80838252828201915082860187848660051b890101111561354157600080fd5b60005b858110156134f35761355582613587565b84529284019290840190600101613544565b600082601f83011261357857600080fd5b610dfb8383356020850161342d565b803560ff8116811461359857600080fd5b919050565b6000602082840312156135af57600080fd5b8135610dfb8161401c565b600080604083850312156135cd57600080fd5b82356135d88161401c565b915060208301356135e88161401c565b809150509250929050565b60008060006060848603121561360857600080fd5b83356136138161401c565b925060208401356136238161401c565b929592945050506040919091013590565b6000806000806080858703121561364a57600080fd5b84356136558161401c565b935060208501356136658161401c565b925060408501359150606085013567ffffffffffffffff81111561368857600080fd5b8501601f8101871361369957600080fd5b6136a88782356020840161342d565b91505092959194509250565b600080604083850312156136c757600080fd5b82356136d28161401c565b915060208301356135e881614031565b600080604083850312156136f557600080fd5b82356137008161401c565b946020939093013593505050565b6000806040838503121561372157600080fd5b823567ffffffffffffffff8082111561373957600080fd5b61374586838701613485565b9350602085013591508082111561375b57600080fd5b5061376885828601613500565b9150509250929050565b60008060006060848603121561378757600080fd5b833567ffffffffffffffff8082111561379f57600080fd5b6137ab87838801613485565b945060208601359150808211156137c157600080fd5b6137cd87838801613500565b935060408601359150808211156137e357600080fd5b506137f086828701613500565b9150509250925092565b6000602080838503121561380d57600080fd5b823567ffffffffffffffff8082111561382557600080fd5b818501915085601f83011261383957600080fd5b81356138476134a682613df4565b80828252858201915085850189878560051b880101111561386757600080fd5b6000805b858110156138a257823587811115613881578283fd5b61388f8d8b838c0101613567565b865250938801939188019160010161386b565b50919a9950505050505050505050565b6000602082840312156138c457600080fd5b8151610dfb81614031565b6000602082840312156138e157600080fd5b8135610dfb8161403f565b6000602082840312156138fe57600080fd5b8151610dfb8161403f565b60006020828403121561391b57600080fd5b813567ffffffffffffffff81111561393257600080fd5b611dab84828501613567565b60006020828403121561395057600080fd5b813561ffff81168114610dfb57600080fd5b60006020828403121561397457600080fd5b5035919050565b60006020828403121561398d57600080fd5b5051919050565b600080604083850312156139a757600080fd5b82359150602083013567ffffffffffffffff8111156139c557600080fd5b61376885828601613567565b6000602082840312156139e357600080fd5b610dfb82613587565b600080604083850312156139ff57600080fd5b6135d883613587565b60008060408385031215613a1b57600080fd5b613a2483613587565b9150613a3260208401613587565b90509250929050565b60008151808452613a53816020860160208601613ee2565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613a8157607f831692505b6020808410821415613aa357634e487b7160e01b600052602260045260246000fd5b818015613ab75760018114613ac857613af5565b60ff19861689528489019650613af5565b60008881526020902060005b86811015613aed5781548b820152908501908301613ad4565b505084890196505b50505050505092915050565b60008251613b13818460208701613ee2565b9190910192915050565b60008451613b2f818460208901613ee2565b845190830190613b43818360208901613ee2565b61311f81830186613a67565b6000611dab613b5e8386613a67565b84613a67565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613b9790830184613a3b565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613bf657603f19888603018452613be4858351613a3b565b94509285019290850190600101613bc8565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c3b57835183529284019291840191600101613c1f565b50909695505050505050565b602081526000610dfb6020830184613a3b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613dec57613dec614006565b604052919050565b600067ffffffffffffffff821115613e0e57613e0e614006565b5060051b60200190565b600061ffff808316818516808303821115613e3557613e35613fae565b01949350505050565b60008219821115613e5157613e51613fae565b500190565b600063ffffffff808316818516808303821115613e3557613e35613fae565b600082613e8457613e84613fc4565b500490565b6000816000190483118215151615613ea357613ea3613fae565b500290565b600061ffff83811690831681811015613ec357613ec3613fae565b039392505050565b600082821015613edd57613edd613fae565b500390565b60005b83811015613efd578181015183820152602001613ee5565b838111156118be5750506000910152565b600181811c90821680613f2257607f821691505b60208210811415611a5a57634e487b7160e01b600052602260045260246000fd5b600061ffff80831681811415613f5b57613f5b613fae565b6001019392505050565b6000600019821415613f7957613f79613fae565b5060010190565b600063ffffffff80831681811415613f5b57613f5b613fae565b600082613fa957613fa9613fc4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111ee57600080fd5b80151581146111ee57600080fd5b6001600160e01b0319811681146111ee57600080fdfea264697066735822122075328fc83f2435d9820a5a085891fe5572233164a6fc9d32b699f5a27074be4964736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000a4e4654434354696765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e46544343540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56347036463766626f6161327a5442776542324d44524d665268424473674e4e454532445539576f416f54542f00000000000000000000000000000000000000000000000000000000000000000000000000000000003c697066733a2f2f516d56347036463766626f6161327a5442776542324d44524d665268424473674e4e454532445539576f416f54542f312e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000734dfca0814b5783a1265ffc9b65e5564f1aeaac00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x6080604052600436106103605760003560e01c8063895ab7bb116101c4578063b88d4fde116100f6578063d0124af51161009a578063e985e9c51161006c578063e985e9c514610ba2578063ee74f03514610beb578063f2fde38b14610c00578063f45f511214610c2057005b8063d0124af514610b17578063d79779b214610b37578063da3ef23f14610b6d578063e33b7de314610b8d57005b8063cd07a561116100d3578063cd07a56114610a7d578063cd5e9e1414610a9f578063ce7c2ac214610acc578063cea7149914610b0257005b8063b88d4fde14610a28578063c668286214610a48578063c87b56dd14610a5d57005b806395d89b4111610168578063a0d8b06e1161013a578063a0d8b06e14610996578063a22cb465146109c7578063b4f47cc4146109e7578063b87af86214610a0757005b806395d89b41146109185780639852595c1461092d5780639a637df7146109635780639c08623d1461098357005b80638fae83ea116101a15780638fae83ea14610870578063915642061461089d57806391b7f5ed146108bd57806393a7d319146108dd57005b8063895ab7bb146108125780638b83209b146108325780638da5cb5b1461085257005b806336566f061161029d5780634afa8750116102415780636352211e116102135780636352211e1461078c57806368ed8ffc146107ac57806370a08231146107dd578063715018a6146107fd57005b80634afa8750146106ef5780634f6ccce71461072b5780635a7426eb1461074b5780635c975abb1461076b57005b8063406072a91161027a578063406072a91461063c57806342842e0e14610682578063438b6300146106a257806348b75044146106cf57005b806336566f06146105f05780633688236d146106055780633a98ef391461062757005b806312e8f18b1161030457806323b872dd116102e157806323b872dd1461056757806328c7ab46146105875780632f745c59146105a757806332cb6b0c146105c757005b806312e8f18b146104f057806318160ddd14610532578063191655871461054757005b80630904a8761161033d5780630904a8761461043a578063095ea7b3146104685780630fee97e61461048857806310ec7374146104d057005b806301ffc9a7146103ab57806306fdde03146103e0578063081812fc1461040257005b366103a9577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b005b3480156103b757600080fd5b506103cb6103c63660046138cf565b610c50565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103f5610c7b565b6040516103d79190613c47565b34801561040e57600080fd5b5061042261041d366004613962565b610d0d565b6040516001600160a01b0390911681526020016103d7565b34801561044657600080fd5b5061045a610455366004613a08565b610da7565b6040519081526020016103d7565b34801561047457600080fd5b506103a96104833660046136e2565b610e02565b34801561049457600080fd5b506104bb6104a33660046139d1565b600e6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016103d7565b3480156104dc57600080fd5b506103a96104eb36600461393e565b610f18565b3480156104fc57600080fd5b5061052061050b36600461359d565b60146020526000908152604090205460ff1681565b60405160ff90911681526020016103d7565b34801561053e57600080fd5b5060085461045a565b34801561055357600080fd5b506103a961056236600461359d565b610f64565b34801561057357600080fd5b506103a96105823660046135f3565b611092565b34801561059357600080fd5b506103a96105a2366004613772565b6110c3565b3480156105b357600080fd5b5061045a6105c23660046136e2565b6110f8565b3480156105d357600080fd5b506105dd6109c481565b60405161ffff90911681526020016103d7565b3480156105fc57600080fd5b506103a961118e565b34801561061157600080fd5b50600a546105dd90600160a01b900461ffff1681565b34801561063357600080fd5b5060185461045a565b34801561064857600080fd5b5061045a6106573660046135ba565b6001600160a01b039182166000908152601e6020908152604080832093909416825291909152205490565b34801561068e57600080fd5b506103a961069d3660046135f3565b6111f1565b3480156106ae57600080fd5b506106c26106bd36600461359d565b61120c565b6040516103d79190613c03565b3480156106db57600080fd5b506103a96106ea3660046135ba565b6112ae565b3480156106fb57600080fd5b506105dd61070a3660046139ec565b601760209081526000928352604080842090915290825290205461ffff1681565b34801561073757600080fd5b5061045a610746366004613962565b611496565b34801561075757600080fd5b506103f5610766366004613962565b611529565b34801561077757600080fd5b50600a546103cb90600160b81b900460ff1681565b34801561079857600080fd5b506104226107a7366004613962565b6115c3565b3480156107b857600080fd5b506105dd6107c73660046139d1565b60106020526000908152604090205461ffff1681565b3480156107e957600080fd5b5061045a6107f836600461359d565b61163a565b34801561080957600080fd5b506103a96116c1565b34801561081e57600080fd5b506103a961082d36600461370e565b6116f7565b34801561083e57600080fd5b5061042261084d366004613962565b61172f565b34801561085e57600080fd5b50600a546001600160a01b0316610422565b34801561087c57600080fd5b5061045a61088b3660046139d1565b600f6020526000908152604090205481565b3480156108a957600080fd5b506103f56108b8366004613962565b61175f565b3480156108c957600080fd5b506103a96108d8366004613962565b61178a565b3480156108e957600080fd5b506105206108f83660046139ec565b601560209081526000928352604080842090915290825290205460ff1681565b34801561092457600080fd5b506103f56117e1565b34801561093957600080fd5b5061045a61094836600461359d565b6001600160a01b03166000908152601b602052604090205490565b34801561096f57600080fd5b506103a961097e366004613994565b6117f0565b6103a96109913660046139d1565b611839565b3480156109a257600080fd5b506105dd6109b13660046139d1565b60166020526000908152604090205461ffff1681565b3480156109d357600080fd5b506103a96109e23660046136b4565b611844565b3480156109f357600080fd5b506103a9610a023660046137fa565b61184f565b348015610a1357600080fd5b50600a546103cb90600160b01b900460ff1681565b348015610a3457600080fd5b506103a9610a43366004613634565b61188c565b348015610a5457600080fd5b506103f56118c4565b348015610a6957600080fd5b506103f5610a78366004613962565b6118d1565b348015610a8957600080fd5b50610a92611a60565b6040516103d79190613ba1565b348015610aab57600080fd5b5061045a610aba366004613962565b60126020526000908152604090205481565b348015610ad857600080fd5b5061045a610ae736600461359d565b6001600160a01b03166000908152601a602052604090205490565b348015610b0e57600080fd5b506103a9611b39565b348015610b2357600080fd5b506103a9610b32366004613772565b611b98565b348015610b4357600080fd5b5061045a610b5236600461359d565b6001600160a01b03166000908152601d602052604090205490565b348015610b7957600080fd5b506103a9610b88366004613909565b611bcd565b348015610b9957600080fd5b5060195461045a565b348015610bae57600080fd5b506103cb610bbd3660046135ba565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bf757600080fd5b506103f5611c0a565b348015610c0c57600080fd5b506103a9610c1b36600461359d565b611c17565b348015610c2c57600080fd5b50610520610c3b366004613962565b60116020526000908152604090205460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610c755750610c7582611caf565b92915050565b606060008054610c8a90613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb690613f0e565b8015610d035780601f10610cd857610100808354040283529160200191610d03565b820191906000526020600020905b815481529060010190602001808311610ce657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d8b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60ff8281166000908152601560209081526040808320338452909152812054909190811690831611610ddb57506000610c75565b60ff8381166000908152600f6020526040902054610dfb91841690613e89565b9392505050565b6000610e0d826115c3565b9050806001600160a01b0316836001600160a01b03161415610e7b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d82565b336001600160a01b0382161480610e975750610e978133610bbd565b610f095760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d82565b610f138383611cff565b505050565b600a546001600160a01b03163314610f425760405162461bcd60e51b8152600401610d8290613d3d565b600a805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b6001600160a01b0381166000908152601a6020526040902054610f995760405162461bcd60e51b8152600401610d8290613cac565b6000610fa460195490565b610fae9047613e3e565b90506000610fdb8383610fd6866001600160a01b03166000908152601b602052604090205490565b611d6d565b905080610ffa5760405162461bcd60e51b8152600401610d8290613cf2565b6001600160a01b0383166000908152601b602052604081208054839290611022908490613e3e565b92505081905550806019600082825461103b9190613e3e565b9091555061104b90508382611db3565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b61109c3382611ecc565b6110b85760405162461bcd60e51b8152600401610d8290613d72565b610f13838383611fc2565b600a546001600160a01b031633146110ed5760405162461bcd60e51b8152600401610d8290613d3d565b610f1383838361216d565b60006111038361163a565b82106111655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d82565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146111b85760405162461bcd60e51b8152600401610d8290613d3d565b600a54600160b81b900460ff166111de57600a805460ff60b81b1916600160b81b179055565b600a805460ff60b81b1916905560005b50565b610f138383836040518060200160405280600081525061188c565b606060006112198361163a565b905060008167ffffffffffffffff81111561123657611236614006565b60405190808252806020026020018201604052801561125f578160200160208202803683370190505b50905060005b828110156112a65761127785826110f8565b82828151811061128957611289613ff0565b60209081029190910101528061129e81613f65565b915050611265565b509392505050565b6001600160a01b0381166000908152601a60205260409020546112e35760405162461bcd60e51b8152600401610d8290613cac565b6001600160a01b0382166000908152601d60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561133b57600080fd5b505afa15801561134f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611373919061397b565b61137d9190613e3e565b905060006113b68383610fd687876001600160a01b039182166000908152601e6020908152604080832093909416825291909152205490565b9050806113d55760405162461bcd60e51b8152600401610d8290613cf2565b6001600160a01b038085166000908152601e602090815260408083209387168352929052908120805483929061140c908490613e3e565b90915550506001600160a01b0384166000908152601d602052604081208054839290611439908490613e3e565b9091555061144a90508484836122e8565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60006114a160085490565b82106115045760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d82565b6008828154811061151757611517613ff0565b90600052602060002001549050919050565b6013602052600090815260409020805461154290613f0e565b80601f016020809104026020016040519081016040528092919081815260200182805461156e90613f0e565b80156115bb5780601f10611590576101008083540402835291602001916115bb565b820191906000526020600020905b81548152906001019060200180831161159e57829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b031680610c755760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d82565b60006001600160a01b0382166116a55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d82565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146116eb5760405162461bcd60e51b8152600401610d8290613d3d565b6116f5600061233a565b565b600a546001600160a01b031633146117215760405162461bcd60e51b8152600401610d8290613d3d565b61172b828261238c565b5050565b6000601c828154811061174457611744613ff0565b6000918252602090912001546001600160a01b031692915050565b600d818154811061176f57600080fd5b90600052602060002001600091509050805461154290613f0e565b600a546001600160a01b031633146117b45760405162461bcd60e51b8152600401610d8290613d3d565b60008052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37555565b606060018054610c8a90613f0e565b600a546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610d8290613d3d565b60008281526013602090815260409091208251610f13928401906132e4565b6111ee600082612427565b61172b338383612528565b600a546001600160a01b031633146118795760405162461bcd60e51b8152600401610d8290613d3d565b805161172b90600d906020840190613368565b6118963383611ecc565b6118b25760405162461bcd60e51b8152600401610d8290613d72565b6118be848484846125f7565b50505050565b600b805461154290613f0e565b6000818152600260205260409020546060906001600160a01b03166119215760405162461bcd60e51b8152600401610d82906020808252600490820152634552333960e01b604082015260600190565b600061192b611a60565b60008481526011602052604090205490915060ff16600414156119b5576000838152601360205260408120805461196190613f0e565b90501161197d5760405180602001604052806000815250610dfb565b600083815260136020908152604091829020915161199f9291600b9101613b4f565b6040516020818303038152906040529392505050565b6000838152601160205260408120548251839160ff169081106119da576119da613ff0565b602002602001015151116119fd5760405180602001604052806000815250610dfb565b6000838152601160205260409020548151829160ff16908110611a2257611a22613ff0565b6020026020010151611a46601260008681526020019081526020016000205461262a565b600b60405160200161199f93929190613b1d565b50919050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015611b30578382906000526020600020018054611aa390613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611acf90613f0e565b8015611b1c5780601f10611af157610100808354040283529160200191611b1c565b820191906000526020600020905b815481529060010190602001808311611aff57829003601f168201915b505050505081526020019060010190611a84565b50505050905090565b600a546001600160a01b03163314611b635760405162461bcd60e51b8152600401610d8290613d3d565b600a54600160b01b900460ff16611b8957600a805460ff60b01b1916600160b01b179055565b600a805460ff60b01b19169055565b600a546001600160a01b03163314611bc25760405162461bcd60e51b8152600401610d8290613d3d565b610f13838383612728565b600a546001600160a01b03163314611bf75760405162461bcd60e51b8152600401610d8290613d3d565b805161172b90600b9060208401906132e4565b600c805461154290613f0e565b600a546001600160a01b03163314611c415760405162461bcd60e51b8152600401610d8290613d3d565b6001600160a01b038116611ca65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d82565b6111ee8161233a565b60006001600160e01b031982166380ac58cd60e01b1480611ce057506001600160e01b03198216635b5e139f60e01b145b80610c7557506301ffc9a760e01b6001600160e01b0319831614610c75565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d34826115c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6018546001600160a01b0384166000908152601a602052604081205490918391611d979086613e89565b611da19190613e75565b611dab9190613ecb565b949350505050565b80471015611e035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d82565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e50576040519150601f19603f3d011682016040523d82523d6000602084013e611e55565b606091505b5050905080610f135760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d82565b6000818152600260205260408120546001600160a01b0316611f455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d82565b6000611f50836115c3565b9050806001600160a01b0316846001600160a01b03161480611f8b5750836001600160a01b0316611f8084610d0d565b6001600160a01b0316145b80611dab57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316611fd5826115c3565b6001600160a01b03161461203d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d82565b6001600160a01b03821661209f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d82565b6120aa8383836127f7565b6120b5600082611cff565b6001600160a01b03831660009081526003602052604081208054600192906120de908490613ecb565b90915550506001600160a01b038216600090815260036020526040812080546001929061210c908490613e3e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b83518161ffff1610156118be57828161ffff168151811061219357612193613ff0565b602002602001015160ff1660176000848461ffff16815181106121b8576121b8613ff0565b602002602001015160ff1660ff1681526020019081526020016000206000868461ffff16815181106121ec576121ec613ff0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff191661ffff92831617905583518491831690811061223457612234613ff0565b602002602001015160ff1660166000848461ffff168151811061225957612259613ff0565b60209081029190910181015160ff16825281019190915260400160002054612285919061ffff16613e18565b60166000848461ffff168151811061229f5761229f613ff0565b602002602001015160ff1660ff16815260200190815260200160002060006101000a81548161ffff021916908361ffff16021790555080806122e090613f43565b915050612170565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f139084906128af565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b82518161ffff161015610f1357818161ffff16815181106123b2576123b2613ff0565b602002602001015160146000858461ffff16815181106123d4576123d4613ff0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061241f90613f43565b91505061238f565b61242f612981565b600a54612448908290600160a01b900461ffff166129d9565b60008160ff1661245760085490565b6124619190613e3e565b905061246c81612a19565b612479838360ff16612a54565b60ff83811660009081526015602090815260408083203384529091529020548116908316116124d45760ff83811660009081526015602090815260408083203384529091529020805460ff19169184169190911790556124ff565b60ff8381166000908152600f60205260409020546124ff9134916124fa91861690613e89565b612c5e565b60005b8260ff168110156118be5761251684612c97565b8061252081613f65565b915050612502565b816001600160a01b0316836001600160a01b0316141561258a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d82565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612602848484611fc2565b61260e84848484612d3c565b6118be5760405162461bcd60e51b8152600401610d8290613c5a565b60608161264e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612678578061266281613f65565b91506126719050600a83613e75565b9150612652565b60008167ffffffffffffffff81111561269357612693614006565b6040519080825280601f01601f1916602001820160405280156126bd576020820181803683370190505b5090505b8415611dab576126d2600183613ecb565b91506126df600a86613f9a565b6126ea906030613e3e565b60f81b8183815181106126ff576126ff613ff0565b60200101906001600160f81b031916908160001a905350612721600a86613e75565b94506126c1565b60005b83518161ffff1610156118be57828161ffff168151811061274e5761274e613ff0565b602002602001015160156000848461ffff168151811061277057612770613ff0565b602002602001015160ff1660ff1681526020019081526020016000206000868461ffff16815181106127a4576127a4613ff0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806127ef90613f43565b91505061272b565b6001600160a01b0383166128525761284d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612875565b816001600160a01b0316836001600160a01b031614612875576128758382612e49565b6001600160a01b03821661288c57610f1381612ee6565b826001600160a01b0316826001600160a01b031614610f1357610f138282612f95565b6000612904826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fd99092919063ffffffff16565b805190915015610f13578080602001905181019061292291906138b2565b610f135760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d82565b600a54600160b81b900460ff1615806129a45750600a546001600160a01b031633145b6116f55760405162461bcd60e51b8152600401610d82906020808252600490820152634552333560e01b604082015260600190565b8061ffff168260ff16111561172b5760405162461bcd60e51b8152600401610d829060208082526004908201526311548ccd60e21b604082015260600190565b6109c48111156111ee5760405162461bcd60e51b8152600401610d829060208082526004908201526308aa466760e31b604082015260600190565b60ff82166000818152601760209081526040808320338085529083528184205494845260168352818420546010909352922054919261ffff90811692918116911682612b1357612aa48282613ea8565b60ff87166000908152600e602052604090205461ffff91821691612ad1919088169063ffffffff16613e56565b63ffffffff161115612b0e5760405162461bcd60e51b8152600401610d829060208082526004908201526322a9199b60e11b604082015260600190565b612c56565b60ff86166000908152600e602052604090205461ffff80831691612b3f9188169063ffffffff16613e56565b63ffffffff161115612b7c5760405162461bcd60e51b8152600401610d82906020808252600490820152634552333760e01b604082015260600190565b8261ffff168561ffff1610612be157612b958383613ea8565b60ff87166000908152601660209081526040808320805461ffff9590951661ffff19958616179055601782528083206001600160a01b0389168452909152902080549091169055612c56565b612beb8583613ea8565b60ff87166000908152601660205260409020805461ffff191661ffff92909216919091179055612c1b8584613ea8565b60ff871660009081526017602090815260408083206001600160a01b03891684529091529020805461ffff191661ffff929092169190911790555b505050505050565b8082101561172b5760405162461bcd60e51b8152600401610d82906020808252600490820152634552333360e01b604082015260600190565b6000612ca260085490565b612cad906001613e3e565b6000818152601160209081526040808320805460ff191660ff88169081179091558352600e9091528120805492935063ffffffff9092169190612cef83613f80565b82546101009290920a63ffffffff81810219909316918316021790915560ff84166000908152600e60209081526040808320548684526012909252909120911690555061172b3382612fe8565b60006001600160a01b0384163b15612e3e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d80903390899088908890600401613b64565b602060405180830381600087803b158015612d9a57600080fd5b505af1925050508015612dca575060408051601f3d908101601f19168201909252612dc7918101906138ec565b60015b612e24573d808015612df8576040519150601f19603f3d011682016040523d82523d6000602084013e612dfd565b606091505b508051612e1c5760405162461bcd60e51b8152600401610d8290613c5a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dab565b506001949350505050565b60006001612e568461163a565b612e609190613ecb565b600083815260076020526040902054909150808214612eb3576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612ef890600190613ecb565b60008381526009602052604081205460088054939450909284908110612f2057612f20613ff0565b906000526020600020015490508060088381548110612f4157612f41613ff0565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f7957612f79613fda565b6001900381819060005260206000200160009055905550505050565b6000612fa08361163a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060611dab8484600085613002565b61172b82826040518060200160405280600081525061312a565b6060824710156130635760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d82565b843b6130b15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d82565b600080866001600160a01b031685876040516130cd9190613b01565b60006040518083038185875af1925050503d806000811461310a576040519150601f19603f3d011682016040523d82523d6000602084013e61310f565b606091505b509150915061311f82828661315d565b979650505050505050565b6131348383613196565b6131416000848484612d3c565b610f135760405162461bcd60e51b8152600401610d8290613c5a565b6060831561316c575081610dfb565b82511561317c5782518084602001fd5b8160405162461bcd60e51b8152600401610d829190613c47565b6001600160a01b0382166131ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d82565b6000818152600260205260409020546001600160a01b0316156132515760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d82565b61325d600083836127f7565b6001600160a01b0382166000908152600360205260408120805460019290613286908490613e3e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546132f090613f0e565b90600052602060002090601f0160209004810192826133125760008555613358565b82601f1061332b57805160ff1916838001178555613358565b82800160010185558215613358579182015b8281111561335857825182559160200191906001019061333d565b506133649291506133c1565b5090565b8280548282559060005260206000209081019282156133b5579160200282015b828111156133b557825180516133a59184916020909101906132e4565b5091602001919060010190613388565b506133649291506133d6565b5b8082111561336457600081556001016133c2565b808211156133645760006133ea82826133f3565b506001016133d6565b5080546133ff90613f0e565b6000825580601f1061340f575050565b601f0160209004906000526020600020908101906111ee91906133c1565b600067ffffffffffffffff83111561344757613447614006565b61345a601f8401601f1916602001613dc3565b905082815283838301111561346e57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261349657600080fd5b813560206134ab6134a683613df4565b613dc3565b80838252828201915082860187848660051b89010111156134cb57600080fd5b60005b858110156134f35781356134e18161401c565b845292840192908401906001016134ce565b5090979650505050505050565b600082601f83011261351157600080fd5b813560206135216134a683613df4565b80838252828201915082860187848660051b890101111561354157600080fd5b60005b858110156134f35761355582613587565b84529284019290840190600101613544565b600082601f83011261357857600080fd5b610dfb8383356020850161342d565b803560ff8116811461359857600080fd5b919050565b6000602082840312156135af57600080fd5b8135610dfb8161401c565b600080604083850312156135cd57600080fd5b82356135d88161401c565b915060208301356135e88161401c565b809150509250929050565b60008060006060848603121561360857600080fd5b83356136138161401c565b925060208401356136238161401c565b929592945050506040919091013590565b6000806000806080858703121561364a57600080fd5b84356136558161401c565b935060208501356136658161401c565b925060408501359150606085013567ffffffffffffffff81111561368857600080fd5b8501601f8101871361369957600080fd5b6136a88782356020840161342d565b91505092959194509250565b600080604083850312156136c757600080fd5b82356136d28161401c565b915060208301356135e881614031565b600080604083850312156136f557600080fd5b82356137008161401c565b946020939093013593505050565b6000806040838503121561372157600080fd5b823567ffffffffffffffff8082111561373957600080fd5b61374586838701613485565b9350602085013591508082111561375b57600080fd5b5061376885828601613500565b9150509250929050565b60008060006060848603121561378757600080fd5b833567ffffffffffffffff8082111561379f57600080fd5b6137ab87838801613485565b945060208601359150808211156137c157600080fd5b6137cd87838801613500565b935060408601359150808211156137e357600080fd5b506137f086828701613500565b9150509250925092565b6000602080838503121561380d57600080fd5b823567ffffffffffffffff8082111561382557600080fd5b818501915085601f83011261383957600080fd5b81356138476134a682613df4565b80828252858201915085850189878560051b880101111561386757600080fd5b6000805b858110156138a257823587811115613881578283fd5b61388f8d8b838c0101613567565b865250938801939188019160010161386b565b50919a9950505050505050505050565b6000602082840312156138c457600080fd5b8151610dfb81614031565b6000602082840312156138e157600080fd5b8135610dfb8161403f565b6000602082840312156138fe57600080fd5b8151610dfb8161403f565b60006020828403121561391b57600080fd5b813567ffffffffffffffff81111561393257600080fd5b611dab84828501613567565b60006020828403121561395057600080fd5b813561ffff81168114610dfb57600080fd5b60006020828403121561397457600080fd5b5035919050565b60006020828403121561398d57600080fd5b5051919050565b600080604083850312156139a757600080fd5b82359150602083013567ffffffffffffffff8111156139c557600080fd5b61376885828601613567565b6000602082840312156139e357600080fd5b610dfb82613587565b600080604083850312156139ff57600080fd5b6135d883613587565b60008060408385031215613a1b57600080fd5b613a2483613587565b9150613a3260208401613587565b90509250929050565b60008151808452613a53816020860160208601613ee2565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613a8157607f831692505b6020808410821415613aa357634e487b7160e01b600052602260045260246000fd5b818015613ab75760018114613ac857613af5565b60ff19861689528489019650613af5565b60008881526020902060005b86811015613aed5781548b820152908501908301613ad4565b505084890196505b50505050505092915050565b60008251613b13818460208701613ee2565b9190910192915050565b60008451613b2f818460208901613ee2565b845190830190613b43818360208901613ee2565b61311f81830186613a67565b6000611dab613b5e8386613a67565b84613a67565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613b9790830184613a3b565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613bf657603f19888603018452613be4858351613a3b565b94509285019290850190600101613bc8565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c3b57835183529284019291840191600101613c1f565b50909695505050505050565b602081526000610dfb6020830184613a3b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613dec57613dec614006565b604052919050565b600067ffffffffffffffff821115613e0e57613e0e614006565b5060051b60200190565b600061ffff808316818516808303821115613e3557613e35613fae565b01949350505050565b60008219821115613e5157613e51613fae565b500190565b600063ffffffff808316818516808303821115613e3557613e35613fae565b600082613e8457613e84613fc4565b500490565b6000816000190483118215151615613ea357613ea3613fae565b500290565b600061ffff83811690831681811015613ec357613ec3613fae565b039392505050565b600082821015613edd57613edd613fae565b500390565b60005b83811015613efd578181015183820152602001613ee5565b838111156118be5750506000910152565b600181811c90821680613f2257607f821691505b60208210811415611a5a57634e487b7160e01b600052602260045260246000fd5b600061ffff80831681811415613f5b57613f5b613fae565b6001019392505050565b6000600019821415613f7957613f79613fae565b5060010190565b600063ffffffff80831681811415613f5b57613f5b613fae565b600082613fa957613fa9613fc4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111ee57600080fd5b80151581146111ee57600080fd5b6001600160e01b0319811681146111ee57600080fdfea264697066735822122075328fc83f2435d9820a5a085891fe5572233164a6fc9d32b699f5a27074be4964736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000a4e4654434354696765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e46544343540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d56347036463766626f6161327a5442776542324d44524d665268424473674e4e454532445539576f416f54542f00000000000000000000000000000000000000000000000000000000000000000000000000000000003c697066733a2f2f516d56347036463766626f6161327a5442776542324d44524d665268424473674e4e454532445539576f416f54542f312e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000734dfca0814b5783a1265ffc9b65e5564f1aeaac00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _name (string): NFTCCTiger
Arg [1] : _symbol (string): NFTCCT
Arg [2] : _initBaseURIs (string[]): ipfs://QmV4p6F7fboaa2zTBweB2MDRMfRhBDsgNNEE2DU9WoAoTT/
Arg [3] : _placeHolderURL (string): ipfs://QmV4p6F7fboaa2zTBweB2MDRMfRhBDsgNNEE2DU9WoAoTT/1.json
Arg [4] : payees (address[]): 0x734dFCA0814B5783a1265fFc9B65E5564F1AEaac
Arg [5] : shares_ (uint256[]): 1

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [7] : 4e46544343546967657200000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [9] : 4e46544343540000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [13] : 697066733a2f2f516d56347036463766626f6161327a5442776542324d44524d
Arg [14] : 665268424473674e4e454532445539576f416f54542f00000000000000000000
Arg [15] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [16] : 697066733a2f2f516d56347036463766626f6161327a5442776542324d44524d
Arg [17] : 665268424473674e4e454532445539576f416f54542f312e6a736f6e00000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [19] : 000000000000000000000000734dfca0814b5783a1265ffc9b65e5564f1aeaac
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed Bytecode Sourcemap

53437:14825:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68217:40;12608:10;68217:40;;;-1:-1:-1;;;;;14179:32:1;;;14161:51;;68247:9:0;14243:2:1;14228:18;;14221:34;14134:18;68217:40:0;;;;;;;53437:14825;;;38266:224;;;;;;;;;;-1:-1:-1;38266:224:0;;;;;:::i;:::-;;:::i;:::-;;;16647:14:1;;16640:22;16622:41;;16610:2;16595:18;38266:224:0;;;;;;;;25760:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27319:221::-;;;;;;;;;;-1:-1:-1;27319:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13935:32:1;;;13917:51;;13905:2;13890:18;27319:221:0;13771:203:1;58150:275:0;;;;;;;;;;-1:-1:-1;58150:275:0;;;;;:::i;:::-;;:::i;:::-;;;29132:25:1;;;29120:2;29105:18;58150:275:0;28986:177:1;26842:411:0;;;;;;;;;;-1:-1:-1;26842:411:0;;;;;:::i;:::-;;:::i;53790:58::-;;;;;;;;;;-1:-1:-1;53790:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29342:10:1;29330:23;;;29312:42;;29300:2;29285:18;53790:58:0;29168:192:1;61112:93:0;;;;;;;;;;-1:-1:-1;61112:93:0;;;;;:::i;:::-;;:::i;54179:48::-;;;;;;;;;;-1:-1:-1;54179:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29537:4:1;29525:17;;;29507:36;;29495:2;29480:18;54179:48:0;29365:184:1;38906:113:0;;;;;;;;;;-1:-1:-1;38994:10:0;:17;38906:113;;65572:566;;;;;;;;;;-1:-1:-1;65572:566:0;;;;;:::i;:::-;;:::i;28069:339::-;;;;;;;;;;-1:-1:-1;28069:339:0;;;;;:::i;:::-;;:::i;55755:257::-;;;;;;;;;;-1:-1:-1;55755:257:0;;;;;:::i;:::-;;:::i;38574:256::-;;;;;;;;;;-1:-1:-1;38574:256:0;;;;;:::i;:::-;;:::i;53561:41::-;;;;;;;;;;;;53597:5;53561:41;;;;;28967:6:1;28955:19;;;28937:38;;28925:2;28910:18;53561:41:0;28793:188:1;60750:117:0;;;;;;;;;;;;;:::i;53524:30::-;;;;;;;;;;-1:-1:-1;53524:30:0;;;;-1:-1:-1;;;53524:30:0;;;;;;63917:91;;;;;;;;;;-1:-1:-1;63988:12:0;;63917:91;;65046:135;;;;;;;;;;-1:-1:-1;65046:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;65143:21:0;;;65116:7;65143:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;65046:135;28479:185;;;;;;;;;;-1:-1:-1;28479:185:0;;;;;:::i;:::-;;:::i;59577:388::-;;;;;;;;;;-1:-1:-1;59577:388:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66406:641::-;;;;;;;;;;-1:-1:-1;66406:641:0;;;;;:::i;:::-;;:::i;54674:71::-;;;;;;;;;;-1:-1:-1;54674:71:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;39096:233;;;;;;;;;;-1:-1:-1;39096:233:0;;;;;:::i;:::-;;:::i;54064:45::-;;;;;;;;;;-1:-1:-1;54064:45:0;;;;;:::i;:::-;;:::i;53644:25::-;;;;;;;;;;-1:-1:-1;53644:25:0;;;;-1:-1:-1;;;53644:25:0;;;;;;25454:239;;;;;;;;;;-1:-1:-1;25454:239:0;;;;;:::i;:::-;;:::i;53901:53::-;;;;;;;;;;-1:-1:-1;53901:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25184:208;;;;;;;;;;-1:-1:-1;25184:208:0;;;;;:::i;:::-;;:::i;14455:103::-;;;;;;;;;;;;;:::i;54754:185::-;;;;;;;;;;-1:-1:-1;54754:185:0;;;;;:::i;:::-;;:::i;65272:100::-;;;;;;;;;;-1:-1:-1;65272:100:0;;;;;:::i;:::-;;:::i;13804:87::-;;;;;;;;;;-1:-1:-1;13877:6:0;;-1:-1:-1;;;;;13877:6:0;13804:87;;53855:37;;;;;;;;;;-1:-1:-1;53855:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;53757:24;;;;;;;;;;-1:-1:-1;53757:24:0;;;;;:::i;:::-;;:::i;59457:112::-;;;;;;;;;;-1:-1:-1;59457:112:0;;;;;:::i;:::-;;:::i;54326:68::-;;;;;;;;;;-1:-1:-1;54326:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;25929:104;;;;;;;;;;;;;:::i;64768:109::-;;;;;;;;;;-1:-1:-1;64768:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;64851:18:0;64824:7;64851:18;;;:9;:18;;;;;;;64768:109;61211:111;;;;;;;;;;-1:-1:-1;61211:111:0;;;;;:::i;:::-;;:::i;57293:74::-;;;;;;:::i;:::-;;:::i;54514:49::-;;;;;;;;;;-1:-1:-1;54514:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27612:155;;;;;;;;;;-1:-1:-1;27612:155:0;;;;;:::i;:::-;;:::i;61012:94::-;;;;;;;;;;-1:-1:-1;61012:94:0;;;;;:::i;:::-;;:::i;53609:28::-;;;;;;;;;;-1:-1:-1;53609:28:0;;;;-1:-1:-1;;;53609:28:0;;;;;;28735:328;;;;;;;;;;-1:-1:-1;28735:328:0;;;;;:::i;:::-;;:::i;53678:37::-;;;;;;;;;;;;;:::i;59973:751::-;;;;;;;;;;-1:-1:-1;59973:751:0;;;;;:::i;:::-;;:::i;57184:101::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54015:42::-;;;;;;;;;;-1:-1:-1;54015:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;64564:105;;;;;;;;;;-1:-1:-1;64564:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;64645:16:0;64618:7;64645:16;;;:7;:16;;;;;;;64564:105;60875:129;;;;;;;;;;;;;:::i;55196:242::-;;;;;;;;;;-1:-1:-1;55196:242:0;;;;;:::i;:::-;;:::i;64354:119::-;;;;;;;;;;-1:-1:-1;64354:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;64439:26:0;64412:7;64439:26;;;:19;:26;;;;;;;64354:119;61328:112;;;;;;;;;;-1:-1:-1;61328:112:0;;;;;:::i;:::-;;:::i;64102:95::-;;;;;;;;;;-1:-1:-1;64175:14:0;;64102:95;;27838:164;;;;;;;;;;-1:-1:-1;27838:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27959:25:0;;;27935:4;27959:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27838:164;53722:28;;;;;;;;;;;;;:::i;14713:201::-;;;;;;;;;;-1:-1:-1;14713:201:0;;;;;:::i;:::-;;:::i;53961:47::-;;;;;;;;;;-1:-1:-1;53961:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38266:224;38368:4;-1:-1:-1;;;;;;38392:50:0;;-1:-1:-1;;;38392:50:0;;:90;;;38446:36;38470:11;38446:23;:36::i;:::-;38385:97;38266:224;-1:-1:-1;;38266:224:0:o;25760:100::-;25814:13;25847:5;25840:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25760:100;:::o;27319:221::-;27395:7;30662:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30662:16:0;27415:73;;;;-1:-1:-1;;;27415:73:0;;24481:2:1;27415:73:0;;;24463:21:1;24520:2;24500:18;;;24493:30;24559:34;24539:18;;;24532:62;-1:-1:-1;;;24610:18:1;;;24603:42;24662:19;;27415:73:0;;;;;;;;;-1:-1:-1;27508:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27508:24:0;;27319:221::o;58150:275::-;58265:32;;;;58226:13;58265:32;;;:17;:32;;;;;;;;12608:10;58265:46;;;;;;;;58226:13;;58265:46;;;58254:57;;;;58251:167;;-1:-1:-1;58334:1:0;58327:8;;58251:167;58376:29;:19;;;;;;;:4;:19;;;;;;:29;;;;;;:::i;:::-;58368:38;58150:275;-1:-1:-1;;;58150:275:0:o;26842:411::-;26923:13;26939:23;26954:7;26939:14;:23::i;:::-;26923:39;;26987:5;-1:-1:-1;;;;;26981:11:0;:2;-1:-1:-1;;;;;26981:11:0;;;26973:57;;;;-1:-1:-1;;;26973:57:0;;25997:2:1;26973:57:0;;;25979:21:1;26036:2;26016:18;;;26009:30;26075:34;26055:18;;;26048:62;-1:-1:-1;;;26126:18:1;;;26119:31;26167:19;;26973:57:0;25795:397:1;26973:57:0;12608:10;-1:-1:-1;;;;;27065:21:0;;;;:62;;-1:-1:-1;27090:37:0;27107:5;12608:10;27838:164;:::i;27090:37::-;27043:168;;;;-1:-1:-1;;;27043:168:0;;22874:2:1;27043:168:0;;;22856:21:1;22913:2;22893:18;;;22886:30;22952:34;22932:18;;;22925:62;23023:26;23003:18;;;22996:54;23067:19;;27043:168:0;22672:420:1;27043:168:0;27224:21;27233:2;27237:7;27224:8;:21::i;:::-;26912:341;26842:411;;:::o;61112:93::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;61176:10:::1;:27:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;61176:27:0::1;-1:-1:-1::0;;;;61176:27:0;;::::1;::::0;;;::::1;::::0;;61112:93::o;65572:566::-;-1:-1:-1;;;;;65648:16:0;;65667:1;65648:16;;;:7;:16;;;;;;65640:71;;;;-1:-1:-1;;;65640:71:0;;;;;;;:::i;:::-;65724:21;65772:15;64175:14;;;64102:95;65772:15;65748:39;;:21;:39;:::i;:::-;65724:63;;65798:15;65816:58;65832:7;65841:13;65856:17;65865:7;-1:-1:-1;;;;;64851:18:0;64824:7;64851:18;;;:9;:18;;;;;;;64768:109;65856:17;65816:15;:58::i;:::-;65798:76;-1:-1:-1;65895:12:0;65887:68;;;;-1:-1:-1;;;65887:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65968:18:0;;;;;;:9;:18;;;;;:29;;65990:7;;65968:18;:29;;65990:7;;65968:29;:::i;:::-;;;;;;;;66026:7;66008:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;66046:35:0;;-1:-1:-1;66064:7:0;66073;66046:17;:35::i;:::-;66097:33;;;-1:-1:-1;;;;;14179:32:1;;14161:51;;14243:2;14228:18;;14221:34;;;66097:33:0;;14134:18:1;66097:33:0;;;;;;;65629:509;;65572:566;:::o;28069:339::-;28264:41;12608:10;28297:7;28264:18;:41::i;:::-;28256:103;;;;-1:-1:-1;;;28256:103:0;;;;;;;:::i;:::-;28372:28;28382:4;28388:2;28392:7;28372:9;:28::i;55755:257::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;55940:64:::1;55976:4;55981:5;55987:16;55940:35;:64::i;38574:256::-:0;38671:7;38707:23;38724:5;38707:16;:23::i;:::-;38699:5;:31;38691:87;;;;-1:-1:-1;;;38691:87:0;;17432:2:1;38691:87:0;;;17414:21:1;17471:2;17451:18;;;17444:30;17510:34;17490:18;;;17483:62;-1:-1:-1;;;17561:18:1;;;17554:41;17612:19;;38691:87:0;17230:407:1;38691:87:0;-1:-1:-1;;;;;;38796:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38574:256::o;60750:117::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;60804:6:::1;::::0;-1:-1:-1;;;60804:6:0;::::1;;;:55;;60846:6;:13:::0;;-1:-1:-1;;;;60846:13:0::1;-1:-1:-1::0;;;60846:13:0::1;::::0;;60750:117::o;60804:55::-:1;60821:6;:14:::0;;-1:-1:-1;;;;60821:14:0::1;::::0;;60830:5:::1;60804:55;;60750:117::o:0;28479:185::-;28617:39;28634:4;28640:2;28644:7;28617:39;;;;;;;;;;;;:16;:39::i;59577:388::-;59664:16;59698:23;59724:17;59734:6;59724:9;:17::i;:::-;59698:43;;59752:25;59794:15;59780:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59780:30:0;;59752:58;;59826:9;59821:111;59841:15;59837:1;:19;59821:111;;;59890:30;59910:6;59918:1;59890:19;:30::i;:::-;59876:8;59885:1;59876:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;59858:3;;;;:::i;:::-;;;;59821:111;;;-1:-1:-1;59949:8:0;59577:388;-1:-1:-1;;;59577:388:0:o;66406:641::-;-1:-1:-1;;;;;66488:16:0;;66507:1;66488:16;;;:7;:16;;;;;;66480:71;;;;-1:-1:-1;;;66480:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64439:26:0;;66564:21;64439:26;;;:19;:26;;;;;;66588:30;;-1:-1:-1;;;66588:30:0;;66612:4;66588:30;;;13917:51:1;-1:-1:-1;;;;;66588:15:0;;;;;13890:18:1;;66588:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;66564:77;;66652:15;66670:65;66686:7;66695:13;66710:24;66719:5;66726:7;-1:-1:-1;;;;;65143:21:0;;;65116:7;65143:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;65046:135;66670:65;66652:83;-1:-1:-1;66756:12:0;66748:68;;;;-1:-1:-1;;;66748:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66829:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;66863:7;;66829:21;:41;;66863:7;;66829:41;:::i;:::-;;;;-1:-1:-1;;;;;;;66881:26:0;;;;;;:19;:26;;;;;:37;;66911:7;;66881:26;:37;;66911:7;;66881:37;:::i;:::-;;;;-1:-1:-1;66931:47:0;;-1:-1:-1;66954:5:0;66961:7;66970;66931:22;:47::i;:::-;66994:45;;;-1:-1:-1;;;;;14179:32:1;;;14161:51;;14243:2;14228:18;;14221:34;;;66994:45:0;;;;;14134:18:1;66994:45:0;;;;;;;66469:578;;66406:641;;:::o;39096:233::-;39171:7;39207:30;38994:10;:17;;38906:113;39207:30;39199:5;:38;39191:95;;;;-1:-1:-1;;;39191:95:0;;27839:2:1;39191:95:0;;;27821:21:1;27878:2;27858:18;;;27851:30;27917:34;27897:18;;;27890:62;-1:-1:-1;;;27968:18:1;;;27961:42;28020:19;;39191:95:0;27637:408:1;39191:95:0;39304:10;39315:5;39304:17;;;;;;;;:::i;:::-;;;;;;;;;39297:24;;39096:233;;;:::o;54064:45::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25454:239::-;25526:7;25562:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25562:16:0;25597:19;25589:73;;;;-1:-1:-1;;;25589:73:0;;23710:2:1;25589:73:0;;;23692:21:1;23749:2;23729:18;;;23722:30;23788:34;23768:18;;;23761:62;-1:-1:-1;;;23839:18:1;;;23832:39;23888:19;;25589:73:0;23508:405:1;25184:208:0;25256:7;-1:-1:-1;;;;;25284:19:0;;25276:74;;;;-1:-1:-1;;;25276:74:0;;23299:2:1;25276:74:0;;;23281:21:1;23338:2;23318:18;;;23311:30;23377:34;23357:18;;;23350:62;-1:-1:-1;;;23428:18:1;;;23421:40;23478:19;;25276:74:0;23097:406:1;25276:74:0;-1:-1:-1;;;;;;25368:16:0;;;;;:9;:16;;;;;;;25184:208::o;14455:103::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;14520:30:::1;14547:1;14520:18;:30::i;:::-;14455:103::o:0;54754:185::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;54887:44:::1;54919:4;54925:5;54887:31;:44::i;:::-;54754:185:::0;;:::o;65272:100::-;65323:7;65350;65358:5;65350:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;65350:14:0;;65272:100;-1:-1:-1;;65272:100:0:o;53757:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59457:112::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;59541:7:::1;::::0;;:4:::1;:7;::::0;;:20;59457:112::o;25929:104::-;25985:13;26018:7;26011:14;;;;;:::i;61211:111::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;61291:20:::1;::::0;;;:11:::1;:20;::::0;;;;;;;:29;;::::1;::::0;;::::1;::::0;::::1;:::i;57293:74::-:0;57340:24;57353:1;57356:7;57340:12;:24::i;27612:155::-;27707:52;12608:10;27740:8;27750;27707:18;:52::i;61012:94::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;61081:23;;::::1;::::0;:8:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;28735:328::-:0;28910:41;12608:10;28943:7;28910:18;:41::i;:::-;28902:103;;;;-1:-1:-1;;;28902:103:0;;;;;;;:::i;:::-;29016:39;29030:4;29036:2;29040:7;29049:5;29016:13;:39::i;:::-;28735:328;;;;:::o;53678:37::-;;;;;;;:::i;59973:751::-;30638:4;30662:16;;;:7;:16;;;;;;60091:13;;-1:-1:-1;;;;;30662:16:0;60122:70;;;;-1:-1:-1;;;60122:70:0;;;;;;27507:2:1;27489:21;;;27546:1;27526:18;;;27519:29;-1:-1:-1;;;27579:2:1;27564:18;;27557:34;27623:2;27608:18;;27305:327;60122:70:0;60205:30;60238:11;:9;:11::i;:::-;60264:23;;;;:14;:23;;;;;;60205:44;;-1:-1:-1;60264:23:0;;60291:1;60264:28;60260:457;;;60353:1;60322:20;;;:11;:20;;;;;60316:34;;;;;:::i;:::-;;;:38;:141;;;;;;;;;;;;;;;;;60398:20;;;;:11;:20;;;;;;;;;60381:53;;;;60398:20;60420:13;;60381:53;;:::i;:::-;;;;;;;;;;;;;60309:148;59973:751;-1:-1:-1;;;59973:751:0:o;60260:457::-;60553:1;60518:23;;;:14;:23;;;;;;60503:39;;:14;;60518:23;;;60503:39;;;;;;:::i;:::-;;;;;;;60497:53;:57;:208;;;;;;;;;;;;;;;;;60613:23;;;;:14;:23;;;;;;60598:39;;:14;;60613:23;;;60598:39;;;;;;:::i;:::-;;;;;;;60639:27;:7;:16;60647:7;60639:16;;;;;;;;;;;;:25;:27::i;:::-;60668:13;60581:101;;;;;;;;;;:::i;60260:457::-;60111:613;59973:751;;;:::o;57184:101::-;57234:15;57269:8;57262:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57184:101;:::o;60875:129::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;60932:9:::1;::::0;-1:-1:-1;;;60932:9:0;::::1;;;:64;;60980:9;:16:::0;;-1:-1:-1;;;;60980:16:0::1;-1:-1:-1::0;;;60980:16:0::1;::::0;;60750:117::o;60932:64::-:1;60952:9;:17:::0;;-1:-1:-1;;;;60952:17:0::1;::::0;;60875:129::o;55196:242::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;55375:55:::1;55402:4;55407:5;55413:16;55375:26;:55::i;61328:112::-:0;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;61405:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;53722:28::-:0;;;;;;;:::i;14713:201::-;13877:6;;-1:-1:-1;;;;;13877:6:0;12608:10;14024:23;14016:68;;;;-1:-1:-1;;;14016:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14802:22:0;::::1;14794:73;;;::::0;-1:-1:-1;;;14794:73:0;;18595:2:1;14794:73:0::1;::::0;::::1;18577:21:1::0;18634:2;18614:18;;;18607:30;18673:34;18653:18;;;18646:62;-1:-1:-1;;;18724:18:1;;;18717:36;18770:19;;14794:73:0::1;18393:402:1::0;14794:73:0::1;14878:28;14897:8;14878:18;:28::i;24815:305::-:0;24917:4;-1:-1:-1;;;;;;24954:40:0;;-1:-1:-1;;;24954:40:0;;:105;;-1:-1:-1;;;;;;;25011:48:0;;-1:-1:-1;;;25011:48:0;24954:105;:158;;;-1:-1:-1;;;;;;;;;;5046:40:0;;;25076:36;4937:157;34555:174;34630:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34630:29:0;-1:-1:-1;;;;;34630:29:0;;;;;;;;:24;;34684:23;34630:24;34684:14;:23::i;:::-;-1:-1:-1;;;;;34675:46:0;;;;;;;;;;;34555:174;;:::o;67225:248::-;67435:12;;-1:-1:-1;;;;;67415:16:0;;67371:7;67415:16;;;:7;:16;;;;;;67371:7;;67450:15;;67399:32;;:13;:32;:::i;:::-;67398:49;;;;:::i;:::-;:67;;;;:::i;:::-;67391:74;67225:248;-1:-1:-1;;;;67225:248:0:o;17414:317::-;17529:6;17504:21;:31;;17496:73;;;;-1:-1:-1;;;17496:73:0;;20952:2:1;17496:73:0;;;20934:21:1;20991:2;20971:18;;;20964:30;21030:31;21010:18;;;21003:59;21079:18;;17496:73:0;20750:353:1;17496:73:0;17583:12;17601:9;-1:-1:-1;;;;;17601:14:0;17623:6;17601:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17582:52;;;17653:7;17645:78;;;;-1:-1:-1;;;17645:78:0;;20525:2:1;17645:78:0;;;20507:21:1;20564:2;20544:18;;;20537:30;20603:34;20583:18;;;20576:62;20674:28;20654:18;;;20647:56;20720:19;;17645:78:0;20323:422:1;30867:348:0;30960:4;30662:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30662:16:0;30977:73;;;;-1:-1:-1;;;30977:73:0;;21717:2:1;30977:73:0;;;21699:21:1;21756:2;21736:18;;;21729:30;21795:34;21775:18;;;21768:62;-1:-1:-1;;;21846:18:1;;;21839:42;21898:19;;30977:73:0;21515:408:1;30977:73:0;31061:13;31077:23;31092:7;31077:14;:23::i;:::-;31061:39;;31130:5;-1:-1:-1;;;;;31119:16:0;:7;-1:-1:-1;;;;;31119:16:0;;:51;;;;31163:7;-1:-1:-1;;;;;31139:31:0;:20;31151:7;31139:11;:20::i;:::-;-1:-1:-1;;;;;31139:31:0;;31119:51;:87;;;-1:-1:-1;;;;;;27959:25:0;;;27935:4;27959:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31111:96;30867:348;-1:-1:-1;;;;30867:348:0:o;33859:578::-;34018:4;-1:-1:-1;;;;;33991:31:0;:23;34006:7;33991:14;:23::i;:::-;-1:-1:-1;;;;;33991:31:0;;33983:85;;;;-1:-1:-1;;;33983:85:0;;25255:2:1;33983:85:0;;;25237:21:1;25294:2;25274:18;;;25267:30;25333:34;25313:18;;;25306:62;-1:-1:-1;;;25384:18:1;;;25377:39;25433:19;;33983:85:0;25053:405:1;33983:85:0;-1:-1:-1;;;;;34087:16:0;;34079:65;;;;-1:-1:-1;;;34079:65:0;;19766:2:1;34079:65:0;;;19748:21:1;19805:2;19785:18;;;19778:30;19844:34;19824:18;;;19817:62;-1:-1:-1;;;19895:18:1;;;19888:34;19939:19;;34079:65:0;19564:400:1;34079:65:0;34157:39;34178:4;34184:2;34188:7;34157:20;:39::i;:::-;34261:29;34278:1;34282:7;34261:8;:29::i;:::-;-1:-1:-1;;;;;34303:15:0;;;;;;:9;:15;;;;;:20;;34322:1;;34303:15;:20;;34322:1;;34303:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34334:13:0;;;;;;:9;:13;;;;;:18;;34351:1;;34334:13;:18;;34351:1;;34334:18;:::i;:::-;;;;-1:-1:-1;;34363:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34363:21:0;-1:-1:-1;;;;;34363:21:0;;;;;;;;;34402:27;;34363:16;;34402:27;;;;;;;33859:578;;;:::o;56020:417::-;56202:8;56197:233;56220:4;:11;56216:1;:15;;;56197:233;;;56305:5;56311:1;56305:8;;;;;;;;;;:::i;:::-;;;;;;;56253:60;;:19;:40;56273:16;56290:1;56273:19;;;;;;;;;;:::i;:::-;;;;;;;56253:40;;;;;;;;;;;;;;;:49;56294:4;56299:1;56294:7;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;56253:49:0;;;;;;;;;;;-1:-1:-1;56253:49:0;:60;;-1:-1:-1;;56253:60:0;;;;;;;;56410:8;;;;;;;;;;;;;:::i;:::-;;;;;;;56369:49;;:17;:38;56387:16;56404:1;56387:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;56369:38;;;;;;;;;;;;-1:-1:-1;56369:38:0;;:49;;;:38;;:49;:::i;:::-;56328:17;:38;56346:16;56363:1;56346:19;;;;;;;;;;:::i;:::-;;;;;;;56328:38;;;;;;;;;;;;;;;;:90;;;;;;;;;;;;;;;;;;56233:3;;;;;:::i;:::-;;;;56197:233;;48007:211;48151:58;;;-1:-1:-1;;;;;14179:32:1;;48151:58:0;;;14161:51:1;14228:18;;;;14221:34;;;48151:58:0;;;;;;;;;;14134:18:1;;;;48151:58:0;;;;;;;;-1:-1:-1;;;;;48151:58:0;-1:-1:-1;;;48151:58:0;;;48124:86;;48144:5;;48124:19;:86::i;15074:191::-;15167:6;;;-1:-1:-1;;;;;15184:17:0;;;-1:-1:-1;;;;;;15184:17:0;;;;;;;15217:40;;15167:6;;;15184:17;15167:6;;15217:40;;15148:16;;15217:40;15137:128;15074:191;:::o;54947:241::-;55083:8;55078:103;55101:4;:11;55097:1;:15;;;55078:103;;;55161:5;55167:1;55161:8;;;;;;;;;;:::i;:::-;;;;;;;55134:15;:24;55150:4;55155:1;55150:7;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;55134:24:0;-1:-1:-1;;;;;55134:24:0;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;55114:3;;;;;:::i;:::-;;;;55078:103;;57390:752;57468:13;:11;:13::i;:::-;57514:10;;57492:33;;57505:7;;-1:-1:-1;;;57514:10:0;;;;57492:12;:33::i;:::-;57536:24;57579:7;57563:23;;:13;38994:10;:17;;38906:113;57563:13;:23;;;;:::i;:::-;57536:50;;57597:32;57612:16;57597:14;:32::i;:::-;57640:46;57663:13;57678:7;57640:46;;:22;:46::i;:::-;57766:32;;;;;;;;:17;:32;;;;;;;;12608:10;57766:46;;;;;;;;;;57755:57;;;;57752:290;;57886:32;;;;;;;;:17;:32;;;;;;;;12608:10;57886:46;;;;;;;:56;;-1:-1:-1;;57886:56:0;;;;;;;;;;57752:290;;;57999:29;:19;;;;;;;:4;:19;;;;;;57975:55;;57987:9;;57999:29;;;;;;:::i;:::-;57975:11;:55::i;:::-;58057:9;58052:83;58072:7;58068:11;;:1;:11;58052:83;;;58101:22;58109:13;58101:7;:22::i;:::-;58081:3;;;;:::i;:::-;;;;58052:83;;34871:315;35026:8;-1:-1:-1;;;;;35017:17:0;:5;-1:-1:-1;;;;;35017:17:0;;;35009:55;;;;-1:-1:-1;;;35009:55:0;;20171:2:1;35009:55:0;;;20153:21:1;20210:2;20190:18;;;20183:30;20249:27;20229:18;;;20222:55;20294:18;;35009:55:0;19969:349:1;35009:55:0;-1:-1:-1;;;;;35075:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35075:46:0;;;;;;;;;;35137:41;;16622::1;;;35137::0;;16595:18:1;35137:41:0;;;;;;;34871:315;;;:::o;29945:::-;30102:28;30112:4;30118:2;30122:7;30102:9;:28::i;:::-;30149:48;30172:4;30178:2;30182:7;30191:5;30149:22;:48::i;:::-;30141:111;;;;-1:-1:-1;;;30141:111:0;;;;;;;:::i;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;55446:301;55619:8;55614:126;55637:4;:11;55633:1;:15;;;55614:126;;;55720:5;55726:1;55720:8;;;;;;;;;;:::i;:::-;;;;;;;55670:17;:38;55688:16;55705:1;55688:19;;;;;;;;;;:::i;:::-;;;;;;;55670:38;;;;;;;;;;;;;;;:47;55709:4;55714:1;55709:7;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;55670:47:0;-1:-1:-1;;;;;55670:47:0;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;55650:3;;;;;:::i;:::-;;;;55614:126;;39942:589;-1:-1:-1;;;;;40148:18:0;;40144:187;;40183:40;40215:7;41358:10;:17;;41331:24;;;;:15;:24;;;;;:44;;;41386:24;;;;;;;;;;;;41254:164;40183:40;40144:187;;;40253:2;-1:-1:-1;;;;;40245:10:0;:4;-1:-1:-1;;;;;40245:10:0;;40241:90;;40272:47;40305:4;40311:7;40272:32;:47::i;:::-;-1:-1:-1;;;;;40345:16:0;;40341:183;;40378:45;40415:7;40378:36;:45::i;40341:183::-;40451:4;-1:-1:-1;;;;;40445:10:0;:2;-1:-1:-1;;;;;40445:10:0;;40441:83;;40472:40;40500:2;40504:7;40472:27;:40::i;50580:716::-;51004:23;51030:69;51058:4;51030:69;;;;;;;;;;;;;;;;;51038:5;-1:-1:-1;;;;;51030:27:0;;;:69;;;;;:::i;:::-;51114:17;;51004:95;;-1:-1:-1;51114:21:0;51110:179;;51211:10;51200:30;;;;;;;;;;;;:::i;:::-;51192:85;;;;-1:-1:-1;;;51192:85:0;;28252:2:1;51192:85:0;;;28234:21:1;28291:2;28271:18;;;28264:30;28330:34;28310:18;;;28303:62;-1:-1:-1;;;28381:18:1;;;28374:40;28431:19;;51192:85:0;28050:406:1;63118:107:0;63175:6;;-1:-1:-1;;;63175:6:0;;;;63174:7;;:34;;-1:-1:-1;13877:6:0;;-1:-1:-1;;;;;13877:6:0;12608:10;63185:23;63174:34;63166:51;;;;-1:-1:-1;;;63166:51:0;;;;;;22542:2:1;22524:21;;;22581:1;22561:18;;;22554:29;-1:-1:-1;;;22614:2:1;22599:18;;22592:34;22658:2;22643:18;;22340:327;62981:129:0;63082:11;63071:22;;:7;:22;;;;63063:39;;;;-1:-1:-1;;;63063:39:0;;;;;;25665:2:1;25647:21;;;25704:1;25684:18;;;25677:29;-1:-1:-1;;;25737:2:1;25722:18;;25715:34;25781:2;25766:18;;25463:327;61495:130:0;53597:5;61578:30;;;61570:47;;;;-1:-1:-1;;;61570:47:0;;;;;;17100:2:1;17082:21;;;17139:1;17119:18;;;17112:29;-1:-1:-1;;;17172:2:1;17157:18;;17150:34;17216:2;17201:18;;16898:327;61633:1195:0;61790:37;;;61725:14;61790:37;;;:19;:37;;;;;;;;12608:10;61790:45;;;;;;;;;;61874:35;;;:17;:35;;;;;;61952:21;:39;;;;;;12608:10;;61790:45;;;;;61874:35;;;;61952:39;61790:45;62002:819;;62126:43;62151:18;62126:22;:43;:::i;:::-;62068:44;;;;;;;:26;:44;;;;;;:101;;;;;:54;;;;;;:44;;:54;:::i;:::-;:101;;;;62042:167;;;;-1:-1:-1;;;62042:167:0;;;;;;18263:2:1;18245:21;;;18302:1;18282:18;;;18275:29;-1:-1:-1;;;18335:2:1;18320:18;;18313:34;18379:2;18364:18;;18061:327;62042:167:0;62002:819;;;62268:44;;;;;;;:26;:44;;;;;;:80;;;;;:54;;;;;:44;;:54;:::i;:::-;:80;;;;62242:146;;;;-1:-1:-1;;;62242:146:0;;;;;;28663:2:1;28645:21;;;28702:1;28682:18;;;28675:29;-1:-1:-1;;;28735:2:1;28720:18;;28713:34;28779:2;28764:18;;28461:327;62242:146:0;62417:15;62406:26;;:7;:26;;;62403:407;;62491:36;62512:15;62491:18;:36;:::i;:::-;62453:35;;;;;;;:17;:35;;;;;;;;:74;;;;;;;-1:-1:-1;;62453:74:0;;;;;;62546:19;:37;;;;;-1:-1:-1;;;;;62546:45:0;;;;;;;;;:49;;;;;;;62403:407;;;62674:28;62695:7;62674:18;:28;:::i;:::-;62636:35;;;;;;;:17;:35;;;;;:66;;-1:-1:-1;;62636:66:0;;;;;;;;;;;;62769:25;62787:7;62769:15;:25;:::i;:::-;62721:37;;;;;;;:19;:37;;;;;;;;-1:-1:-1;;;;;62721:45:0;;;;;;;;;:73;;-1:-1:-1;;62721:73:0;;;;;;;;;;;;62403:407;61714:1114;;;;61633:1195;;:::o;62836:137::-;62943:13;62931:8;:25;;62923:42;;;;-1:-1:-1;;;62923:42:0;;;;;;26399:2:1;26381:21;;;26438:1;26418:18;;;26411:29;-1:-1:-1;;;26471:2:1;26456:18;;26449:34;26515:2;26500:18;;26197:327;58435:319:0;58493:15;58511:13;38994:10;:17;;38906:113;58511:13;:17;;58527:1;58511:17;:::i;:::-;58539:23;;;;:14;:23;;;;;;;;:39;;-1:-1:-1;;58539:39:0;;;;;;;;;;58589:41;;:26;:41;;;;;:43;;58539:23;;-1:-1:-1;58589:43:0;;;;;:41;:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;58662:41;;;-1:-1:-1;58662:41:0;;;:26;:41;;;;;;;;;58643:16;;;:7;:16;;;;;;58662:41;;58643:60;;-1:-1:-1;58714:32:0;12608:10;58738:7;58714:9;:32::i;35751:799::-;35906:4;-1:-1:-1;;;;;35927:13:0;;16415:20;16463:8;35923:620;;35963:72;;-1:-1:-1;;;35963:72:0;;-1:-1:-1;;;;;35963:36:0;;;;;:72;;12608:10;;36014:4;;36020:7;;36029:5;;35963:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35963:72:0;;;;;;;;-1:-1:-1;;35963:72:0;;;;;;;;;;;;:::i;:::-;;;35959:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36205:13:0;;36201:272;;36248:60;;-1:-1:-1;;;36248:60:0;;;;;;;:::i;36201:272::-;36423:6;36417:13;36408:6;36404:2;36400:15;36393:38;35959:529;-1:-1:-1;;;;;;36086:51:0;-1:-1:-1;;;36086:51:0;;-1:-1:-1;36079:58:0;;35923:620;-1:-1:-1;36527:4:0;35751:799;;;;;;:::o;42045:988::-;42311:22;42361:1;42336:22;42353:4;42336:16;:22::i;:::-;:26;;;;:::i;:::-;42373:18;42394:26;;;:17;:26;;;;;;42311:51;;-1:-1:-1;42527:28:0;;;42523:328;;-1:-1:-1;;;;;42594:18:0;;42572:19;42594:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42645:30;;;;;;:44;;;42762:30;;:17;:30;;;;;:43;;;42523:328;-1:-1:-1;42947:26:0;;;;:17;:26;;;;;;;;42940:33;;;-1:-1:-1;;;;;42991:18:0;;;;;:12;:18;;;;;:34;;;;;;;42984:41;42045:988::o;43328:1079::-;43606:10;:17;43581:22;;43606:21;;43626:1;;43606:21;:::i;:::-;43638:18;43659:24;;;:15;:24;;;;;;44032:10;:26;;43581:46;;-1:-1:-1;43659:24:0;;43581:46;;44032:26;;;;;;:::i;:::-;;;;;;;;;44010:48;;44096:11;44071:10;44082;44071:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44176:28;;;:15;:28;;;;;;;:41;;;44348:24;;;;;44341:31;44383:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43399:1008;;;43328:1079;:::o;40832:221::-;40917:14;40934:20;40951:2;40934:16;:20::i;:::-;-1:-1:-1;;;;;40965:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41010:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40832:221:0:o;18898:229::-;19035:12;19067:52;19089:6;19097:4;19103:1;19106:12;19067:21;:52::i;31557:110::-;31633:26;31643:2;31647:7;31633:26;;;;;;;;;;;;:9;:26::i;20018:510::-;20188:12;20246:5;20221:21;:30;;20213:81;;;;-1:-1:-1;;;20213:81:0;;21310:2:1;20213:81:0;;;21292:21:1;21349:2;21329:18;;;21322:30;21388:34;21368:18;;;21361:62;-1:-1:-1;;;21439:18:1;;;21432:36;21485:19;;20213:81:0;21108:402:1;20213:81:0;16415:20;;20305:60;;;;-1:-1:-1;;;20305:60:0;;27149:2:1;20305:60:0;;;27131:21:1;27188:2;27168:18;;;27161:30;27227:31;27207:18;;;27200:59;27276:18;;20305:60:0;26947:353:1;20305:60:0;20379:12;20393:23;20420:6;-1:-1:-1;;;;;20420:11:0;20439:5;20446:4;20420:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20378:73;;;;20469:51;20486:7;20495:10;20507:12;20469:16;:51::i;:::-;20462:58;20018:510;-1:-1:-1;;;;;;;20018:510:0:o;31894:321::-;32024:18;32030:2;32034:7;32024:5;:18::i;:::-;32075:54;32106:1;32110:2;32114:7;32123:5;32075:22;:54::i;:::-;32053:154;;;;-1:-1:-1;;;32053:154:0;;;;;;;:::i;22704:712::-;22854:12;22883:7;22879:530;;;-1:-1:-1;22914:10:0;22907:17;;22879:530;23028:17;;:21;23024:374;;23226:10;23220:17;23287:15;23274:10;23270:2;23266:19;23259:44;23024:374;23369:12;23362:20;;-1:-1:-1;;;23362:20:0;;;;;;;;:::i;32551:382::-;-1:-1:-1;;;;;32631:16:0;;32623:61;;;;-1:-1:-1;;;32623:61:0;;24120:2:1;32623:61:0;;;24102:21:1;;;24139:18;;;24132:30;24198:34;24178:18;;;24171:62;24250:18;;32623:61:0;23918:356:1;32623:61:0;30638:4;30662:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30662:16:0;:30;32695:58;;;;-1:-1:-1;;;32695:58:0;;19002:2:1;32695:58:0;;;18984:21:1;19041:2;19021:18;;;19014:30;19080;19060:18;;;19053:58;19128:18;;32695:58:0;18800:352:1;32695:58:0;32766:45;32795:1;32799:2;32803:7;32766:20;:45::i;:::-;-1:-1:-1;;;;;32824:13:0;;;;;;:9;:13;;;;;:18;;32841:1;;32824:13;:18;;32841:1;;32824:18;:::i;:::-;;;;-1:-1:-1;;32853:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32853:21:0;-1:-1:-1;;;;;32853:21:0;;;;;;;;32892:33;;32853:16;;;32892:33;;32853:16;;32892:33;32551:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:406:1:-;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:748::-;479:5;532:3;525:4;517:6;513:17;509:27;499:55;;550:1;547;540:12;499:55;586:6;573:20;612:4;636:60;652:43;692:2;652:43;:::i;:::-;636:60;:::i;:::-;718:3;742:2;737:3;730:15;770:2;765:3;761:12;754:19;;805:2;797:6;793:15;857:3;852:2;846;843:1;839:10;831:6;827:23;823:32;820:41;817:61;;;874:1;871;864:12;817:61;896:1;906:238;920:2;917:1;914:9;906:238;;;991:3;978:17;1008:31;1033:5;1008:31;:::i;:::-;1052:18;;1090:12;;;;1122;;;;938:1;931:9;906:238;;;-1:-1:-1;1162:5:1;;425:748;-1:-1:-1;;;;;;;425:748:1:o;1178:675::-;1230:5;1283:3;1276:4;1268:6;1264:17;1260:27;1250:55;;1301:1;1298;1291:12;1250:55;1337:6;1324:20;1363:4;1387:60;1403:43;1443:2;1403:43;:::i;1387:60::-;1469:3;1493:2;1488:3;1481:15;1521:2;1516:3;1512:12;1505:19;;1556:2;1548:6;1544:15;1608:3;1603:2;1597;1594:1;1590:10;1582:6;1578:23;1574:32;1571:41;1568:61;;;1625:1;1622;1615:12;1568:61;1647:1;1657:167;1671:2;1668:1;1665:9;1657:167;;;1728:21;1745:3;1728:21;:::i;:::-;1716:34;;1770:12;;;;1802;;;;1689:1;1682:9;1657:167;;1858:221;1901:5;1954:3;1947:4;1939:6;1935:17;1931:27;1921:55;;1972:1;1969;1962:12;1921:55;1994:79;2069:3;2060:6;2047:20;2040:4;2032:6;2028:17;1994:79;:::i;2084:156::-;2150:20;;2210:4;2199:16;;2189:27;;2179:55;;2230:1;2227;2220:12;2179:55;2084:156;;;:::o;2245:247::-;2304:6;2357:2;2345:9;2336:7;2332:23;2328:32;2325:52;;;2373:1;2370;2363:12;2325:52;2412:9;2399:23;2431:31;2456:5;2431:31;:::i;2757:388::-;2825:6;2833;2886:2;2874:9;2865:7;2861:23;2857:32;2854:52;;;2902:1;2899;2892:12;2854:52;2941:9;2928:23;2960:31;2985:5;2960:31;:::i;:::-;3010:5;-1:-1:-1;3067:2:1;3052:18;;3039:32;3080:33;3039:32;3080:33;:::i;:::-;3132:7;3122:17;;;2757:388;;;;;:::o;3150:456::-;3227:6;3235;3243;3296:2;3284:9;3275:7;3271:23;3267:32;3264:52;;;3312:1;3309;3302:12;3264:52;3351:9;3338:23;3370:31;3395:5;3370:31;:::i;:::-;3420:5;-1:-1:-1;3477:2:1;3462:18;;3449:32;3490:33;3449:32;3490:33;:::i;:::-;3150:456;;3542:7;;-1:-1:-1;;;3596:2:1;3581:18;;;;3568:32;;3150:456::o;3611:794::-;3706:6;3714;3722;3730;3783:3;3771:9;3762:7;3758:23;3754:33;3751:53;;;3800:1;3797;3790:12;3751:53;3839:9;3826:23;3858:31;3883:5;3858:31;:::i;:::-;3908:5;-1:-1:-1;3965:2:1;3950:18;;3937:32;3978:33;3937:32;3978:33;:::i;:::-;4030:7;-1:-1:-1;4084:2:1;4069:18;;4056:32;;-1:-1:-1;4139:2:1;4124:18;;4111:32;4166:18;4155:30;;4152:50;;;4198:1;4195;4188:12;4152:50;4221:22;;4274:4;4266:13;;4262:27;-1:-1:-1;4252:55:1;;4303:1;4300;4293:12;4252:55;4326:73;4391:7;4386:2;4373:16;4368:2;4364;4360:11;4326:73;:::i;:::-;4316:83;;;3611:794;;;;;;;:::o;4410:382::-;4475:6;4483;4536:2;4524:9;4515:7;4511:23;4507:32;4504:52;;;4552:1;4549;4542:12;4504:52;4591:9;4578:23;4610:31;4635:5;4610:31;:::i;:::-;4660:5;-1:-1:-1;4717:2:1;4702:18;;4689:32;4730:30;4689:32;4730:30;:::i;4797:315::-;4865:6;4873;4926:2;4914:9;4905:7;4901:23;4897:32;4894:52;;;4942:1;4939;4932:12;4894:52;4981:9;4968:23;5000:31;5025:5;5000:31;:::i;:::-;5050:5;5102:2;5087:18;;;;5074:32;;-1:-1:-1;;;4797:315:1:o;5117:591::-;5233:6;5241;5294:2;5282:9;5273:7;5269:23;5265:32;5262:52;;;5310:1;5307;5300:12;5262:52;5350:9;5337:23;5379:18;5420:2;5412:6;5409:14;5406:34;;;5436:1;5433;5426:12;5406:34;5459:61;5512:7;5503:6;5492:9;5488:22;5459:61;:::i;:::-;5449:71;;5573:2;5562:9;5558:18;5545:32;5529:48;;5602:2;5592:8;5589:16;5586:36;;;5618:1;5615;5608:12;5586:36;;5641:61;5694:7;5683:8;5672:9;5668:24;5641:61;:::i;:::-;5631:71;;;5117:591;;;;;:::o;5713:813::-;5861:6;5869;5877;5930:2;5918:9;5909:7;5905:23;5901:32;5898:52;;;5946:1;5943;5936:12;5898:52;5986:9;5973:23;6015:18;6056:2;6048:6;6045:14;6042:34;;;6072:1;6069;6062:12;6042:34;6095:61;6148:7;6139:6;6128:9;6124:22;6095:61;:::i;:::-;6085:71;;6209:2;6198:9;6194:18;6181:32;6165:48;;6238:2;6228:8;6225:16;6222:36;;;6254:1;6251;6244:12;6222:36;6277:61;6330:7;6319:8;6308:9;6304:24;6277:61;:::i;:::-;6267:71;;6391:2;6380:9;6376:18;6363:32;6347:48;;6420:2;6410:8;6407:16;6404:36;;;6436:1;6433;6426:12;6404:36;;6459:61;6512:7;6501:8;6490:9;6486:24;6459:61;:::i;:::-;6449:71;;;5713:813;;;;;:::o;6531:1101::-;6625:6;6656:2;6699;6687:9;6678:7;6674:23;6670:32;6667:52;;;6715:1;6712;6705:12;6667:52;6755:9;6742:23;6784:18;6825:2;6817:6;6814:14;6811:34;;;6841:1;6838;6831:12;6811:34;6879:6;6868:9;6864:22;6854:32;;6924:7;6917:4;6913:2;6909:13;6905:27;6895:55;;6946:1;6943;6936:12;6895:55;6982:2;6969:16;7005:60;7021:43;7061:2;7021:43;:::i;7005:60::-;7087:3;7111:2;7106:3;7099:15;7139:2;7134:3;7130:12;7123:19;;7170:2;7166;7162:11;7218:7;7213:2;7207;7204:1;7200:10;7196:2;7192:19;7188:28;7185:41;7182:61;;;7239:1;7236;7229:12;7182:61;7261:1;7282;7292:310;7308:2;7303:3;7300:11;7292:310;;;7389:3;7376:17;7425:2;7412:11;7409:19;7406:39;;;7441:1;7438;7431:12;7406:39;7470:57;7519:7;7514:2;7500:11;7496:2;7492:20;7488:29;7470:57;:::i;:::-;7458:70;;-1:-1:-1;7548:12:1;;;;7580;;;;7330:1;7321:11;7292:310;;;-1:-1:-1;7621:5:1;;6531:1101;-1:-1:-1;;;;;;;;;;6531:1101:1:o;7637:245::-;7704:6;7757:2;7745:9;7736:7;7732:23;7728:32;7725:52;;;7773:1;7770;7763:12;7725:52;7805:9;7799:16;7824:28;7846:5;7824:28;:::i;7887:245::-;7945:6;7998:2;7986:9;7977:7;7973:23;7969:32;7966:52;;;8014:1;8011;8004:12;7966:52;8053:9;8040:23;8072:30;8096:5;8072:30;:::i;8137:249::-;8206:6;8259:2;8247:9;8238:7;8234:23;8230:32;8227:52;;;8275:1;8272;8265:12;8227:52;8307:9;8301:16;8326:30;8350:5;8326:30;:::i;9066:322::-;9135:6;9188:2;9176:9;9167:7;9163:23;9159:32;9156:52;;;9204:1;9201;9194:12;9156:52;9244:9;9231:23;9277:18;9269:6;9266:30;9263:50;;;9309:1;9306;9299:12;9263:50;9332;9374:7;9365:6;9354:9;9350:22;9332:50;:::i;9393:272::-;9451:6;9504:2;9492:9;9483:7;9479:23;9475:32;9472:52;;;9520:1;9517;9510:12;9472:52;9559:9;9546:23;9609:6;9602:5;9598:18;9591:5;9588:29;9578:57;;9631:1;9628;9621:12;9670:180;9729:6;9782:2;9770:9;9761:7;9757:23;9753:32;9750:52;;;9798:1;9795;9788:12;9750:52;-1:-1:-1;9821:23:1;;9670:180;-1:-1:-1;9670:180:1:o;9855:184::-;9925:6;9978:2;9966:9;9957:7;9953:23;9949:32;9946:52;;;9994:1;9991;9984:12;9946:52;-1:-1:-1;10017:16:1;;9855:184;-1:-1:-1;9855:184:1:o;10044:390::-;10122:6;10130;10183:2;10171:9;10162:7;10158:23;10154:32;10151:52;;;10199:1;10196;10189:12;10151:52;10235:9;10222:23;10212:33;;10296:2;10285:9;10281:18;10268:32;10323:18;10315:6;10312:30;10309:50;;;10355:1;10352;10345:12;10309:50;10378;10420:7;10411:6;10400:9;10396:22;10378:50;:::i;10439:182::-;10496:6;10549:2;10537:9;10528:7;10524:23;10520:32;10517:52;;;10565:1;10562;10555:12;10517:52;10588:27;10605:9;10588:27;:::i;10626:317::-;10692:6;10700;10753:2;10741:9;10732:7;10728:23;10724:32;10721:52;;;10769:1;10766;10759:12;10721:52;10792:27;10809:9;10792:27;:::i;10948:252::-;11012:6;11020;11073:2;11061:9;11052:7;11048:23;11044:32;11041:52;;;11089:1;11086;11079:12;11041:52;11112:27;11129:9;11112:27;:::i;:::-;11102:37;;11158:36;11190:2;11179:9;11175:18;11158:36;:::i;:::-;11148:46;;10948:252;;;;;:::o;11205:257::-;11246:3;11284:5;11278:12;11311:6;11306:3;11299:19;11327:63;11383:6;11376:4;11371:3;11367:14;11360:4;11353:5;11349:16;11327:63;:::i;:::-;11444:2;11423:15;-1:-1:-1;;11419:29:1;11410:39;;;;11451:4;11406:50;;11205:257;-1:-1:-1;;11205:257:1:o;11467:973::-;11552:12;;11517:3;;11607:1;11627:18;;;;11680;;;;11707:61;;11761:4;11753:6;11749:17;11739:27;;11707:61;11787:2;11835;11827:6;11824:14;11804:18;11801:38;11798:161;;;11881:10;11876:3;11872:20;11869:1;11862:31;11916:4;11913:1;11906:15;11944:4;11941:1;11934:15;11798:161;11975:18;12002:104;;;;12120:1;12115:319;;;;11968:466;;12002:104;-1:-1:-1;;12035:24:1;;12023:37;;12080:16;;;;-1:-1:-1;12002:104:1;;12115:319;30095:1;30088:14;;;30132:4;30119:18;;12209:1;12223:165;12237:6;12234:1;12231:13;12223:165;;;12315:14;;12302:11;;;12295:35;12358:16;;;;12252:10;;12223:165;;;12227:3;;12417:6;12412:3;12408:16;12401:23;;11968:466;;;;;;;11467:973;;;;:::o;12445:274::-;12574:3;12612:6;12606:13;12628:53;12674:6;12669:3;12662:4;12654:6;12650:17;12628:53;:::i;:::-;12697:16;;;;;12445:274;-1:-1:-1;;12445:274:1:o;12724:550::-;12948:3;12986:6;12980:13;13002:53;13048:6;13043:3;13036:4;13028:6;13024:17;13002:53;:::i;:::-;13118:13;;13077:16;;;;13140:57;13118:13;13077:16;13174:4;13162:17;;13140:57;:::i;:::-;13213:55;13258:8;13251:5;13247:20;13239:6;13213:55;:::i;13279:277::-;13452:3;13477:73;13511:38;13545:3;13537:6;13511:38;:::i;:::-;13503:6;13477:73;:::i;14266:488::-;-1:-1:-1;;;;;14535:15:1;;;14517:34;;14587:15;;14582:2;14567:18;;14560:43;14634:2;14619:18;;14612:34;;;14682:3;14677:2;14662:18;;14655:31;;;14460:4;;14703:45;;14728:19;;14720:6;14703:45;:::i;:::-;14695:53;14266:488;-1:-1:-1;;;;;;14266:488:1:o;15038:802::-;15200:4;15229:2;15269;15258:9;15254:18;15299:2;15288:9;15281:21;15322:6;15357;15351:13;15388:6;15380;15373:22;15426:2;15415:9;15411:18;15404:25;;15488:2;15478:6;15475:1;15471:14;15460:9;15456:30;15452:39;15438:53;;15526:2;15518:6;15514:15;15547:1;15557:254;15571:6;15568:1;15565:13;15557:254;;;15664:2;15660:7;15648:9;15640:6;15636:22;15632:36;15627:3;15620:49;15692:39;15724:6;15715;15709:13;15692:39;:::i;:::-;15682:49;-1:-1:-1;15789:12:1;;;;15754:15;;;;15593:1;15586:9;15557:254;;;-1:-1:-1;15828:6:1;;15038:802;-1:-1:-1;;;;;;;15038:802:1:o;15845:632::-;16016:2;16068:21;;;16138:13;;16041:18;;;16160:22;;;15987:4;;16016:2;16239:15;;;;16213:2;16198:18;;;15987:4;16282:169;16296:6;16293:1;16290:13;16282:169;;;16357:13;;16345:26;;16426:15;;;;16391:12;;;;16318:1;16311:9;16282:169;;;-1:-1:-1;16468:3:1;;15845:632;-1:-1:-1;;;;;;15845:632:1:o;16674:219::-;16823:2;16812:9;16805:21;16786:4;16843:44;16883:2;16872:9;16868:18;16860:6;16843:44;:::i;17642:414::-;17844:2;17826:21;;;17883:2;17863:18;;;17856:30;17922:34;17917:2;17902:18;;17895:62;-1:-1:-1;;;17988:2:1;17973:18;;17966:48;18046:3;18031:19;;17642:414::o;19157:402::-;19359:2;19341:21;;;19398:2;19378:18;;;19371:30;19437:34;19432:2;19417:18;;19410:62;-1:-1:-1;;;19503:2:1;19488:18;;19481:36;19549:3;19534:19;;19157:402::o;21928:407::-;22130:2;22112:21;;;22169:2;22149:18;;;22142:30;22208:34;22203:2;22188:18;;22181:62;-1:-1:-1;;;22274:2:1;22259:18;;22252:41;22325:3;22310:19;;21928:407::o;24692:356::-;24894:2;24876:21;;;24913:18;;;24906:30;24972:34;24967:2;24952:18;;24945:62;25039:2;25024:18;;24692:356::o;26529:413::-;26731:2;26713:21;;;26770:2;26750:18;;;26743:30;26809:34;26804:2;26789:18;;26782:62;-1:-1:-1;;;26875:2:1;26860:18;;26853:47;26932:3;26917:19;;26529:413::o;29554:275::-;29625:2;29619:9;29690:2;29671:13;;-1:-1:-1;;29667:27:1;29655:40;;29725:18;29710:34;;29746:22;;;29707:62;29704:88;;;29772:18;;:::i;:::-;29808:2;29801:22;29554:275;;-1:-1:-1;29554:275:1:o;29834:183::-;29894:4;29927:18;29919:6;29916:30;29913:56;;;29949:18;;:::i;:::-;-1:-1:-1;29994:1:1;29990:14;30006:4;29986:25;;29834:183::o;30148:224::-;30187:3;30215:6;30248:2;30245:1;30241:10;30278:2;30275:1;30271:10;30309:3;30305:2;30301:12;30296:3;30293:21;30290:47;;;30317:18;;:::i;:::-;30353:13;;30148:224;-1:-1:-1;;;;30148:224:1:o;30377:128::-;30417:3;30448:1;30444:6;30441:1;30438:13;30435:39;;;30454:18;;:::i;:::-;-1:-1:-1;30490:9:1;;30377:128::o;30510:228::-;30549:3;30577:10;30614:2;30611:1;30607:10;30644:2;30641:1;30637:10;30675:3;30671:2;30667:12;30662:3;30659:21;30656:47;;;30683:18;;:::i;30743:120::-;30783:1;30809;30799:35;;30814:18;;:::i;:::-;-1:-1:-1;30848:9:1;;30743:120::o;30868:168::-;30908:7;30974:1;30970;30966:6;30962:14;30959:1;30956:21;30951:1;30944:9;30937:17;30933:45;30930:71;;;30981:18;;:::i;:::-;-1:-1:-1;31021:9:1;;30868:168::o;31041:217::-;31080:4;31109:6;31165:10;;;;31135;;31187:12;;;31184:38;;;31202:18;;:::i;:::-;31239:13;;31041:217;-1:-1:-1;;;31041:217:1:o;31263:125::-;31303:4;31331:1;31328;31325:8;31322:34;;;31336:18;;:::i;:::-;-1:-1:-1;31373:9:1;;31263:125::o;31393:258::-;31465:1;31475:113;31489:6;31486:1;31483:13;31475:113;;;31565:11;;;31559:18;31546:11;;;31539:39;31511:2;31504:10;31475:113;;;31606:6;31603:1;31600:13;31597:48;;;-1:-1:-1;;31641:1:1;31623:16;;31616:27;31393:258::o;31656:380::-;31735:1;31731:12;;;;31778;;;31799:61;;31853:4;31845:6;31841:17;31831:27;;31799:61;31906:2;31898:6;31895:14;31875:18;31872:38;31869:161;;;31952:10;31947:3;31943:20;31940:1;31933:31;31987:4;31984:1;31977:15;32015:4;32012:1;32005:15;32041:197;32079:3;32107:6;32148:2;32141:5;32137:14;32175:2;32166:7;32163:15;32160:41;;;32181:18;;:::i;:::-;32230:1;32217:15;;32041:197;-1:-1:-1;;;32041:197:1:o;32243:135::-;32282:3;-1:-1:-1;;32303:17:1;;32300:43;;;32323:18;;:::i;:::-;-1:-1:-1;32370:1:1;32359:13;;32243:135::o;32383:201::-;32421:3;32449:10;32494:2;32487:5;32483:14;32521:2;32512:7;32509:15;32506:41;;;32527:18;;:::i;32589:112::-;32621:1;32647;32637:35;;32652:18;;:::i;:::-;-1:-1:-1;32686:9:1;;32589:112::o;32706:127::-;32767:10;32762:3;32758:20;32755:1;32748:31;32798:4;32795:1;32788:15;32822:4;32819:1;32812:15;32838:127;32899:10;32894:3;32890:20;32887:1;32880:31;32930:4;32927:1;32920:15;32954:4;32951:1;32944:15;32970:127;33031:10;33026:3;33022:20;33019:1;33012:31;33062:4;33059:1;33052:15;33086:4;33083:1;33076:15;33102:127;33163:10;33158:3;33154:20;33151:1;33144:31;33194:4;33191:1;33184:15;33218:4;33215:1;33208:15;33234:127;33295:10;33290:3;33286:20;33283:1;33276:31;33326:4;33323:1;33316:15;33350:4;33347:1;33340:15;33366:131;-1:-1:-1;;;;;33441:31:1;;33431:42;;33421:70;;33487:1;33484;33477:12;33502:118;33588:5;33581:13;33574:21;33567:5;33564:32;33554:60;;33610:1;33607;33600:12;33625:131;-1:-1:-1;;;;;;33699:32:1;;33689:43;;33679:71;;33746:1;33743;33736:12

Swarm Source

ipfs://75328fc83f2435d9820a5a085891fe5572233164a6fc9d32b699f5a27074be49
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.