ETH Price: $3,420.64 (+2.20%)

Token

Ithil Edhil (IE)
 

Overview

Max Total Supply

3,000 IE

Holders

1,963

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 IE
0xb084179f3f6c2a1c0c3483194d4cd56aecce0372
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:
ithiledhil

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-07
*/

// File: ethil.sol


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _nextTokenId;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

        uint256 updatedIndex = startTokenId;

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

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

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

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

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

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

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

// File: @openzeppelin/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);
    }
}


pragma solidity ^0.8.2;
    
contract ithiledhil is ERC721A, Ownable {  

    using Strings for uint256;

    string  private baseUri = "ipfs://QmeiGCnohjyFJS6YK2vA1RZQCPZabicZEf36Tuqx2CDXN1/";
    
    uint public constant MAX_SUPPLY = 3000;
    uint public maxFreeMint = 3000;
    uint public maxFreeMintPerWallet = 1;
    
    mapping(address => uint) public addressToFreeMinted;

    constructor() ERC721A("Ithil Edhil", "IE") {
    }

    function _baseURI() internal view override returns (string memory) {
        return baseUri;
    }
    
    function freeMint( ) external {
        require(totalSupply() < maxFreeMint, "No More Left");
        require(addressToFreeMinted[msg.sender] < maxFreeMintPerWallet, "Only 1 allowed");

        
        addressToFreeMinted[msg.sender]+=1;
        _safeMint(msg.sender, 1);
    }
    
   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return bytes(baseUri).length > 0 ? string(abi.encodePacked(baseUri, tokenId.toString(), ".json")) : "";
  }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        baseUri = newBaseURI;
    }
    
    function withdrawAll() external onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);    
    }
   
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806036815260200162003fef603691396008908051906020019062000035929190620001eb565b50610bb86009556001600a553480156200004e57600080fd5b506040518060400160405280600b81526020017f497468696c20456468696c0000000000000000000000000000000000000000008152506040518060400160405280600281526020017f49450000000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000d3929190620001eb565b508060029080519060200190620000ec929190620001eb565b5060016000819055505050620001176200010b6200011d60201b60201c565b6200012560201b60201c565b62000300565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f9906200029b565b90600052602060002090601f0160209004810192826200021d576000855562000269565b82601f106200023857805160ff191683800117855562000269565b8280016001018555821562000269579182015b82811115620002685782518255916020019190600101906200024b565b5b5090506200027891906200027c565b5090565b5b80821115620002975760008160009055506001016200027d565b5090565b60006002820490506001821680620002b457607f821691505b60208210811415620002cb57620002ca620002d1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613cdf80620003106000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de57806395d89b4111610097578063b88d4fde11610071578063b88d4fde1461045f578063c87b56dd1461047b578063e985e9c5146104ab578063f2fde38b146104db5761018e565b806395d89b4114610407578063a22cb46514610425578063a591252d146104415761018e565b806370a0823114610357578063715018a6146103875780637fc4618914610391578063845bb3bb146103c1578063853828b6146103df5780638da5cb5b146103e95761018e565b80632f745c591161014b5780634f6ccce7116101255780634f6ccce7146102d157806355f804b3146103015780635b70ea9f1461031d5780636352211e146103275761018e565b80632f745c591461026757806332cb6b0c1461029757806342842e0e146102b55761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a891906128ef565b6104f7565b6040516101ba9190612ea6565b60405180910390f35b6101cb610641565b6040516101d89190612ec1565b60405180910390f35b6101fb60048036038101906101f69190612992565b6106d3565b6040516102089190612e3f565b60405180910390f35b61022b600480360381019061022691906128af565b610758565b005b610235610871565b6040516102429190613183565b60405180910390f35b61026560048036038101906102609190612799565b610887565b005b610281600480360381019061027c91906128af565b610897565b60405161028e9190613183565b60405180910390f35b61029f610a95565b6040516102ac9190613183565b60405180910390f35b6102cf60048036038101906102ca9190612799565b610a9b565b005b6102eb60048036038101906102e69190612992565b610abb565b6040516102f89190613183565b60405180910390f35b61031b60048036038101906103169190612949565b610b0e565b005b610325610ba4565b005b610341600480360381019061033c9190612992565b610cd6565b60405161034e9190612e3f565b60405180910390f35b610371600480360381019061036c919061272c565b610cec565b60405161037e9190613183565b60405180910390f35b61038f610dd5565b005b6103ab60048036038101906103a6919061272c565b610e5d565b6040516103b89190613183565b60405180910390f35b6103c9610e75565b6040516103d69190613183565b60405180910390f35b6103e7610e7b565b005b6103f1610f46565b6040516103fe9190612e3f565b60405180910390f35b61040f610f70565b60405161041c9190612ec1565b60405180910390f35b61043f600480360381019061043a919061286f565b611002565b005b610449611183565b6040516104569190613183565b60405180910390f35b610479600480360381019061047491906127ec565b611189565b005b61049560048036038101906104909190612992565b6111e5565b6040516104a29190612ec1565b60405180910390f35b6104c560048036038101906104c09190612759565b61128d565b6040516104d29190612ea6565b60405180910390f35b6104f560048036038101906104f0919061272c565b611321565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061063a575061063982611419565b5b9050919050565b6060600180546106509061347a565b80601f016020809104026020016040519081016040528092919081815260200182805461067c9061347a565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b60006106de82611483565b61071d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071490613163565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076382610cd6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb90613083565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f3611490565b73ffffffffffffffffffffffffffffffffffffffff16148061082257506108218161081c611490565b61128d565b5b610861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085890612fa3565b60405180910390fd5b61086c838383611498565b505050565b60006001600054610882919061334a565b905090565b61089283838361154a565b505050565b60006108a283610cec565b82106108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da90612ee3565b60405180910390fd5b60006108ed610871565b905060008060005b83811015610a53576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146109e757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3f5786841415610a30578195505050505050610a8f565b8380610a3b906134dd565b9450505b508080610a4b906134dd565b9150506108f5565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613143565b60405180910390fd5b92915050565b610bb881565b610ab683838360405180602001604052806000815250611189565b505050565b6000610ac5610871565b8210610b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afd90612f43565b60405180910390fd5b819050919050565b610b16611490565b73ffffffffffffffffffffffffffffffffffffffff16610b34610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190613003565b60405180910390fd5b8060089080519060200190610ba0929190612506565b5050565b600954610baf610871565b10610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be690612f83565b60405180910390fd5b600a54600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990613103565b60405180910390fd5b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cc291906132c3565b92505081905550610cd4336001611af1565b565b6000610ce182611b0f565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490612fc3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610ddd611490565b73ffffffffffffffffffffffffffffffffffffffff16610dfb610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613003565b60405180910390fd5b610e5b6000611c6a565b565b600b6020528060005260406000206000915090505481565b600a5481565b610e83611490565b73ffffffffffffffffffffffffffffffffffffffff16610ea1610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613003565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f42573d6000803e3d6000fd5b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610f7f9061347a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab9061347a565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b61100a611490565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613043565b60405180910390fd5b8060066000611085611490565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611132611490565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111779190612ea6565b60405180910390a35050565b60095481565b61119484848461154a565b6111a084848484611d30565b6111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d6906130c3565b60405180910390fd5b50505050565b60606111f082611483565b61122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613023565b60405180910390fd5b60006008805461123e9061347a565b90501161125a5760405180602001604052806000815250611286565b600861126583611ec7565b604051602001611276929190612e10565b6040516020818303038152906040525b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611329611490565b73ffffffffffffffffffffffffffffffffffffffff16611347610f46565b73ffffffffffffffffffffffffffffffffffffffff161461139d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139490613003565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490612f03565b60405180910390fd5b61141681611c6a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061155582611b0f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661157c611490565b73ffffffffffffffffffffffffffffffffffffffff1614806115d857506115a1611490565b73ffffffffffffffffffffffffffffffffffffffff166115c0846106d3565b73ffffffffffffffffffffffffffffffffffffffff16145b806115f457506115f382600001516115ee611490565b61128d565b5b905080611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90613063565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90612fe3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90612f63565b60405180910390fd5b6117258585856001612028565b6117356000848460000151611498565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461193b91906132c3565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a81576119b181611483565b15611a80576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ae9868686600161202e565b505050505050565b611b0b828260405180602001604052806000815250612034565b5050565b611b1761258c565b611b2082611483565b611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690612f23565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c51578092505050611c65565b508080611c5d90613450565b915050611b65565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611d518473ffffffffffffffffffffffffffffffffffffffff166124f3565b15611eba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d7a611490565b8786866040518563ffffffff1660e01b8152600401611d9c9493929190612e5a565b602060405180830381600087803b158015611db657600080fd5b505af1925050508015611de757506040513d601f19601f82011682018060405250810190611de4919061291c565b60015b611e6a573d8060008114611e17576040519150601f19603f3d011682016040523d82523d6000602084013e611e1c565b606091505b50600081511415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e59906130c3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ebf565b600190505b949350505050565b60606000821415611f0f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612023565b600082905060005b60008214611f41578080611f2a906134dd565b915050600a82611f3a9190613319565b9150611f17565b60008167ffffffffffffffff811115611f5d57611f5c613613565b5b6040519080825280601f01601f191660200182016040528015611f8f5781602001600182028036833780820191505090505b5090505b6000851461201c57600182611fa8919061334a565b9150600a85611fb79190613526565b6030611fc391906132c3565b60f81b818381518110611fd957611fd86135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120159190613319565b9450611f93565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613123565b60405180910390fd5b6120b381611483565b156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea906130e3565b60405180910390fd5b60008311612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212d906130a3565b60405180910390fd5b6121436000858386612028565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612240919061327d565b6fffffffffffffffffffffffffffffffff168152602001858360200151612267919061327d565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156124d657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124766000888488611d30565b6124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac906130c3565b60405180910390fd5b81806124c0906134dd565b92505080806124ce906134dd565b915050612405565b50806000819055506124eb600087858861202e565b505050505050565b600080823b905060008111915050919050565b8280546125129061347a565b90600052602060002090601f016020900481019282612534576000855561257b565b82601f1061254d57805160ff191683800117855561257b565b8280016001018555821561257b579182015b8281111561257a57825182559160200191906001019061255f565b5b50905061258891906125c6565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156125df5760008160009055506001016125c7565b5090565b60006125f66125f1846131c3565b61319e565b90508281526020810184848401111561261257612611613647565b5b61261d84828561340e565b509392505050565b6000612638612633846131f4565b61319e565b90508281526020810184848401111561265457612653613647565b5b61265f84828561340e565b509392505050565b60008135905061267681613c4d565b92915050565b60008135905061268b81613c64565b92915050565b6000813590506126a081613c7b565b92915050565b6000815190506126b581613c7b565b92915050565b600082601f8301126126d0576126cf613642565b5b81356126e08482602086016125e3565b91505092915050565b600082601f8301126126fe576126fd613642565b5b813561270e848260208601612625565b91505092915050565b60008135905061272681613c92565b92915050565b60006020828403121561274257612741613651565b5b600061275084828501612667565b91505092915050565b600080604083850312156127705761276f613651565b5b600061277e85828601612667565b925050602061278f85828601612667565b9150509250929050565b6000806000606084860312156127b2576127b1613651565b5b60006127c086828701612667565b93505060206127d186828701612667565b92505060406127e286828701612717565b9150509250925092565b6000806000806080858703121561280657612805613651565b5b600061281487828801612667565b945050602061282587828801612667565b935050604061283687828801612717565b925050606085013567ffffffffffffffff8111156128575761285661364c565b5b612863878288016126bb565b91505092959194509250565b6000806040838503121561288657612885613651565b5b600061289485828601612667565b92505060206128a58582860161267c565b9150509250929050565b600080604083850312156128c6576128c5613651565b5b60006128d485828601612667565b92505060206128e585828601612717565b9150509250929050565b60006020828403121561290557612904613651565b5b600061291384828501612691565b91505092915050565b60006020828403121561293257612931613651565b5b6000612940848285016126a6565b91505092915050565b60006020828403121561295f5761295e613651565b5b600082013567ffffffffffffffff81111561297d5761297c61364c565b5b612989848285016126e9565b91505092915050565b6000602082840312156129a8576129a7613651565b5b60006129b684828501612717565b91505092915050565b6129c88161337e565b82525050565b6129d781613390565b82525050565b60006129e88261323a565b6129f28185613250565b9350612a0281856020860161341d565b612a0b81613656565b840191505092915050565b6000612a2182613245565b612a2b8185613261565b9350612a3b81856020860161341d565b612a4481613656565b840191505092915050565b6000612a5a82613245565b612a648185613272565b9350612a7481856020860161341d565b80840191505092915050565b60008154612a8d8161347a565b612a978186613272565b94506001821660008114612ab25760018114612ac357612af6565b60ff19831686528186019350612af6565b612acc85613225565b60005b83811015612aee57815481890152600182019150602081019050612acf565b838801955050505b50505092915050565b6000612b0c602283613261565b9150612b1782613667565b604082019050919050565b6000612b2f602683613261565b9150612b3a826136b6565b604082019050919050565b6000612b52602a83613261565b9150612b5d82613705565b604082019050919050565b6000612b75602383613261565b9150612b8082613754565b604082019050919050565b6000612b98602583613261565b9150612ba3826137a3565b604082019050919050565b6000612bbb600c83613261565b9150612bc6826137f2565b602082019050919050565b6000612bde603983613261565b9150612be98261381b565b604082019050919050565b6000612c01602b83613261565b9150612c0c8261386a565b604082019050919050565b6000612c24602683613261565b9150612c2f826138b9565b604082019050919050565b6000612c47600583613272565b9150612c5282613908565b600582019050919050565b6000612c6a602083613261565b9150612c7582613931565b602082019050919050565b6000612c8d602f83613261565b9150612c988261395a565b604082019050919050565b6000612cb0601a83613261565b9150612cbb826139a9565b602082019050919050565b6000612cd3603283613261565b9150612cde826139d2565b604082019050919050565b6000612cf6602283613261565b9150612d0182613a21565b604082019050919050565b6000612d19602383613261565b9150612d2482613a70565b604082019050919050565b6000612d3c603383613261565b9150612d4782613abf565b604082019050919050565b6000612d5f601d83613261565b9150612d6a82613b0e565b602082019050919050565b6000612d82600e83613261565b9150612d8d82613b37565b602082019050919050565b6000612da5602183613261565b9150612db082613b60565b604082019050919050565b6000612dc8602e83613261565b9150612dd382613baf565b604082019050919050565b6000612deb602d83613261565b9150612df682613bfe565b604082019050919050565b612e0a81613404565b82525050565b6000612e1c8285612a80565b9150612e288284612a4f565b9150612e3382612c3a565b91508190509392505050565b6000602082019050612e5460008301846129bf565b92915050565b6000608082019050612e6f60008301876129bf565b612e7c60208301866129bf565b612e896040830185612e01565b8181036060830152612e9b81846129dd565b905095945050505050565b6000602082019050612ebb60008301846129ce565b92915050565b60006020820190508181036000830152612edb8184612a16565b905092915050565b60006020820190508181036000830152612efc81612aff565b9050919050565b60006020820190508181036000830152612f1c81612b22565b9050919050565b60006020820190508181036000830152612f3c81612b45565b9050919050565b60006020820190508181036000830152612f5c81612b68565b9050919050565b60006020820190508181036000830152612f7c81612b8b565b9050919050565b60006020820190508181036000830152612f9c81612bae565b9050919050565b60006020820190508181036000830152612fbc81612bd1565b9050919050565b60006020820190508181036000830152612fdc81612bf4565b9050919050565b60006020820190508181036000830152612ffc81612c17565b9050919050565b6000602082019050818103600083015261301c81612c5d565b9050919050565b6000602082019050818103600083015261303c81612c80565b9050919050565b6000602082019050818103600083015261305c81612ca3565b9050919050565b6000602082019050818103600083015261307c81612cc6565b9050919050565b6000602082019050818103600083015261309c81612ce9565b9050919050565b600060208201905081810360008301526130bc81612d0c565b9050919050565b600060208201905081810360008301526130dc81612d2f565b9050919050565b600060208201905081810360008301526130fc81612d52565b9050919050565b6000602082019050818103600083015261311c81612d75565b9050919050565b6000602082019050818103600083015261313c81612d98565b9050919050565b6000602082019050818103600083015261315c81612dbb565b9050919050565b6000602082019050818103600083015261317c81612dde565b9050919050565b60006020820190506131986000830184612e01565b92915050565b60006131a86131b9565b90506131b482826134ac565b919050565b6000604051905090565b600067ffffffffffffffff8211156131de576131dd613613565b5b6131e782613656565b9050602081019050919050565b600067ffffffffffffffff82111561320f5761320e613613565b5b61321882613656565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613288826133c8565b9150613293836133c8565b9250826fffffffffffffffffffffffffffffffff038211156132b8576132b7613557565b5b828201905092915050565b60006132ce82613404565b91506132d983613404565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561330e5761330d613557565b5b828201905092915050565b600061332482613404565b915061332f83613404565b92508261333f5761333e613586565b5b828204905092915050565b600061335582613404565b915061336083613404565b92508282101561337357613372613557565b5b828203905092915050565b6000613389826133e4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561343b578082015181840152602081019050613420565b8381111561344a576000848401525b50505050565b600061345b82613404565b9150600082141561346f5761346e613557565b5b600182039050919050565b6000600282049050600182168061349257607f821691505b602082108114156134a6576134a56135b5565b5b50919050565b6134b582613656565b810181811067ffffffffffffffff821117156134d4576134d3613613565b5b80604052505050565b60006134e882613404565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561351b5761351a613557565b5b600182019050919050565b600061353182613404565b915061353c83613404565b92508261354c5761354b613586565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f204d6f7265204c6566740000000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f4f6e6c79203120616c6c6f776564000000000000000000000000000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b613c568161337e565b8114613c6157600080fd5b50565b613c6d81613390565b8114613c7857600080fd5b50565b613c848161339c565b8114613c8f57600080fd5b50565b613c9b81613404565b8114613ca657600080fd5b5056fea2646970667358221220cc0bf9d88d28830b35d39a934cf54a0e7f7365d7072036a5e484b4d737336de664736f6c63430008070033697066733a2f2f516d656947436e6f686a79464a5336594b32764131525a5143505a616269635a4566333654757178324344584e312f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de57806395d89b4111610097578063b88d4fde11610071578063b88d4fde1461045f578063c87b56dd1461047b578063e985e9c5146104ab578063f2fde38b146104db5761018e565b806395d89b4114610407578063a22cb46514610425578063a591252d146104415761018e565b806370a0823114610357578063715018a6146103875780637fc4618914610391578063845bb3bb146103c1578063853828b6146103df5780638da5cb5b146103e95761018e565b80632f745c591161014b5780634f6ccce7116101255780634f6ccce7146102d157806355f804b3146103015780635b70ea9f1461031d5780636352211e146103275761018e565b80632f745c591461026757806332cb6b0c1461029757806342842e0e146102b55761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a891906128ef565b6104f7565b6040516101ba9190612ea6565b60405180910390f35b6101cb610641565b6040516101d89190612ec1565b60405180910390f35b6101fb60048036038101906101f69190612992565b6106d3565b6040516102089190612e3f565b60405180910390f35b61022b600480360381019061022691906128af565b610758565b005b610235610871565b6040516102429190613183565b60405180910390f35b61026560048036038101906102609190612799565b610887565b005b610281600480360381019061027c91906128af565b610897565b60405161028e9190613183565b60405180910390f35b61029f610a95565b6040516102ac9190613183565b60405180910390f35b6102cf60048036038101906102ca9190612799565b610a9b565b005b6102eb60048036038101906102e69190612992565b610abb565b6040516102f89190613183565b60405180910390f35b61031b60048036038101906103169190612949565b610b0e565b005b610325610ba4565b005b610341600480360381019061033c9190612992565b610cd6565b60405161034e9190612e3f565b60405180910390f35b610371600480360381019061036c919061272c565b610cec565b60405161037e9190613183565b60405180910390f35b61038f610dd5565b005b6103ab60048036038101906103a6919061272c565b610e5d565b6040516103b89190613183565b60405180910390f35b6103c9610e75565b6040516103d69190613183565b60405180910390f35b6103e7610e7b565b005b6103f1610f46565b6040516103fe9190612e3f565b60405180910390f35b61040f610f70565b60405161041c9190612ec1565b60405180910390f35b61043f600480360381019061043a919061286f565b611002565b005b610449611183565b6040516104569190613183565b60405180910390f35b610479600480360381019061047491906127ec565b611189565b005b61049560048036038101906104909190612992565b6111e5565b6040516104a29190612ec1565b60405180910390f35b6104c560048036038101906104c09190612759565b61128d565b6040516104d29190612ea6565b60405180910390f35b6104f560048036038101906104f0919061272c565b611321565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061063a575061063982611419565b5b9050919050565b6060600180546106509061347a565b80601f016020809104026020016040519081016040528092919081815260200182805461067c9061347a565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b60006106de82611483565b61071d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071490613163565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076382610cd6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb90613083565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f3611490565b73ffffffffffffffffffffffffffffffffffffffff16148061082257506108218161081c611490565b61128d565b5b610861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085890612fa3565b60405180910390fd5b61086c838383611498565b505050565b60006001600054610882919061334a565b905090565b61089283838361154a565b505050565b60006108a283610cec565b82106108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da90612ee3565b60405180910390fd5b60006108ed610871565b905060008060005b83811015610a53576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146109e757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3f5786841415610a30578195505050505050610a8f565b8380610a3b906134dd565b9450505b508080610a4b906134dd565b9150506108f5565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613143565b60405180910390fd5b92915050565b610bb881565b610ab683838360405180602001604052806000815250611189565b505050565b6000610ac5610871565b8210610b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afd90612f43565b60405180910390fd5b819050919050565b610b16611490565b73ffffffffffffffffffffffffffffffffffffffff16610b34610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190613003565b60405180910390fd5b8060089080519060200190610ba0929190612506565b5050565b600954610baf610871565b10610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be690612f83565b60405180910390fd5b600a54600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990613103565b60405180910390fd5b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cc291906132c3565b92505081905550610cd4336001611af1565b565b6000610ce182611b0f565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490612fc3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610ddd611490565b73ffffffffffffffffffffffffffffffffffffffff16610dfb610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613003565b60405180910390fd5b610e5b6000611c6a565b565b600b6020528060005260406000206000915090505481565b600a5481565b610e83611490565b73ffffffffffffffffffffffffffffffffffffffff16610ea1610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613003565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f42573d6000803e3d6000fd5b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610f7f9061347a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab9061347a565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b61100a611490565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613043565b60405180910390fd5b8060066000611085611490565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611132611490565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111779190612ea6565b60405180910390a35050565b60095481565b61119484848461154a565b6111a084848484611d30565b6111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d6906130c3565b60405180910390fd5b50505050565b60606111f082611483565b61122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613023565b60405180910390fd5b60006008805461123e9061347a565b90501161125a5760405180602001604052806000815250611286565b600861126583611ec7565b604051602001611276929190612e10565b6040516020818303038152906040525b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611329611490565b73ffffffffffffffffffffffffffffffffffffffff16611347610f46565b73ffffffffffffffffffffffffffffffffffffffff161461139d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139490613003565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490612f03565b60405180910390fd5b61141681611c6a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061155582611b0f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661157c611490565b73ffffffffffffffffffffffffffffffffffffffff1614806115d857506115a1611490565b73ffffffffffffffffffffffffffffffffffffffff166115c0846106d3565b73ffffffffffffffffffffffffffffffffffffffff16145b806115f457506115f382600001516115ee611490565b61128d565b5b905080611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90613063565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90612fe3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90612f63565b60405180910390fd5b6117258585856001612028565b6117356000848460000151611498565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461193b91906132c3565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a81576119b181611483565b15611a80576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ae9868686600161202e565b505050505050565b611b0b828260405180602001604052806000815250612034565b5050565b611b1761258c565b611b2082611483565b611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690612f23565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c51578092505050611c65565b508080611c5d90613450565b915050611b65565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611d518473ffffffffffffffffffffffffffffffffffffffff166124f3565b15611eba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d7a611490565b8786866040518563ffffffff1660e01b8152600401611d9c9493929190612e5a565b602060405180830381600087803b158015611db657600080fd5b505af1925050508015611de757506040513d601f19601f82011682018060405250810190611de4919061291c565b60015b611e6a573d8060008114611e17576040519150601f19603f3d011682016040523d82523d6000602084013e611e1c565b606091505b50600081511415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e59906130c3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ebf565b600190505b949350505050565b60606000821415611f0f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612023565b600082905060005b60008214611f41578080611f2a906134dd565b915050600a82611f3a9190613319565b9150611f17565b60008167ffffffffffffffff811115611f5d57611f5c613613565b5b6040519080825280601f01601f191660200182016040528015611f8f5781602001600182028036833780820191505090505b5090505b6000851461201c57600182611fa8919061334a565b9150600a85611fb79190613526565b6030611fc391906132c3565b60f81b818381518110611fd957611fd86135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120159190613319565b9450611f93565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613123565b60405180910390fd5b6120b381611483565b156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea906130e3565b60405180910390fd5b60008311612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212d906130a3565b60405180910390fd5b6121436000858386612028565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612240919061327d565b6fffffffffffffffffffffffffffffffff168152602001858360200151612267919061327d565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156124d657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124766000888488611d30565b6124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac906130c3565b60405180910390fd5b81806124c0906134dd565b92505080806124ce906134dd565b915050612405565b50806000819055506124eb600087858861202e565b505050505050565b600080823b905060008111915050919050565b8280546125129061347a565b90600052602060002090601f016020900481019282612534576000855561257b565b82601f1061254d57805160ff191683800117855561257b565b8280016001018555821561257b579182015b8281111561257a57825182559160200191906001019061255f565b5b50905061258891906125c6565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156125df5760008160009055506001016125c7565b5090565b60006125f66125f1846131c3565b61319e565b90508281526020810184848401111561261257612611613647565b5b61261d84828561340e565b509392505050565b6000612638612633846131f4565b61319e565b90508281526020810184848401111561265457612653613647565b5b61265f84828561340e565b509392505050565b60008135905061267681613c4d565b92915050565b60008135905061268b81613c64565b92915050565b6000813590506126a081613c7b565b92915050565b6000815190506126b581613c7b565b92915050565b600082601f8301126126d0576126cf613642565b5b81356126e08482602086016125e3565b91505092915050565b600082601f8301126126fe576126fd613642565b5b813561270e848260208601612625565b91505092915050565b60008135905061272681613c92565b92915050565b60006020828403121561274257612741613651565b5b600061275084828501612667565b91505092915050565b600080604083850312156127705761276f613651565b5b600061277e85828601612667565b925050602061278f85828601612667565b9150509250929050565b6000806000606084860312156127b2576127b1613651565b5b60006127c086828701612667565b93505060206127d186828701612667565b92505060406127e286828701612717565b9150509250925092565b6000806000806080858703121561280657612805613651565b5b600061281487828801612667565b945050602061282587828801612667565b935050604061283687828801612717565b925050606085013567ffffffffffffffff8111156128575761285661364c565b5b612863878288016126bb565b91505092959194509250565b6000806040838503121561288657612885613651565b5b600061289485828601612667565b92505060206128a58582860161267c565b9150509250929050565b600080604083850312156128c6576128c5613651565b5b60006128d485828601612667565b92505060206128e585828601612717565b9150509250929050565b60006020828403121561290557612904613651565b5b600061291384828501612691565b91505092915050565b60006020828403121561293257612931613651565b5b6000612940848285016126a6565b91505092915050565b60006020828403121561295f5761295e613651565b5b600082013567ffffffffffffffff81111561297d5761297c61364c565b5b612989848285016126e9565b91505092915050565b6000602082840312156129a8576129a7613651565b5b60006129b684828501612717565b91505092915050565b6129c88161337e565b82525050565b6129d781613390565b82525050565b60006129e88261323a565b6129f28185613250565b9350612a0281856020860161341d565b612a0b81613656565b840191505092915050565b6000612a2182613245565b612a2b8185613261565b9350612a3b81856020860161341d565b612a4481613656565b840191505092915050565b6000612a5a82613245565b612a648185613272565b9350612a7481856020860161341d565b80840191505092915050565b60008154612a8d8161347a565b612a978186613272565b94506001821660008114612ab25760018114612ac357612af6565b60ff19831686528186019350612af6565b612acc85613225565b60005b83811015612aee57815481890152600182019150602081019050612acf565b838801955050505b50505092915050565b6000612b0c602283613261565b9150612b1782613667565b604082019050919050565b6000612b2f602683613261565b9150612b3a826136b6565b604082019050919050565b6000612b52602a83613261565b9150612b5d82613705565b604082019050919050565b6000612b75602383613261565b9150612b8082613754565b604082019050919050565b6000612b98602583613261565b9150612ba3826137a3565b604082019050919050565b6000612bbb600c83613261565b9150612bc6826137f2565b602082019050919050565b6000612bde603983613261565b9150612be98261381b565b604082019050919050565b6000612c01602b83613261565b9150612c0c8261386a565b604082019050919050565b6000612c24602683613261565b9150612c2f826138b9565b604082019050919050565b6000612c47600583613272565b9150612c5282613908565b600582019050919050565b6000612c6a602083613261565b9150612c7582613931565b602082019050919050565b6000612c8d602f83613261565b9150612c988261395a565b604082019050919050565b6000612cb0601a83613261565b9150612cbb826139a9565b602082019050919050565b6000612cd3603283613261565b9150612cde826139d2565b604082019050919050565b6000612cf6602283613261565b9150612d0182613a21565b604082019050919050565b6000612d19602383613261565b9150612d2482613a70565b604082019050919050565b6000612d3c603383613261565b9150612d4782613abf565b604082019050919050565b6000612d5f601d83613261565b9150612d6a82613b0e565b602082019050919050565b6000612d82600e83613261565b9150612d8d82613b37565b602082019050919050565b6000612da5602183613261565b9150612db082613b60565b604082019050919050565b6000612dc8602e83613261565b9150612dd382613baf565b604082019050919050565b6000612deb602d83613261565b9150612df682613bfe565b604082019050919050565b612e0a81613404565b82525050565b6000612e1c8285612a80565b9150612e288284612a4f565b9150612e3382612c3a565b91508190509392505050565b6000602082019050612e5460008301846129bf565b92915050565b6000608082019050612e6f60008301876129bf565b612e7c60208301866129bf565b612e896040830185612e01565b8181036060830152612e9b81846129dd565b905095945050505050565b6000602082019050612ebb60008301846129ce565b92915050565b60006020820190508181036000830152612edb8184612a16565b905092915050565b60006020820190508181036000830152612efc81612aff565b9050919050565b60006020820190508181036000830152612f1c81612b22565b9050919050565b60006020820190508181036000830152612f3c81612b45565b9050919050565b60006020820190508181036000830152612f5c81612b68565b9050919050565b60006020820190508181036000830152612f7c81612b8b565b9050919050565b60006020820190508181036000830152612f9c81612bae565b9050919050565b60006020820190508181036000830152612fbc81612bd1565b9050919050565b60006020820190508181036000830152612fdc81612bf4565b9050919050565b60006020820190508181036000830152612ffc81612c17565b9050919050565b6000602082019050818103600083015261301c81612c5d565b9050919050565b6000602082019050818103600083015261303c81612c80565b9050919050565b6000602082019050818103600083015261305c81612ca3565b9050919050565b6000602082019050818103600083015261307c81612cc6565b9050919050565b6000602082019050818103600083015261309c81612ce9565b9050919050565b600060208201905081810360008301526130bc81612d0c565b9050919050565b600060208201905081810360008301526130dc81612d2f565b9050919050565b600060208201905081810360008301526130fc81612d52565b9050919050565b6000602082019050818103600083015261311c81612d75565b9050919050565b6000602082019050818103600083015261313c81612d98565b9050919050565b6000602082019050818103600083015261315c81612dbb565b9050919050565b6000602082019050818103600083015261317c81612dde565b9050919050565b60006020820190506131986000830184612e01565b92915050565b60006131a86131b9565b90506131b482826134ac565b919050565b6000604051905090565b600067ffffffffffffffff8211156131de576131dd613613565b5b6131e782613656565b9050602081019050919050565b600067ffffffffffffffff82111561320f5761320e613613565b5b61321882613656565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613288826133c8565b9150613293836133c8565b9250826fffffffffffffffffffffffffffffffff038211156132b8576132b7613557565b5b828201905092915050565b60006132ce82613404565b91506132d983613404565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561330e5761330d613557565b5b828201905092915050565b600061332482613404565b915061332f83613404565b92508261333f5761333e613586565b5b828204905092915050565b600061335582613404565b915061336083613404565b92508282101561337357613372613557565b5b828203905092915050565b6000613389826133e4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561343b578082015181840152602081019050613420565b8381111561344a576000848401525b50505050565b600061345b82613404565b9150600082141561346f5761346e613557565b5b600182039050919050565b6000600282049050600182168061349257607f821691505b602082108114156134a6576134a56135b5565b5b50919050565b6134b582613656565b810181811067ffffffffffffffff821117156134d4576134d3613613565b5b80604052505050565b60006134e882613404565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561351b5761351a613557565b5b600182019050919050565b600061353182613404565b915061353c83613404565b92508261354c5761354b613586565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f204d6f7265204c6566740000000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f4f6e6c79203120616c6c6f776564000000000000000000000000000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b613c568161337e565b8114613c6157600080fd5b50565b613c6d81613390565b8114613c7857600080fd5b50565b613c848161339c565b8114613c8f57600080fd5b50565b613c9b81613404565b8114613ca657600080fd5b5056fea2646970667358221220cc0bf9d88d28830b35d39a934cf54a0e7f7365d7072036a5e484b4d737336de664736f6c63430008070033

Deployed Bytecode Sourcemap

38875:1415:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24324:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25951:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27512:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27033:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22761:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28388:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23429:823;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39055:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28621:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22942:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40017:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39417:285;;;:::i;:::-;;25760:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24760:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38025:103;;;:::i;:::-;;39186:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39137:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40133:149;;;:::i;:::-;;37374:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26120:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27798:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39100:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28869:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39713:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28157:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38283:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24324:372;24426:4;24478:25;24463:40;;;:11;:40;;;;:105;;;;24535:33;24520:48;;;:11;:48;;;;24463:105;:172;;;;24600:35;24585:50;;;:11;:50;;;;24463:172;:225;;;;24652:36;24676:11;24652:23;:36::i;:::-;24463:225;24443:245;;24324:372;;;:::o;25951:100::-;26005:13;26038:5;26031:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25951:100;:::o;27512:214::-;27580:7;27608:16;27616:7;27608;:16::i;:::-;27600:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27694:15;:24;27710:7;27694:24;;;;;;;;;;;;;;;;;;;;;27687:31;;27512:214;;;:::o;27033:413::-;27106:13;27122:24;27138:7;27122:15;:24::i;:::-;27106:40;;27171:5;27165:11;;:2;:11;;;;27157:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27266:5;27250:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27275:37;27292:5;27299:12;:10;:12::i;:::-;27275:16;:37::i;:::-;27250:62;27228:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;27410:28;27419:2;27423:7;27432:5;27410:8;:28::i;:::-;27095:351;27033:413;;:::o;22761:104::-;22814:7;22856:1;22841:12;;:16;;;;:::i;:::-;22834:23;;22761:104;:::o;28388:162::-;28514:28;28524:4;28530:2;28534:7;28514:9;:28::i;:::-;28388:162;;;:::o;23429:823::-;23518:7;23554:16;23564:5;23554:9;:16::i;:::-;23546:5;:24;23538:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23620:22;23645:13;:11;:13::i;:::-;23620:38;;23669:19;23703:25;23757:9;23752:426;23776:14;23772:1;:18;23752:426;;;23812:31;23846:11;:14;23858:1;23846:14;;;;;;;;;;;23812:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23905:1;23879:28;;:9;:14;;;:28;;;23875:103;;23948:9;:14;;;23928:34;;23875:103;24017:5;23996:26;;:17;:26;;;23992:175;;;24062:5;24047:11;:20;24043:77;;;24099:1;24092:8;;;;;;;;;24043:77;24138:13;;;;;:::i;:::-;;;;23992:175;23797:381;23792:3;;;;;:::i;:::-;;;;23752:426;;;;24188:56;;;;;;;;;;:::i;:::-;;;;;;;;23429:823;;;;;:::o;39055:38::-;39089:4;39055:38;:::o;28621:177::-;28751:39;28768:4;28774:2;28778:7;28751:39;;;;;;;;;;;;:16;:39::i;:::-;28621:177;;;:::o;22942:187::-;23009:7;23045:13;:11;:13::i;:::-;23037:5;:21;23029:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23116:5;23109:12;;22942:187;;;:::o;40017:104::-;37605:12;:10;:12::i;:::-;37594:23;;:7;:5;:7::i;:::-;:23;;;37586:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40103:10:::1;40093:7;:20;;;;;;;;;;;;:::i;:::-;;40017:104:::0;:::o;39417:285::-;39482:11;;39466:13;:11;:13::i;:::-;:27;39458:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;39563:20;;39529:19;:31;39549:10;39529:31;;;;;;;;;;;;;;;;:54;39521:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39658:1;39625:19;:31;39645:10;39625:31;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;39670:24;39680:10;39692:1;39670:9;:24::i;:::-;39417:285::o;25760:124::-;25824:7;25851:20;25863:7;25851:11;:20::i;:::-;:25;;;25844:32;;25760:124;;;:::o;24760:221::-;24824:7;24869:1;24852:19;;:5;:19;;;;24844:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;24945:12;:19;24958:5;24945:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24937:36;;24930:43;;24760:221;;;:::o;38025:103::-;37605:12;:10;:12::i;:::-;37594:23;;:7;:5;:7::i;:::-;:23;;;37586:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38090:30:::1;38117:1;38090:18;:30::i;:::-;38025:103::o:0;39186:51::-;;;;;;;;;;;;;;;;;:::o;39137:36::-;;;;:::o;40133:149::-;37605:12;:10;:12::i;:::-;37594:23;;:7;:5;:7::i;:::-;:23;;;37586:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40186:12:::1;40201:21;40186:36;;40241:10;40233:28;;:37;40262:7;40233:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40175:107;40133:149::o:0;37374:87::-;37420:7;37447:6;;;;;;;;;;;37440:13;;37374:87;:::o;26120:104::-;26176:13;26209:7;26202:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26120:104;:::o;27798:288::-;27905:12;:10;:12::i;:::-;27893:24;;:8;:24;;;;27885:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28006:8;27961:18;:32;27980:12;:10;:12::i;:::-;27961:32;;;;;;;;;;;;;;;:42;27994:8;27961:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28059:8;28030:48;;28045:12;:10;:12::i;:::-;28030:48;;;28069:8;28030:48;;;;;;:::i;:::-;;;;;;;;27798:288;;:::o;39100:30::-;;;;:::o;28869:355::-;29028:28;29038:4;29044:2;29048:7;29028:9;:28::i;:::-;29089:48;29112:4;29118:2;29122:7;29131:5;29089:22;:48::i;:::-;29067:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;28869:355;;;;:::o;39713:296::-;39786:13;39820:16;39828:7;39820;:16::i;:::-;39812:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39932:1;39914:7;39908:21;;;;;:::i;:::-;;;:25;:95;;;;;;;;;;;;;;;;;39960:7;39969:18;:7;:16;:18::i;:::-;39943:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39908:95;39901:102;;39713:296;;;:::o;28157:164::-;28254:4;28278:18;:25;28297:5;28278:25;;;;;;;;;;;;;;;:35;28304:8;28278:35;;;;;;;;;;;;;;;;;;;;;;;;;28271:42;;28157:164;;;;:::o;38283:201::-;37605:12;:10;:12::i;:::-;37594:23;;:7;:5;:7::i;:::-;:23;;;37586:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38392:1:::1;38372:22;;:8;:22;;;;38364:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38448:28;38467:8;38448:18;:28::i;:::-;38283:201:::0;:::o;13112:157::-;13197:4;13236:25;13221:40;;;:11;:40;;;;13214:47;;13112:157;;;:::o;29479:111::-;29536:4;29570:12;;29560:7;:22;29553:29;;29479:111;;;:::o;20703:98::-;20756:7;20783:10;20776:17;;20703:98;:::o;33523:196::-;33665:2;33638:15;:24;33654:7;33638:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33703:7;33699:2;33683:28;;33692:5;33683:28;;;;;;;;;;;;33523:196;;;:::o;31622:1783::-;31737:35;31775:20;31787:7;31775:11;:20::i;:::-;31737:58;;31808:22;31850:13;:18;;;31834:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;31909:12;:10;:12::i;:::-;31885:36;;:20;31897:7;31885:11;:20::i;:::-;:36;;;31834:87;:154;;;;31938:50;31955:13;:18;;;31975:12;:10;:12::i;:::-;31938:16;:50::i;:::-;31834:154;31808:181;;32010:17;32002:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;32125:4;32103:26;;:13;:18;;;:26;;;32095:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;32205:1;32191:16;;:2;:16;;;;32183:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:43;32284:4;32290:2;32294:7;32303:1;32262:21;:43::i;:::-;32370:49;32387:1;32391:7;32400:13;:18;;;32370:8;:49::i;:::-;32654:1;32624:12;:18;32637:4;32624:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32698:1;32670:12;:16;32683:2;32670:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32746:43;;;;;;;;32761:2;32746:43;;;;;;32772:15;32746:43;;;;;32723:11;:20;32735:7;32723:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33029:19;33061:1;33051:7;:11;;;;:::i;:::-;33029:33;;33118:1;33077:43;;:11;:24;33089:11;33077:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;33073:227;;;33141:20;33149:11;33141:7;:20::i;:::-;33137:152;;;33209:64;;;;;;;;33224:13;:18;;;33209:64;;;;;;33244:13;:28;;;33209:64;;;;;33182:11;:24;33194:11;33182:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33137:152;33073:227;33336:7;33332:2;33317:27;;33326:4;33317:27;;;;;;;;;;;;33355:42;33376:4;33382:2;33386:7;33395:1;33355:20;:42::i;:::-;31726:1679;;;31622:1783;;;:::o;29598:104::-;29667:27;29677:2;29681:8;29667:27;;;;;;;;;;;;:9;:27::i;:::-;29598:104;;:::o;25226:472::-;25287:21;;:::i;:::-;25329:16;25337:7;25329;:16::i;:::-;25321:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25410:12;25425:7;25410:22;;25405:216;25459:31;25493:11;:17;25505:4;25493:17;;;;;;;;;;;25459:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25555:1;25529:28;;:9;:14;;;:28;;;25525:85;;25585:9;25578:16;;;;;;25525:85;25444:177;25436:6;;;;;:::i;:::-;;;;25405:216;;25226:472;;;;:::o;38644:191::-;38718:16;38737:6;;;;;;;;;;;38718:25;;38763:8;38754:6;;:17;;;;;;;;;;;;;;;;;;38818:8;38787:40;;38808:8;38787:40;;;;;;;;;;;;38707:128;38644:191;:::o;34284:804::-;34439:4;34460:15;:2;:13;;;:15::i;:::-;34456:625;;;34512:2;34496:36;;;34533:12;:10;:12::i;:::-;34547:4;34553:7;34562:5;34496:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34492:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34759:1;34742:6;:13;:18;34738:273;;;34785:61;;;;;;;;;;:::i;:::-;;;;;;;;34738:273;34961:6;34955:13;34946:6;34942:2;34938:15;34931:38;34492:534;34629:45;;;34619:55;;;:6;:55;;;;34612:62;;;;;34456:625;35065:4;35058:11;;34284:804;;;;;;;:::o;389:723::-;445:13;675:1;666:5;:10;662:53;;;693:10;;;;;;;;;;;;;;;;;;;;;662:53;725:12;740:5;725:20;;756:14;781:78;796:1;788:4;:9;781:78;;814:8;;;;;:::i;:::-;;;;845:2;837:10;;;;;:::i;:::-;;;781:78;;;869:19;901:6;891:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;869:39;;919:154;935:1;926:5;:10;919:154;;963:1;953:11;;;;;:::i;:::-;;;1030:2;1022:5;:10;;;;:::i;:::-;1009:2;:24;;;;:::i;:::-;996:39;;979:6;986;979:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1059:2;1050:11;;;;;:::i;:::-;;;919:154;;;1097:6;1083:21;;;;;389:723;;;;:::o;35576:159::-;;;;;:::o;36147:158::-;;;;;:::o;29979:1389::-;30102:20;30125:12;;30102:35;;30170:1;30156:16;;:2;:16;;;;30148:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30355:21;30363:12;30355:7;:21::i;:::-;30354:22;30346:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30440:1;30429:8;:12;30421:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30494:61;30524:1;30528:2;30532:12;30546:8;30494:21;:61::i;:::-;30568:30;30601:12;:16;30614:2;30601:16;;;;;;;;;;;;;;;30568:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:135;;;;;;;;30703:8;30673:11;:19;;;:39;;;;:::i;:::-;30647:135;;;;;;30762:8;30727:11;:24;;;:44;;;;:::i;:::-;30647:135;;;;;30628:12;:16;30641:2;30628:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30821:43;;;;;;;;30836:2;30821:43;;;;;;30847:15;30821:43;;;;;30793:11;:25;30805:12;30793:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30877:20;30900:12;30877:35;;30930:9;30925:325;30949:8;30945:1;:12;30925:325;;;31009:12;31005:2;30984:38;;31001:1;30984:38;;;;;;;;;;;;31063:59;31094:1;31098:2;31102:12;31116:5;31063:22;:59::i;:::-;31037:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;31224:14;;;;;:::i;:::-;;;;30959:3;;;;;:::i;:::-;;;;30925:325;;;;31277:12;31262;:27;;;;31300:60;31329:1;31333:2;31337:12;31351:8;31300:20;:60::i;:::-;30091:1277;;;29979:1389;;;:::o;2968:387::-;3028:4;3236:12;3303:7;3291:20;3283:28;;3346:1;3339:4;:8;3332:15;;;2968:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:::-;11021:3;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11118:93;11207:3;11118:93;:::i;:::-;11236:2;11231:3;11227:12;11220:19;;10879:366;;;:::o;11251:::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11251:366;;;:::o;11623:::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11623:366;;;:::o;11995:::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;11995:366;;;:::o;12367:::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12367:366;;;:::o;12739:400::-;12899:3;12920:84;13002:1;12997:3;12920:84;:::i;:::-;12913:91;;13013:93;13102:3;13013:93;:::i;:::-;13131:1;13126:3;13122:11;13115:18;;12739:400;;;:::o;13145:366::-;13287:3;13308:67;13372:2;13367:3;13308:67;:::i;:::-;13301:74;;13384:93;13473:3;13384:93;:::i;:::-;13502:2;13497:3;13493:12;13486:19;;13145:366;;;:::o;13517:::-;13659:3;13680:67;13744:2;13739:3;13680:67;:::i;:::-;13673:74;;13756:93;13845:3;13756:93;:::i;:::-;13874:2;13869:3;13865:12;13858:19;;13517:366;;;:::o;13889:::-;14031:3;14052:67;14116:2;14111:3;14052:67;:::i;:::-;14045:74;;14128:93;14217:3;14128:93;:::i;:::-;14246:2;14241:3;14237:12;14230:19;;13889:366;;;:::o;14261:::-;14403:3;14424:67;14488:2;14483:3;14424:67;:::i;:::-;14417:74;;14500:93;14589:3;14500:93;:::i;:::-;14618:2;14613:3;14609:12;14602:19;;14261:366;;;:::o;14633:::-;14775:3;14796:67;14860:2;14855:3;14796:67;:::i;:::-;14789:74;;14872:93;14961:3;14872:93;:::i;:::-;14990:2;14985:3;14981:12;14974:19;;14633:366;;;:::o;15005:::-;15147:3;15168:67;15232:2;15227:3;15168:67;:::i;:::-;15161:74;;15244:93;15333:3;15244:93;:::i;:::-;15362:2;15357:3;15353:12;15346:19;;15005:366;;;:::o;15377:::-;15519:3;15540:67;15604:2;15599:3;15540:67;:::i;:::-;15533:74;;15616:93;15705:3;15616:93;:::i;:::-;15734:2;15729:3;15725:12;15718:19;;15377:366;;;:::o;15749:::-;15891:3;15912:67;15976:2;15971:3;15912:67;:::i;:::-;15905:74;;15988:93;16077:3;15988:93;:::i;:::-;16106:2;16101:3;16097:12;16090:19;;15749:366;;;:::o;16121:::-;16263:3;16284:67;16348:2;16343:3;16284:67;:::i;:::-;16277:74;;16360:93;16449:3;16360:93;:::i;:::-;16478:2;16473:3;16469:12;16462:19;;16121:366;;;:::o;16493:::-;16635:3;16656:67;16720:2;16715:3;16656:67;:::i;:::-;16649:74;;16732:93;16821:3;16732:93;:::i;:::-;16850:2;16845:3;16841:12;16834:19;;16493:366;;;:::o;16865:::-;17007:3;17028:67;17092:2;17087:3;17028:67;:::i;:::-;17021:74;;17104:93;17193:3;17104:93;:::i;:::-;17222:2;17217:3;17213:12;17206:19;;16865:366;;;:::o;17609:::-;17751:3;17772:67;17836:2;17831:3;17772:67;:::i;:::-;17765:74;;17848:93;17937:3;17848:93;:::i;:::-;17966:2;17961:3;17957:12;17950:19;;17609:366;;;:::o;17981:118::-;18068:24;18086:5;18068:24;:::i;:::-;18063:3;18056:37;17981:118;;:::o;18105:695::-;18383:3;18405:92;18493:3;18484:6;18405:92;:::i;:::-;18398:99;;18514:95;18605:3;18596:6;18514:95;:::i;:::-;18507:102;;18626:148;18770:3;18626:148;:::i;:::-;18619:155;;18791:3;18784:10;;18105:695;;;;;:::o;18806:222::-;18899:4;18937:2;18926:9;18922:18;18914:26;;18950:71;19018:1;19007:9;19003:17;18994:6;18950:71;:::i;:::-;18806:222;;;;:::o;19034:640::-;19229:4;19267:3;19256:9;19252:19;19244:27;;19281:71;19349:1;19338:9;19334:17;19325:6;19281:71;:::i;:::-;19362:72;19430:2;19419:9;19415:18;19406:6;19362:72;:::i;:::-;19444;19512:2;19501:9;19497:18;19488:6;19444:72;:::i;:::-;19563:9;19557:4;19553:20;19548:2;19537:9;19533:18;19526:48;19591:76;19662:4;19653:6;19591:76;:::i;:::-;19583:84;;19034:640;;;;;;;:::o;19680:210::-;19767:4;19805:2;19794:9;19790:18;19782:26;;19818:65;19880:1;19869:9;19865:17;19856:6;19818:65;:::i;:::-;19680:210;;;;:::o;19896:313::-;20009:4;20047:2;20036:9;20032:18;20024:26;;20096:9;20090:4;20086:20;20082:1;20071:9;20067:17;20060:47;20124:78;20197:4;20188:6;20124:78;:::i;:::-;20116:86;;19896:313;;;;:::o;20215:419::-;20381:4;20419:2;20408:9;20404:18;20396:26;;20468:9;20462:4;20458:20;20454:1;20443:9;20439:17;20432:47;20496:131;20622:4;20496:131;:::i;:::-;20488:139;;20215:419;;;:::o;20640:::-;20806:4;20844:2;20833:9;20829:18;20821:26;;20893:9;20887:4;20883:20;20879:1;20868:9;20864:17;20857:47;20921:131;21047:4;20921:131;:::i;:::-;20913:139;;20640:419;;;:::o;21065:::-;21231:4;21269:2;21258:9;21254:18;21246:26;;21318:9;21312:4;21308:20;21304:1;21293:9;21289:17;21282:47;21346:131;21472:4;21346:131;:::i;:::-;21338:139;;21065:419;;;:::o;21490:::-;21656:4;21694:2;21683:9;21679:18;21671:26;;21743:9;21737:4;21733:20;21729:1;21718:9;21714:17;21707:47;21771:131;21897:4;21771:131;:::i;:::-;21763:139;;21490:419;;;:::o;21915:::-;22081:4;22119:2;22108:9;22104:18;22096:26;;22168:9;22162:4;22158:20;22154:1;22143:9;22139:17;22132:47;22196:131;22322:4;22196:131;:::i;:::-;22188:139;;21915:419;;;:::o;22340:::-;22506:4;22544:2;22533:9;22529:18;22521:26;;22593:9;22587:4;22583:20;22579:1;22568:9;22564:17;22557:47;22621:131;22747:4;22621:131;:::i;:::-;22613:139;;22340:419;;;:::o;22765:::-;22931:4;22969:2;22958:9;22954:18;22946:26;;23018:9;23012:4;23008:20;23004:1;22993:9;22989:17;22982:47;23046:131;23172:4;23046:131;:::i;:::-;23038:139;;22765:419;;;:::o;23190:::-;23356:4;23394:2;23383:9;23379:18;23371:26;;23443:9;23437:4;23433:20;23429:1;23418:9;23414:17;23407:47;23471:131;23597:4;23471:131;:::i;:::-;23463:139;;23190:419;;;:::o;23615:::-;23781:4;23819:2;23808:9;23804:18;23796:26;;23868:9;23862:4;23858:20;23854:1;23843:9;23839:17;23832:47;23896:131;24022:4;23896:131;:::i;:::-;23888:139;;23615:419;;;:::o;24040:::-;24206:4;24244:2;24233:9;24229:18;24221:26;;24293:9;24287:4;24283:20;24279:1;24268:9;24264:17;24257:47;24321:131;24447:4;24321:131;:::i;:::-;24313:139;;24040:419;;;:::o;24465:::-;24631:4;24669:2;24658:9;24654:18;24646:26;;24718:9;24712:4;24708:20;24704:1;24693:9;24689:17;24682:47;24746:131;24872:4;24746:131;:::i;:::-;24738:139;;24465:419;;;:::o;24890:::-;25056:4;25094:2;25083:9;25079:18;25071:26;;25143:9;25137:4;25133:20;25129:1;25118:9;25114:17;25107:47;25171:131;25297:4;25171:131;:::i;:::-;25163:139;;24890:419;;;:::o;25315:::-;25481:4;25519:2;25508:9;25504:18;25496:26;;25568:9;25562:4;25558:20;25554:1;25543:9;25539:17;25532:47;25596:131;25722:4;25596:131;:::i;:::-;25588:139;;25315:419;;;:::o;25740:::-;25906:4;25944:2;25933:9;25929:18;25921:26;;25993:9;25987:4;25983:20;25979:1;25968:9;25964:17;25957:47;26021:131;26147:4;26021:131;:::i;:::-;26013:139;;25740:419;;;:::o;26165:::-;26331:4;26369:2;26358:9;26354:18;26346:26;;26418:9;26412:4;26408:20;26404:1;26393:9;26389:17;26382:47;26446:131;26572:4;26446:131;:::i;:::-;26438:139;;26165:419;;;:::o;26590:::-;26756:4;26794:2;26783:9;26779:18;26771:26;;26843:9;26837:4;26833:20;26829:1;26818:9;26814:17;26807:47;26871:131;26997:4;26871:131;:::i;:::-;26863:139;;26590:419;;;:::o;27015:::-;27181:4;27219:2;27208:9;27204:18;27196:26;;27268:9;27262:4;27258:20;27254:1;27243:9;27239:17;27232:47;27296:131;27422:4;27296:131;:::i;:::-;27288:139;;27015:419;;;:::o;27440:::-;27606:4;27644:2;27633:9;27629:18;27621:26;;27693:9;27687:4;27683:20;27679:1;27668:9;27664:17;27657:47;27721:131;27847:4;27721:131;:::i;:::-;27713:139;;27440:419;;;:::o;27865:::-;28031:4;28069:2;28058:9;28054:18;28046:26;;28118:9;28112:4;28108:20;28104:1;28093:9;28089:17;28082:47;28146:131;28272:4;28146:131;:::i;:::-;28138:139;;27865:419;;;:::o;28290:::-;28456:4;28494:2;28483:9;28479:18;28471:26;;28543:9;28537:4;28533:20;28529:1;28518:9;28514:17;28507:47;28571:131;28697:4;28571:131;:::i;:::-;28563:139;;28290:419;;;:::o;29140:::-;29306:4;29344:2;29333:9;29329:18;29321:26;;29393:9;29387:4;29383:20;29379:1;29368:9;29364:17;29357:47;29421:131;29547:4;29421:131;:::i;:::-;29413:139;;29140:419;;;:::o;29565:222::-;29658:4;29696:2;29685:9;29681:18;29673:26;;29709:71;29777:1;29766:9;29762:17;29753:6;29709:71;:::i;:::-;29565:222;;;;:::o;29793:129::-;29827:6;29854:20;;:::i;:::-;29844:30;;29883:33;29911:4;29903:6;29883:33;:::i;:::-;29793:129;;;:::o;29928:75::-;29961:6;29994:2;29988:9;29978:19;;29928:75;:::o;30009:307::-;30070:4;30160:18;30152:6;30149:30;30146:56;;;30182:18;;:::i;:::-;30146:56;30220:29;30242:6;30220:29;:::i;:::-;30212:37;;30304:4;30298;30294:15;30286:23;;30009:307;;;:::o;30322:308::-;30384:4;30474:18;30466:6;30463:30;30460:56;;;30496:18;;:::i;:::-;30460:56;30534:29;30556:6;30534:29;:::i;:::-;30526:37;;30618:4;30612;30608:15;30600:23;;30322:308;;;:::o;30636:141::-;30685:4;30708:3;30700:11;;30731:3;30728:1;30721:14;30765:4;30762:1;30752:18;30744:26;;30636:141;;;:::o;30783:98::-;30834:6;30868:5;30862:12;30852:22;;30783:98;;;:::o;30887:99::-;30939:6;30973:5;30967:12;30957:22;;30887:99;;;:::o;30992:168::-;31075:11;31109:6;31104:3;31097:19;31149:4;31144:3;31140:14;31125:29;;30992:168;;;;:::o;31166:169::-;31250:11;31284:6;31279:3;31272:19;31324:4;31319:3;31315:14;31300:29;;31166:169;;;;:::o;31341:148::-;31443:11;31480:3;31465:18;;31341:148;;;;:::o;31495:273::-;31535:3;31554:20;31572:1;31554:20;:::i;:::-;31549:25;;31588:20;31606:1;31588:20;:::i;:::-;31583:25;;31710:1;31674:34;31670:42;31667:1;31664:49;31661:75;;;31716:18;;:::i;:::-;31661:75;31760:1;31757;31753:9;31746:16;;31495:273;;;;:::o;31774:305::-;31814:3;31833:20;31851:1;31833:20;:::i;:::-;31828:25;;31867:20;31885:1;31867:20;:::i;:::-;31862:25;;32021:1;31953:66;31949:74;31946:1;31943:81;31940:107;;;32027:18;;:::i;:::-;31940:107;32071:1;32068;32064:9;32057:16;;31774:305;;;;:::o;32085:185::-;32125:1;32142:20;32160:1;32142:20;:::i;:::-;32137:25;;32176:20;32194:1;32176:20;:::i;:::-;32171:25;;32215:1;32205:35;;32220:18;;:::i;:::-;32205:35;32262:1;32259;32255:9;32250:14;;32085:185;;;;:::o;32276:191::-;32316:4;32336:20;32354:1;32336:20;:::i;:::-;32331:25;;32370:20;32388:1;32370:20;:::i;:::-;32365:25;;32409:1;32406;32403:8;32400:34;;;32414:18;;:::i;:::-;32400:34;32459:1;32456;32452:9;32444:17;;32276:191;;;;:::o;32473:96::-;32510:7;32539:24;32557:5;32539:24;:::i;:::-;32528:35;;32473:96;;;:::o;32575:90::-;32609:7;32652:5;32645:13;32638:21;32627:32;;32575:90;;;:::o;32671:149::-;32707:7;32747:66;32740:5;32736:78;32725:89;;32671:149;;;:::o;32826:118::-;32863:7;32903:34;32896:5;32892:46;32881:57;;32826:118;;;:::o;32950:126::-;32987:7;33027:42;33020:5;33016:54;33005:65;;32950:126;;;:::o;33082:77::-;33119:7;33148:5;33137:16;;33082:77;;;:::o;33165:154::-;33249:6;33244:3;33239;33226:30;33311:1;33302:6;33297:3;33293:16;33286:27;33165:154;;;:::o;33325:307::-;33393:1;33403:113;33417:6;33414:1;33411:13;33403:113;;;33502:1;33497:3;33493:11;33487:18;33483:1;33478:3;33474:11;33467:39;33439:2;33436:1;33432:10;33427:15;;33403:113;;;33534:6;33531:1;33528:13;33525:101;;;33614:1;33605:6;33600:3;33596:16;33589:27;33525:101;33374:258;33325:307;;;:::o;33638:171::-;33677:3;33700:24;33718:5;33700:24;:::i;:::-;33691:33;;33746:4;33739:5;33736:15;33733:41;;;33754:18;;:::i;:::-;33733:41;33801:1;33794:5;33790:13;33783:20;;33638:171;;;:::o;33815:320::-;33859:6;33896:1;33890:4;33886:12;33876:22;;33943:1;33937:4;33933:12;33964:18;33954:81;;34020:4;34012:6;34008:17;33998:27;;33954:81;34082:2;34074:6;34071:14;34051:18;34048:38;34045:84;;;34101:18;;:::i;:::-;34045:84;33866:269;33815:320;;;:::o;34141:281::-;34224:27;34246:4;34224:27;:::i;:::-;34216:6;34212:40;34354:6;34342:10;34339:22;34318:18;34306:10;34303:34;34300:62;34297:88;;;34365:18;;:::i;:::-;34297:88;34405:10;34401:2;34394:22;34184:238;34141:281;;:::o;34428:233::-;34467:3;34490:24;34508:5;34490:24;:::i;:::-;34481:33;;34536:66;34529:5;34526:77;34523:103;;;34606:18;;:::i;:::-;34523:103;34653:1;34646:5;34642:13;34635:20;;34428:233;;;:::o;34667:176::-;34699:1;34716:20;34734:1;34716:20;:::i;:::-;34711:25;;34750:20;34768:1;34750:20;:::i;:::-;34745:25;;34789:1;34779:35;;34794:18;;:::i;:::-;34779:35;34835:1;34832;34828:9;34823:14;;34667:176;;;;:::o;34849:180::-;34897:77;34894:1;34887:88;34994:4;34991:1;34984:15;35018:4;35015:1;35008:15;35035:180;35083:77;35080:1;35073:88;35180:4;35177:1;35170:15;35204:4;35201:1;35194:15;35221:180;35269:77;35266:1;35259:88;35366:4;35363:1;35356:15;35390:4;35387:1;35380:15;35407:180;35455:77;35452:1;35445:88;35552:4;35549:1;35542:15;35576:4;35573:1;35566:15;35593:180;35641:77;35638:1;35631:88;35738:4;35735:1;35728:15;35762:4;35759:1;35752:15;35779:117;35888:1;35885;35878:12;35902:117;36011:1;36008;36001:12;36025:117;36134:1;36131;36124:12;36148:117;36257:1;36254;36247:12;36271:102;36312:6;36363:2;36359:7;36354:2;36347:5;36343:14;36339:28;36329:38;;36271:102;;;:::o;36379:221::-;36519:34;36515:1;36507:6;36503:14;36496:58;36588:4;36583:2;36575:6;36571:15;36564:29;36379:221;:::o;36606:225::-;36746:34;36742:1;36734:6;36730:14;36723:58;36815:8;36810:2;36802:6;36798:15;36791:33;36606:225;:::o;36837:229::-;36977:34;36973:1;36965:6;36961:14;36954:58;37046:12;37041:2;37033:6;37029:15;37022:37;36837:229;:::o;37072:222::-;37212:34;37208:1;37200:6;37196:14;37189:58;37281:5;37276:2;37268:6;37264:15;37257:30;37072:222;:::o;37300:224::-;37440:34;37436:1;37428:6;37424:14;37417:58;37509:7;37504:2;37496:6;37492:15;37485:32;37300:224;:::o;37530:162::-;37670:14;37666:1;37658:6;37654:14;37647:38;37530:162;:::o;37698:244::-;37838:34;37834:1;37826:6;37822:14;37815:58;37907:27;37902:2;37894:6;37890:15;37883:52;37698:244;:::o;37948:230::-;38088:34;38084:1;38076:6;38072:14;38065:58;38157:13;38152:2;38144:6;38140:15;38133:38;37948:230;:::o;38184:225::-;38324:34;38320:1;38312:6;38308:14;38301:58;38393:8;38388:2;38380:6;38376:15;38369:33;38184:225;:::o;38415:155::-;38555:7;38551:1;38543:6;38539:14;38532:31;38415:155;:::o;38576:182::-;38716:34;38712:1;38704:6;38700:14;38693:58;38576:182;:::o;38764:234::-;38904:34;38900:1;38892:6;38888:14;38881:58;38973:17;38968:2;38960:6;38956:15;38949:42;38764:234;:::o;39004:176::-;39144:28;39140:1;39132:6;39128:14;39121:52;39004:176;:::o;39186:237::-;39326:34;39322:1;39314:6;39310:14;39303:58;39395:20;39390:2;39382:6;39378:15;39371:45;39186:237;:::o;39429:221::-;39569:34;39565:1;39557:6;39553:14;39546:58;39638:4;39633:2;39625:6;39621:15;39614:29;39429:221;:::o;39656:222::-;39796:34;39792:1;39784:6;39780:14;39773:58;39865:5;39860:2;39852:6;39848:15;39841:30;39656:222;:::o;39884:238::-;40024:34;40020:1;40012:6;40008:14;40001:58;40093:21;40088:2;40080:6;40076:15;40069:46;39884:238;:::o;40128:179::-;40268:31;40264:1;40256:6;40252:14;40245:55;40128:179;:::o;40313:164::-;40453:16;40449:1;40441:6;40437:14;40430:40;40313:164;:::o;40483:220::-;40623:34;40619:1;40611:6;40607:14;40600:58;40692:3;40687:2;40679:6;40675:15;40668:28;40483:220;:::o;40709:233::-;40849:34;40845:1;40837:6;40833:14;40826:58;40918:16;40913:2;40905:6;40901:15;40894:41;40709:233;:::o;41188:232::-;41328:34;41324:1;41316:6;41312:14;41305:58;41397:15;41392:2;41384:6;41380:15;41373:40;41188:232;:::o;41426:122::-;41499:24;41517:5;41499:24;:::i;:::-;41492:5;41489:35;41479:63;;41538:1;41535;41528:12;41479:63;41426:122;:::o;41554:116::-;41624:21;41639:5;41624:21;:::i;:::-;41617:5;41614:32;41604:60;;41660:1;41657;41650:12;41604:60;41554:116;:::o;41676:120::-;41748:23;41765:5;41748:23;:::i;:::-;41741:5;41738:34;41728:62;;41786:1;41783;41776:12;41728:62;41676:120;:::o;41802:122::-;41875:24;41893:5;41875:24;:::i;:::-;41868:5;41865:35;41855:63;;41914:1;41911;41904:12;41855:63;41802:122;:::o

Swarm Source

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