APE Price: $1.33 (+4.37%)

Token

PixelPaws (PPW)

Overview

Max Total Supply

100 PPW

Holders

100

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Balance
1 PPW
0xe3b3549e1fef0ade0d5787d8c6fb9fd582a7e41f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
PixelPaws

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-11-02
*/

// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/[email protected]/utils/Context.sol



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

}

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;









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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/[email protected]/access/Ownable.sol



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

// File: PixelPaws.sol



pragma solidity ^0.8.26;



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

    uint public constant MAX_TOKENS = 100;
    uint256 public totalSupply;
    string public baseUri;
    string public baseExtension = ".json";

    mapping(address => bool) public hasReceivedNFT;

    constructor() ERC721("PixelPaws", "PPW") {
        baseUri = "ipfs://QmUbANrDM5DsB62MjEJjprKbnQDjje4LBd9KT9tbQBjeBd/";
    }

    function setBaseUri(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
            : "";
    }
 
    function _baseURI() internal view virtual override returns (string memory) {
        return baseUri;
    }

    function airdropNFT(address recipient) external onlyOwner {
        require(!hasReceivedNFT[recipient], "This address has already received an NFT.");
        
        uint256 curTotalSupply = totalSupply;
        require(curTotalSupply + 1 <= MAX_TOKENS, "Exceeds total supply.");

        _safeMint(recipient, curTotalSupply + 1);
        totalSupply += 1;

        hasReceivedNFT[recipient] = true;
    }
}

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_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"airdropNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasReceivedNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_baseUri","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":"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"}]

60806040526040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506009908161004891906103fc565b50348015610054575f80fd5b506040518060400160405280600981526020017f506978656c5061777300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f5050570000000000000000000000000000000000000000000000000000000000815250815f90816100cf91906103fc565b5080600190816100df91906103fc565b5050505f6100f16101bb60201b60201c565b90508060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060405180606001604052806036815260200161392b60369139600890816101b591906103fc565b506104cb565b5f33905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061023d57607f821691505b6020821081036102505761024f6101f9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102b27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610277565b6102bc8683610277565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6103006102fb6102f6846102d4565b6102dd565b6102d4565b9050919050565b5f819050919050565b610319836102e6565b61032d61032582610307565b848454610283565b825550505050565b5f90565b610341610335565b61034c818484610310565b505050565b5b8181101561036f576103645f82610339565b600181019050610352565b5050565b601f8211156103b45761038581610256565b61038e84610268565b8101602085101561039d578190505b6103b16103a985610268565b830182610351565b50505b505050565b5f82821c905092915050565b5f6103d45f19846008026103b9565b1980831691505092915050565b5f6103ec83836103c5565b9150826002028217905092915050565b610405826101c2565b67ffffffffffffffff81111561041e5761041d6101cc565b5b6104288254610226565b610433828285610373565b5f60209050601f831160018114610464575f8415610452578287015190505b61045c85826103e1565b8655506104c3565b601f19841661047286610256565b5f5b8281101561049957848901518255600182019150602085019450602081019050610474565b868310156104b657848901516104b2601f8916826103c5565b8355505b6001600288020188555050505b505050505050565b613453806104d85f395ff3fe608060405234801561000f575f80fd5b506004361061014b575f3560e01c80638da5cb5b116100c1578063c66828621161007a578063c668286214610387578063c87b56dd146103a5578063d21d8255146103d5578063e985e9c5146103f1578063f2fde38b14610421578063f47c84c51461043d5761014b565b80638da5cb5b146102d957806395d89b41146102f75780639abc832014610315578063a0bcfc7f14610333578063a22cb4651461034f578063b88d4fde1461036b5761014b565b806323b872dd1161011357806323b872dd1461020757806342842e0e146102235780635e8f07fb1461023f5780636352211e1461026f57806370a082311461029f578063715018a6146102cf5761014b565b806301ffc9a71461014f57806306fdde031461017f578063081812fc1461019d578063095ea7b3146101cd57806318160ddd146101e9575b5f80fd5b61016960048036038101906101649190611ed7565b61045b565b6040516101769190611f1c565b60405180910390f35b61018761053c565b6040516101949190611fa5565b60405180910390f35b6101b760048036038101906101b29190611ff8565b6105cb565b6040516101c49190612062565b60405180910390f35b6101e760048036038101906101e291906120a5565b61064c565b005b6101f1610762565b6040516101fe91906120f2565b60405180910390f35b610221600480360381019061021c919061210b565b610768565b005b61023d6004803603810190610238919061210b565b6107c8565b005b6102596004803603810190610254919061215b565b6107e7565b6040516102669190611f1c565b60405180910390f35b61028960048036038101906102849190611ff8565b610804565b6040516102969190612062565b60405180910390f35b6102b960048036038101906102b4919061215b565b6108b0565b6040516102c691906120f2565b60405180910390f35b6102d7610964565b005b6102e1610a9d565b6040516102ee9190612062565b60405180910390f35b6102ff610ac5565b60405161030c9190611fa5565b60405180910390f35b61031d610b55565b60405161032a9190611fa5565b60405180910390f35b61034d600480360381019061034891906122b2565b610be1565b005b61036960048036038101906103649190612323565b610c70565b005b610385600480360381019061038091906123ff565b610deb565b005b61038f610e4d565b60405161039c9190611fa5565b60405180910390f35b6103bf60048036038101906103ba9190611ff8565b610ed9565b6040516103cc9190611fa5565b60405180910390f35b6103ef60048036038101906103ea919061215b565b610f80565b005b61040b6004803603810190610406919061247f565b611164565b6040516104189190611f1c565b60405180910390f35b61043b6004803603810190610436919061215b565b6111f2565b005b61044561139a565b60405161045291906120f2565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061052557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061053557506105348261139f565b5b9050919050565b60605f805461054a906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610576906124ea565b80156105c15780601f10610598576101008083540402835291602001916105c1565b820191905f5260205f20905b8154815290600101906020018083116105a457829003601f168201915b5050505050905090565b5f6105d582611408565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b9061258a565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61065682610804565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd90612618565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e5611470565b73ffffffffffffffffffffffffffffffffffffffff16148061071457506107138161070e611470565b611164565b5b610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074a906126a6565b60405180910390fd5b61075d8383611477565b505050565b60075481565b610779610773611470565b8261152d565b6107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af90612734565b60405180910390fd5b6107c3838383611609565b505050565b6107e283838360405180602001604052805f815250610deb565b505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e906127c2565b60405180910390fd5b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690612850565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61096c611470565b73ffffffffffffffffffffffffffffffffffffffff1661098a610a9d565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906128b8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ad4906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610b00906124ea565b8015610b4b5780601f10610b2257610100808354040283529160200191610b4b565b820191905f5260205f20905b815481529060010190602001808311610b2e57829003601f168201915b5050505050905090565b60088054610b62906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8e906124ea565b8015610bd95780601f10610bb057610100808354040283529160200191610bd9565b820191905f5260205f20905b815481529060010190602001808311610bbc57829003601f168201915b505050505081565b610be9611470565b73ffffffffffffffffffffffffffffffffffffffff16610c07610a9d565b73ffffffffffffffffffffffffffffffffffffffff1614610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c54906128b8565b60405180910390fd5b8060089081610c6c9190612a73565b5050565b610c78611470565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90612b8c565b60405180910390fd5b8060055f610cf1611470565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d9a611470565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ddf9190611f1c565b60405180910390a35050565b610dfc610df6611470565b8361152d565b610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3290612734565b60405180910390fd5b610e4784848484611859565b50505050565b60098054610e5a906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610e86906124ea565b8015610ed15780601f10610ea857610100808354040283529160200191610ed1565b820191905f5260205f20905b815481529060010190602001808311610eb457829003601f168201915b505050505081565b6060610ee482611408565b610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612c1a565b60405180910390fd5b5f610f2c6118b5565b90505f815111610f4a5760405180602001604052805f815250610f78565b80610f5484611945565b6009604051602001610f6893929190612cf2565b6040516020818303038152906040525b915050919050565b610f88611470565b73ffffffffffffffffffffffffffffffffffffffff16610fa6610a9d565b73ffffffffffffffffffffffffffffffffffffffff1614610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff3906128b8565b60405180910390fd5b600a5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612d92565b60405180910390fd5b5f6007549050606460018261109b9190612ddd565b11156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390612e5a565b60405180910390fd5b6110f2826001836110ed9190612ddd565b611a9e565b600160075f8282546111049190612ddd565b925050819055506001600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6111fa611470565b73ffffffffffffffffffffffffffffffffffffffff16611218610a9d565b73ffffffffffffffffffffffffffffffffffffffff161461126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906128b8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390612ee8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114e783610804565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f61153782611408565b611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90612f76565b60405180910390fd5b5f61158083610804565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115ef57508373ffffffffffffffffffffffffffffffffffffffff166115d7846105cb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061160057506115ff8185611164565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661162982610804565b73ffffffffffffffffffffffffffffffffffffffff161461167f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167690613004565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e490613092565b60405180910390fd5b6116f8838383611abb565b6117025f82611477565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461174f91906130b0565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117a39190612ddd565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611864848484611609565b61187084848484611ac0565b6118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690613153565b60405180910390fd5b50505050565b6060600880546118c4906124ea565b80601f01602080910402602001604051908101604052809291908181526020018280546118f0906124ea565b801561193b5780601f106119125761010080835404028352916020019161193b565b820191905f5260205f20905b81548152906001019060200180831161191e57829003601f168201915b5050505050905090565b60605f820361198b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a99565b5f8290505f5b5f82146119ba5780806119a390613171565b915050600a826119b391906131e5565b9150611991565b5f8167ffffffffffffffff8111156119d5576119d461218e565b5b6040519080825280601f01601f191660200182016040528015611a075781602001600182028036833780820191505090505b5090505b5f8514611a9257600182611a1f91906130b0565b9150600a85611a2e9190613215565b6030611a3a9190612ddd565b60f81b818381518110611a5057611a4f613245565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85611a8b91906131e5565b9450611a0b565b8093505050505b919050565b611ab7828260405180602001604052805f815250611c42565b5050565b505050565b5f611ae08473ffffffffffffffffffffffffffffffffffffffff16611c9c565b15611c35578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b09611470565b8786866040518563ffffffff1660e01b8152600401611b2b94939291906132c4565b6020604051808303815f875af1925050508015611b6657506040513d601f19601f82011682018060405250810190611b639190613322565b60015b611be5573d805f8114611b94576040519150601f19603f3d011682016040523d82523d5f602084013e611b99565b606091505b505f815103611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490613153565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c3a565b600190505b949350505050565b611c4c8383611cad565b611c585f848484611ac0565b611c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8e90613153565b60405180910390fd5b505050565b5f80823b90505f8111915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1290613397565b60405180910390fd5b611d2481611408565b15611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b906133ff565b60405180910390fd5b611d6f5f8383611abb565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611dbc9190612ddd565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb681611e82565b8114611ec0575f80fd5b50565b5f81359050611ed181611ead565b92915050565b5f60208284031215611eec57611eeb611e7a565b5b5f611ef984828501611ec3565b91505092915050565b5f8115159050919050565b611f1681611f02565b82525050565b5f602082019050611f2f5f830184611f0d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611f7782611f35565b611f818185611f3f565b9350611f91818560208601611f4f565b611f9a81611f5d565b840191505092915050565b5f6020820190508181035f830152611fbd8184611f6d565b905092915050565b5f819050919050565b611fd781611fc5565b8114611fe1575f80fd5b50565b5f81359050611ff281611fce565b92915050565b5f6020828403121561200d5761200c611e7a565b5b5f61201a84828501611fe4565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61204c82612023565b9050919050565b61205c81612042565b82525050565b5f6020820190506120755f830184612053565b92915050565b61208481612042565b811461208e575f80fd5b50565b5f8135905061209f8161207b565b92915050565b5f80604083850312156120bb576120ba611e7a565b5b5f6120c885828601612091565b92505060206120d985828601611fe4565b9150509250929050565b6120ec81611fc5565b82525050565b5f6020820190506121055f8301846120e3565b92915050565b5f805f6060848603121561212257612121611e7a565b5b5f61212f86828701612091565b935050602061214086828701612091565b925050604061215186828701611fe4565b9150509250925092565b5f602082840312156121705761216f611e7a565b5b5f61217d84828501612091565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6121c482611f5d565b810181811067ffffffffffffffff821117156121e3576121e261218e565b5b80604052505050565b5f6121f5611e71565b905061220182826121bb565b919050565b5f67ffffffffffffffff8211156122205761221f61218e565b5b61222982611f5d565b9050602081019050919050565b828183375f83830152505050565b5f61225661225184612206565b6121ec565b9050828152602081018484840111156122725761227161218a565b5b61227d848285612236565b509392505050565b5f82601f83011261229957612298612186565b5b81356122a9848260208601612244565b91505092915050565b5f602082840312156122c7576122c6611e7a565b5b5f82013567ffffffffffffffff8111156122e4576122e3611e7e565b5b6122f084828501612285565b91505092915050565b61230281611f02565b811461230c575f80fd5b50565b5f8135905061231d816122f9565b92915050565b5f806040838503121561233957612338611e7a565b5b5f61234685828601612091565b92505060206123578582860161230f565b9150509250929050565b5f67ffffffffffffffff82111561237b5761237a61218e565b5b61238482611f5d565b9050602081019050919050565b5f6123a361239e84612361565b6121ec565b9050828152602081018484840111156123bf576123be61218a565b5b6123ca848285612236565b509392505050565b5f82601f8301126123e6576123e5612186565b5b81356123f6848260208601612391565b91505092915050565b5f805f806080858703121561241757612416611e7a565b5b5f61242487828801612091565b945050602061243587828801612091565b935050604061244687828801611fe4565b925050606085013567ffffffffffffffff81111561246757612466611e7e565b5b612473878288016123d2565b91505092959194509250565b5f806040838503121561249557612494611e7a565b5b5f6124a285828601612091565b92505060206124b385828601612091565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061250157607f821691505b602082108103612514576125136124bd565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612574602c83611f3f565b915061257f8261251a565b604082019050919050565b5f6020820190508181035f8301526125a181612568565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f612602602183611f3f565b915061260d826125a8565b604082019050919050565b5f6020820190508181035f83015261262f816125f6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f612690603883611f3f565b915061269b82612636565b604082019050919050565b5f6020820190508181035f8301526126bd81612684565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f61271e603183611f3f565b9150612729826126c4565b604082019050919050565b5f6020820190508181035f83015261274b81612712565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f6127ac602983611f3f565b91506127b782612752565b604082019050919050565b5f6020820190508181035f8301526127d9816127a0565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f61283a602a83611f3f565b9150612845826127e0565b604082019050919050565b5f6020820190508181035f8301526128678161282e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6128a2602083611f3f565b91506128ad8261286e565b602082019050919050565b5f6020820190508181035f8301526128cf81612896565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026129327fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128f7565b61293c86836128f7565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61297761297261296d84611fc5565b612954565b611fc5565b9050919050565b5f819050919050565b6129908361295d565b6129a461299c8261297e565b848454612903565b825550505050565b5f90565b6129b86129ac565b6129c3818484612987565b505050565b5b818110156129e6576129db5f826129b0565b6001810190506129c9565b5050565b601f821115612a2b576129fc816128d6565b612a05846128e8565b81016020851015612a14578190505b612a28612a20856128e8565b8301826129c8565b50505b505050565b5f82821c905092915050565b5f612a4b5f1984600802612a30565b1980831691505092915050565b5f612a638383612a3c565b9150826002028217905092915050565b612a7c82611f35565b67ffffffffffffffff811115612a9557612a9461218e565b5b612a9f82546124ea565b612aaa8282856129ea565b5f60209050601f831160018114612adb575f8415612ac9578287015190505b612ad38582612a58565b865550612b3a565b601f198416612ae9866128d6565b5f5b82811015612b1057848901518255600182019150602085019450602081019050612aeb565b86831015612b2d5784890151612b29601f891682612a3c565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f612b76601983611f3f565b9150612b8182612b42565b602082019050919050565b5f6020820190508181035f830152612ba381612b6a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f612c04602f83611f3f565b9150612c0f82612baa565b604082019050919050565b5f6020820190508181035f830152612c3181612bf8565b9050919050565b5f81905092915050565b5f612c4c82611f35565b612c568185612c38565b9350612c66818560208601611f4f565b80840191505092915050565b5f8154612c7e816124ea565b612c888186612c38565b9450600182165f8114612ca25760018114612cb757612ce9565b60ff1983168652811515820286019350612ce9565b612cc0856128d6565b5f5b83811015612ce157815481890152600182019150602081019050612cc2565b838801955050505b50505092915050565b5f612cfd8286612c42565b9150612d098285612c42565b9150612d158284612c72565b9150819050949350505050565b7f5468697320616464726573732068617320616c726561647920726563656976655f8201527f6420616e204e46542e0000000000000000000000000000000000000000000000602082015250565b5f612d7c602983611f3f565b9150612d8782612d22565b604082019050919050565b5f6020820190508181035f830152612da981612d70565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612de782611fc5565b9150612df283611fc5565b9250828201905080821115612e0a57612e09612db0565b5b92915050565b7f4578636565647320746f74616c20737570706c792e00000000000000000000005f82015250565b5f612e44601583611f3f565b9150612e4f82612e10565b602082019050919050565b5f6020820190508181035f830152612e7181612e38565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612ed2602683611f3f565b9150612edd82612e78565b604082019050919050565b5f6020820190508181035f830152612eff81612ec6565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612f60602c83611f3f565b9150612f6b82612f06565b604082019050919050565b5f6020820190508181035f830152612f8d81612f54565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f612fee602983611f3f565b9150612ff982612f94565b604082019050919050565b5f6020820190508181035f83015261301b81612fe2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61307c602483611f3f565b915061308782613022565b604082019050919050565b5f6020820190508181035f8301526130a981613070565b9050919050565b5f6130ba82611fc5565b91506130c583611fc5565b92508282039050818111156130dd576130dc612db0565b5b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f61313d603283611f3f565b9150613148826130e3565b604082019050919050565b5f6020820190508181035f83015261316a81613131565b9050919050565b5f61317b82611fc5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131ad576131ac612db0565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131ef82611fc5565b91506131fa83611fc5565b92508261320a576132096131b8565b5b828204905092915050565b5f61321f82611fc5565b915061322a83611fc5565b92508261323a576132396131b8565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f61329682613272565b6132a0818561327c565b93506132b0818560208601611f4f565b6132b981611f5d565b840191505092915050565b5f6080820190506132d75f830187612053565b6132e46020830186612053565b6132f160408301856120e3565b8181036060830152613303818461328c565b905095945050505050565b5f8151905061331c81611ead565b92915050565b5f6020828403121561333757613336611e7a565b5b5f6133448482850161330e565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f613381602083611f3f565b915061338c8261334d565b602082019050919050565b5f6020820190508181035f8301526133ae81613375565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f6133e9601c83611f3f565b91506133f4826133b5565b602082019050919050565b5f6020820190508181035f830152613416816133dd565b905091905056fea264697066735822122018636428671cbc75563675357b4feb2e8cb6ed1bf16910e5ffe402e43877776964736f6c634300081a0033697066733a2f2f516d5562414e72444d3544734236324d6a454a6a70724b626e51446a6a65344c4264394b5439746251426a6542642f

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061014b575f3560e01c80638da5cb5b116100c1578063c66828621161007a578063c668286214610387578063c87b56dd146103a5578063d21d8255146103d5578063e985e9c5146103f1578063f2fde38b14610421578063f47c84c51461043d5761014b565b80638da5cb5b146102d957806395d89b41146102f75780639abc832014610315578063a0bcfc7f14610333578063a22cb4651461034f578063b88d4fde1461036b5761014b565b806323b872dd1161011357806323b872dd1461020757806342842e0e146102235780635e8f07fb1461023f5780636352211e1461026f57806370a082311461029f578063715018a6146102cf5761014b565b806301ffc9a71461014f57806306fdde031461017f578063081812fc1461019d578063095ea7b3146101cd57806318160ddd146101e9575b5f80fd5b61016960048036038101906101649190611ed7565b61045b565b6040516101769190611f1c565b60405180910390f35b61018761053c565b6040516101949190611fa5565b60405180910390f35b6101b760048036038101906101b29190611ff8565b6105cb565b6040516101c49190612062565b60405180910390f35b6101e760048036038101906101e291906120a5565b61064c565b005b6101f1610762565b6040516101fe91906120f2565b60405180910390f35b610221600480360381019061021c919061210b565b610768565b005b61023d6004803603810190610238919061210b565b6107c8565b005b6102596004803603810190610254919061215b565b6107e7565b6040516102669190611f1c565b60405180910390f35b61028960048036038101906102849190611ff8565b610804565b6040516102969190612062565b60405180910390f35b6102b960048036038101906102b4919061215b565b6108b0565b6040516102c691906120f2565b60405180910390f35b6102d7610964565b005b6102e1610a9d565b6040516102ee9190612062565b60405180910390f35b6102ff610ac5565b60405161030c9190611fa5565b60405180910390f35b61031d610b55565b60405161032a9190611fa5565b60405180910390f35b61034d600480360381019061034891906122b2565b610be1565b005b61036960048036038101906103649190612323565b610c70565b005b610385600480360381019061038091906123ff565b610deb565b005b61038f610e4d565b60405161039c9190611fa5565b60405180910390f35b6103bf60048036038101906103ba9190611ff8565b610ed9565b6040516103cc9190611fa5565b60405180910390f35b6103ef60048036038101906103ea919061215b565b610f80565b005b61040b6004803603810190610406919061247f565b611164565b6040516104189190611f1c565b60405180910390f35b61043b6004803603810190610436919061215b565b6111f2565b005b61044561139a565b60405161045291906120f2565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061052557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061053557506105348261139f565b5b9050919050565b60605f805461054a906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610576906124ea565b80156105c15780601f10610598576101008083540402835291602001916105c1565b820191905f5260205f20905b8154815290600101906020018083116105a457829003601f168201915b5050505050905090565b5f6105d582611408565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b9061258a565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61065682610804565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd90612618565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106e5611470565b73ffffffffffffffffffffffffffffffffffffffff16148061071457506107138161070e611470565b611164565b5b610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074a906126a6565b60405180910390fd5b61075d8383611477565b505050565b60075481565b610779610773611470565b8261152d565b6107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af90612734565b60405180910390fd5b6107c3838383611609565b505050565b6107e283838360405180602001604052805f815250610deb565b505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e906127c2565b60405180910390fd5b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690612850565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61096c611470565b73ffffffffffffffffffffffffffffffffffffffff1661098a610a9d565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906128b8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ad4906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610b00906124ea565b8015610b4b5780601f10610b2257610100808354040283529160200191610b4b565b820191905f5260205f20905b815481529060010190602001808311610b2e57829003601f168201915b5050505050905090565b60088054610b62906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8e906124ea565b8015610bd95780601f10610bb057610100808354040283529160200191610bd9565b820191905f5260205f20905b815481529060010190602001808311610bbc57829003601f168201915b505050505081565b610be9611470565b73ffffffffffffffffffffffffffffffffffffffff16610c07610a9d565b73ffffffffffffffffffffffffffffffffffffffff1614610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c54906128b8565b60405180910390fd5b8060089081610c6c9190612a73565b5050565b610c78611470565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90612b8c565b60405180910390fd5b8060055f610cf1611470565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d9a611470565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ddf9190611f1c565b60405180910390a35050565b610dfc610df6611470565b8361152d565b610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3290612734565b60405180910390fd5b610e4784848484611859565b50505050565b60098054610e5a906124ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610e86906124ea565b8015610ed15780601f10610ea857610100808354040283529160200191610ed1565b820191905f5260205f20905b815481529060010190602001808311610eb457829003601f168201915b505050505081565b6060610ee482611408565b610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612c1a565b60405180910390fd5b5f610f2c6118b5565b90505f815111610f4a5760405180602001604052805f815250610f78565b80610f5484611945565b6009604051602001610f6893929190612cf2565b6040516020818303038152906040525b915050919050565b610f88611470565b73ffffffffffffffffffffffffffffffffffffffff16610fa6610a9d565b73ffffffffffffffffffffffffffffffffffffffff1614610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff3906128b8565b60405180910390fd5b600a5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612d92565b60405180910390fd5b5f6007549050606460018261109b9190612ddd565b11156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390612e5a565b60405180910390fd5b6110f2826001836110ed9190612ddd565b611a9e565b600160075f8282546111049190612ddd565b925050819055506001600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6111fa611470565b73ffffffffffffffffffffffffffffffffffffffff16611218610a9d565b73ffffffffffffffffffffffffffffffffffffffff161461126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906128b8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390612ee8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114e783610804565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f61153782611408565b611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90612f76565b60405180910390fd5b5f61158083610804565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115ef57508373ffffffffffffffffffffffffffffffffffffffff166115d7846105cb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061160057506115ff8185611164565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661162982610804565b73ffffffffffffffffffffffffffffffffffffffff161461167f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167690613004565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e490613092565b60405180910390fd5b6116f8838383611abb565b6117025f82611477565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461174f91906130b0565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117a39190612ddd565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611864848484611609565b61187084848484611ac0565b6118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690613153565b60405180910390fd5b50505050565b6060600880546118c4906124ea565b80601f01602080910402602001604051908101604052809291908181526020018280546118f0906124ea565b801561193b5780601f106119125761010080835404028352916020019161193b565b820191905f5260205f20905b81548152906001019060200180831161191e57829003601f168201915b5050505050905090565b60605f820361198b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a99565b5f8290505f5b5f82146119ba5780806119a390613171565b915050600a826119b391906131e5565b9150611991565b5f8167ffffffffffffffff8111156119d5576119d461218e565b5b6040519080825280601f01601f191660200182016040528015611a075781602001600182028036833780820191505090505b5090505b5f8514611a9257600182611a1f91906130b0565b9150600a85611a2e9190613215565b6030611a3a9190612ddd565b60f81b818381518110611a5057611a4f613245565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85611a8b91906131e5565b9450611a0b565b8093505050505b919050565b611ab7828260405180602001604052805f815250611c42565b5050565b505050565b5f611ae08473ffffffffffffffffffffffffffffffffffffffff16611c9c565b15611c35578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b09611470565b8786866040518563ffffffff1660e01b8152600401611b2b94939291906132c4565b6020604051808303815f875af1925050508015611b6657506040513d601f19601f82011682018060405250810190611b639190613322565b60015b611be5573d805f8114611b94576040519150601f19603f3d011682016040523d82523d5f602084013e611b99565b606091505b505f815103611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490613153565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c3a565b600190505b949350505050565b611c4c8383611cad565b611c585f848484611ac0565b611c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8e90613153565b60405180910390fd5b505050565b5f80823b90505f8111915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1290613397565b60405180910390fd5b611d2481611408565b15611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b906133ff565b60405180910390fd5b611d6f5f8383611abb565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611dbc9190612ddd565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb681611e82565b8114611ec0575f80fd5b50565b5f81359050611ed181611ead565b92915050565b5f60208284031215611eec57611eeb611e7a565b5b5f611ef984828501611ec3565b91505092915050565b5f8115159050919050565b611f1681611f02565b82525050565b5f602082019050611f2f5f830184611f0d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611f7782611f35565b611f818185611f3f565b9350611f91818560208601611f4f565b611f9a81611f5d565b840191505092915050565b5f6020820190508181035f830152611fbd8184611f6d565b905092915050565b5f819050919050565b611fd781611fc5565b8114611fe1575f80fd5b50565b5f81359050611ff281611fce565b92915050565b5f6020828403121561200d5761200c611e7a565b5b5f61201a84828501611fe4565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61204c82612023565b9050919050565b61205c81612042565b82525050565b5f6020820190506120755f830184612053565b92915050565b61208481612042565b811461208e575f80fd5b50565b5f8135905061209f8161207b565b92915050565b5f80604083850312156120bb576120ba611e7a565b5b5f6120c885828601612091565b92505060206120d985828601611fe4565b9150509250929050565b6120ec81611fc5565b82525050565b5f6020820190506121055f8301846120e3565b92915050565b5f805f6060848603121561212257612121611e7a565b5b5f61212f86828701612091565b935050602061214086828701612091565b925050604061215186828701611fe4565b9150509250925092565b5f602082840312156121705761216f611e7a565b5b5f61217d84828501612091565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6121c482611f5d565b810181811067ffffffffffffffff821117156121e3576121e261218e565b5b80604052505050565b5f6121f5611e71565b905061220182826121bb565b919050565b5f67ffffffffffffffff8211156122205761221f61218e565b5b61222982611f5d565b9050602081019050919050565b828183375f83830152505050565b5f61225661225184612206565b6121ec565b9050828152602081018484840111156122725761227161218a565b5b61227d848285612236565b509392505050565b5f82601f83011261229957612298612186565b5b81356122a9848260208601612244565b91505092915050565b5f602082840312156122c7576122c6611e7a565b5b5f82013567ffffffffffffffff8111156122e4576122e3611e7e565b5b6122f084828501612285565b91505092915050565b61230281611f02565b811461230c575f80fd5b50565b5f8135905061231d816122f9565b92915050565b5f806040838503121561233957612338611e7a565b5b5f61234685828601612091565b92505060206123578582860161230f565b9150509250929050565b5f67ffffffffffffffff82111561237b5761237a61218e565b5b61238482611f5d565b9050602081019050919050565b5f6123a361239e84612361565b6121ec565b9050828152602081018484840111156123bf576123be61218a565b5b6123ca848285612236565b509392505050565b5f82601f8301126123e6576123e5612186565b5b81356123f6848260208601612391565b91505092915050565b5f805f806080858703121561241757612416611e7a565b5b5f61242487828801612091565b945050602061243587828801612091565b935050604061244687828801611fe4565b925050606085013567ffffffffffffffff81111561246757612466611e7e565b5b612473878288016123d2565b91505092959194509250565b5f806040838503121561249557612494611e7a565b5b5f6124a285828601612091565b92505060206124b385828601612091565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061250157607f821691505b602082108103612514576125136124bd565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612574602c83611f3f565b915061257f8261251a565b604082019050919050565b5f6020820190508181035f8301526125a181612568565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f612602602183611f3f565b915061260d826125a8565b604082019050919050565b5f6020820190508181035f83015261262f816125f6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f612690603883611f3f565b915061269b82612636565b604082019050919050565b5f6020820190508181035f8301526126bd81612684565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f61271e603183611f3f565b9150612729826126c4565b604082019050919050565b5f6020820190508181035f83015261274b81612712565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f6127ac602983611f3f565b91506127b782612752565b604082019050919050565b5f6020820190508181035f8301526127d9816127a0565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f61283a602a83611f3f565b9150612845826127e0565b604082019050919050565b5f6020820190508181035f8301526128678161282e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6128a2602083611f3f565b91506128ad8261286e565b602082019050919050565b5f6020820190508181035f8301526128cf81612896565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026129327fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128f7565b61293c86836128f7565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61297761297261296d84611fc5565b612954565b611fc5565b9050919050565b5f819050919050565b6129908361295d565b6129a461299c8261297e565b848454612903565b825550505050565b5f90565b6129b86129ac565b6129c3818484612987565b505050565b5b818110156129e6576129db5f826129b0565b6001810190506129c9565b5050565b601f821115612a2b576129fc816128d6565b612a05846128e8565b81016020851015612a14578190505b612a28612a20856128e8565b8301826129c8565b50505b505050565b5f82821c905092915050565b5f612a4b5f1984600802612a30565b1980831691505092915050565b5f612a638383612a3c565b9150826002028217905092915050565b612a7c82611f35565b67ffffffffffffffff811115612a9557612a9461218e565b5b612a9f82546124ea565b612aaa8282856129ea565b5f60209050601f831160018114612adb575f8415612ac9578287015190505b612ad38582612a58565b865550612b3a565b601f198416612ae9866128d6565b5f5b82811015612b1057848901518255600182019150602085019450602081019050612aeb565b86831015612b2d5784890151612b29601f891682612a3c565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f612b76601983611f3f565b9150612b8182612b42565b602082019050919050565b5f6020820190508181035f830152612ba381612b6a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f612c04602f83611f3f565b9150612c0f82612baa565b604082019050919050565b5f6020820190508181035f830152612c3181612bf8565b9050919050565b5f81905092915050565b5f612c4c82611f35565b612c568185612c38565b9350612c66818560208601611f4f565b80840191505092915050565b5f8154612c7e816124ea565b612c888186612c38565b9450600182165f8114612ca25760018114612cb757612ce9565b60ff1983168652811515820286019350612ce9565b612cc0856128d6565b5f5b83811015612ce157815481890152600182019150602081019050612cc2565b838801955050505b50505092915050565b5f612cfd8286612c42565b9150612d098285612c42565b9150612d158284612c72565b9150819050949350505050565b7f5468697320616464726573732068617320616c726561647920726563656976655f8201527f6420616e204e46542e0000000000000000000000000000000000000000000000602082015250565b5f612d7c602983611f3f565b9150612d8782612d22565b604082019050919050565b5f6020820190508181035f830152612da981612d70565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612de782611fc5565b9150612df283611fc5565b9250828201905080821115612e0a57612e09612db0565b5b92915050565b7f4578636565647320746f74616c20737570706c792e00000000000000000000005f82015250565b5f612e44601583611f3f565b9150612e4f82612e10565b602082019050919050565b5f6020820190508181035f830152612e7181612e38565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612ed2602683611f3f565b9150612edd82612e78565b604082019050919050565b5f6020820190508181035f830152612eff81612ec6565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612f60602c83611f3f565b9150612f6b82612f06565b604082019050919050565b5f6020820190508181035f830152612f8d81612f54565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f612fee602983611f3f565b9150612ff982612f94565b604082019050919050565b5f6020820190508181035f83015261301b81612fe2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61307c602483611f3f565b915061308782613022565b604082019050919050565b5f6020820190508181035f8301526130a981613070565b9050919050565b5f6130ba82611fc5565b91506130c583611fc5565b92508282039050818111156130dd576130dc612db0565b5b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f61313d603283611f3f565b9150613148826130e3565b604082019050919050565b5f6020820190508181035f83015261316a81613131565b9050919050565b5f61317b82611fc5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131ad576131ac612db0565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131ef82611fc5565b91506131fa83611fc5565b92508261320a576132096131b8565b5b828204905092915050565b5f61321f82611fc5565b915061322a83611fc5565b92508261323a576132396131b8565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f61329682613272565b6132a0818561327c565b93506132b0818560208601611f4f565b6132b981611f5d565b840191505092915050565b5f6080820190506132d75f830187612053565b6132e46020830186612053565b6132f160408301856120e3565b8181036060830152613303818461328c565b905095945050505050565b5f8151905061331c81611ead565b92915050565b5f6020828403121561333757613336611e7a565b5b5f6133448482850161330e565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f613381602083611f3f565b915061338c8261334d565b602082019050919050565b5f6020820190508181035f8301526133ae81613375565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f6133e9601c83611f3f565b91506133f4826133b5565b602082019050919050565b5f6020820190508181035f830152613416816133dd565b905091905056fea264697066735822122018636428671cbc75563675357b4feb2e8cb6ed1bf16910e5ffe402e43877776964736f6c634300081a0033

Deployed Bytecode Sourcemap

35806:1465:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21621:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22553:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24020:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23550:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35929:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24910:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25286:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36036:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22247:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21977:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35190:148;;;:::i;:::-;;34539:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22722:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35962:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36225:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24313:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25508:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35990:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36333:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36852:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24679:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35493:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35885:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21621:292;21723:4;21762:25;21747:40;;;:11;:40;;;;:105;;;;21819:33;21804:48;;;:11;:48;;;;21747:105;:158;;;;21869:36;21893:11;21869:23;:36::i;:::-;21747:158;21740:165;;21621:292;;;:::o;22553:100::-;22607:13;22640:5;22633:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22553:100;:::o;24020:221::-;24096:7;24124:16;24132:7;24124;:16::i;:::-;24116:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24209:15;:24;24225:7;24209:24;;;;;;;;;;;;;;;;;;;;;24202:31;;24020:221;;;:::o;23550:404::-;23631:13;23647:23;23662:7;23647:14;:23::i;:::-;23631:39;;23695:5;23689:11;;:2;:11;;;23681:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23775:5;23759:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23784:44;23808:5;23815:12;:10;:12::i;:::-;23784:23;:44::i;:::-;23759:69;23751:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;23925:21;23934:2;23938:7;23925:8;:21::i;:::-;23620:334;23550:404;;:::o;35929:26::-;;;;:::o;24910:305::-;25071:41;25090:12;:10;:12::i;:::-;25104:7;25071:18;:41::i;:::-;25063:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25179:28;25189:4;25195:2;25199:7;25179:9;:28::i;:::-;24910:305;;;:::o;25286:151::-;25390:39;25407:4;25413:2;25417:7;25390:39;;;;;;;;;;;;:16;:39::i;:::-;25286:151;;;:::o;36036:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;22247:239::-;22319:7;22339:13;22355:7;:16;22363:7;22355:16;;;;;;;;;;;;;;;;;;;;;22339:32;;22407:1;22390:19;;:5;:19;;;22382:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22473:5;22466:12;;;22247:239;;;:::o;21977:208::-;22049:7;22094:1;22077:19;;:5;:19;;;22069:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22161:9;:16;22171:5;22161:16;;;;;;;;;;;;;;;;22154:23;;21977:208;;;:::o;35190:148::-;34770:12;:10;:12::i;:::-;34759:23;;:7;:5;:7::i;:::-;:23;;;34751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35297:1:::1;35260:40;;35281:6;;;;;;;;;;;35260:40;;;;;;;;;;;;35328:1;35311:6;;:19;;;;;;;;;;;;;;;;;;35190:148::o:0;34539:87::-;34585:7;34612:6;;;;;;;;;;;34605:13;;34539:87;:::o;22722:104::-;22778:13;22811:7;22804:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22722:104;:::o;35962:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36225:100::-;34770:12;:10;:12::i;:::-;34759:23;;:7;:5;:7::i;:::-;:23;;;34751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36309:8:::1;36299:7;:18;;;;;;:::i;:::-;;36225:100:::0;:::o;24313:295::-;24428:12;:10;:12::i;:::-;24416:24;;:8;:24;;;24408:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24528:8;24483:18;:32;24502:12;:10;:12::i;:::-;24483:32;;;;;;;;;;;;;;;:42;24516:8;24483:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24581:8;24552:48;;24567:12;:10;:12::i;:::-;24552:48;;;24591:8;24552:48;;;;;;:::i;:::-;;;;;;;;24313:295;;:::o;25508:285::-;25640:41;25659:12;:10;:12::i;:::-;25673:7;25640:18;:41::i;:::-;25632:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25746:39;25760:4;25766:2;25770:7;25779:5;25746:13;:39::i;:::-;25508:285;;;;:::o;35990:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36333:394::-;36406:13;36440:16;36448:7;36440;:16::i;:::-;36432:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36519:28;36550:10;:8;:10::i;:::-;36519:41;;36609:1;36584:14;36578:28;:32;:141;;;;;;;;;;;;;;;;;36650:14;36666:18;:7;:16;:18::i;:::-;36686:13;36633:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36578:141;36571:148;;;36333:394;;;:::o;36852:416::-;34770:12;:10;:12::i;:::-;34759:23;;:7;:5;:7::i;:::-;:23;;;34751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36930:14:::1;:25;36945:9;36930:25;;;;;;;;;;;;;;;;;;;;;;;;;36929:26;36921:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;37022:22;37047:11;;37022:36;;35919:3;37094:1;37077:14;:18;;;;:::i;:::-;:32;;37069:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37148:40;37158:9;37186:1;37169:14;:18;;;;:::i;:::-;37148:9;:40::i;:::-;37214:1;37199:11;;:16;;;;;;;:::i;:::-;;;;;;;;37256:4;37228:14;:25;37243:9;37228:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;36910:358;36852:416:::0;:::o;24679:164::-;24776:4;24800:18;:25;24819:5;24800:25;;;;;;;;;;;;;;;:35;24826:8;24800:35;;;;;;;;;;;;;;;;;;;;;;;;;24793:42;;24679:164;;;;:::o;35493:244::-;34770:12;:10;:12::i;:::-;34759:23;;:7;:5;:7::i;:::-;:23;;;34751:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35602:1:::1;35582:22;;:8;:22;;::::0;35574:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35692:8;35663:38;;35684:6;;;;;;;;;;;35663:38;;;;;;;;;;;;35721:8;35712:6;;:17;;;;;;;;;;;;;;;;;;35493:244:::0;:::o;35885:37::-;35919:3;35885:37;:::o;20111:157::-;20196:4;20235:25;20220:40;;;:11;:40;;;;20213:47;;20111:157;;;:::o;27260:127::-;27325:4;27377:1;27349:30;;:7;:16;27357:7;27349:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27342:37;;27260:127;;;:::o;16889:98::-;16942:7;16969:10;16962:17;;16889:98;:::o;31144:174::-;31246:2;31219:15;:24;31235:7;31219:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31302:7;31298:2;31264:46;;31273:23;31288:7;31273:14;:23::i;:::-;31264:46;;;;;;;;;;;;31144:174;;:::o;27554:355::-;27647:4;27672:16;27680:7;27672;:16::i;:::-;27664:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27748:13;27764:23;27779:7;27764:14;:23::i;:::-;27748:39;;27817:5;27806:16;;:7;:16;;;:51;;;;27850:7;27826:31;;:20;27838:7;27826:11;:20::i;:::-;:31;;;27806:51;:94;;;;27861:39;27885:5;27892:7;27861:23;:39::i;:::-;27806:94;27798:103;;;27554:355;;;;:::o;30482:544::-;30607:4;30580:31;;:23;30595:7;30580:14;:23::i;:::-;:31;;;30572:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30690:1;30676:16;;:2;:16;;;30668:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30746:39;30767:4;30773:2;30777:7;30746:20;:39::i;:::-;30850:29;30867:1;30871:7;30850:8;:29::i;:::-;30911:1;30892:9;:15;30902:4;30892:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30940:1;30923:9;:13;30933:2;30923:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30971:2;30952:7;:16;30960:7;30952:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31010:7;31006:2;30991:27;;31000:4;30991:27;;;;;;;;;;;;30482:544;;;:::o;26675:272::-;26789:28;26799:4;26805:2;26809:7;26789:9;:28::i;:::-;26836:48;26859:4;26865:2;26869:7;26878:5;26836:22;:48::i;:::-;26828:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26675:272;;;;:::o;36736:108::-;36796:13;36829:7;36822:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36736:108;:::o;17550:723::-;17606:13;17836:1;17827:5;:10;17823:53;;17854:10;;;;;;;;;;;;;;;;;;;;;17823:53;17886:12;17901:5;17886:20;;17917:14;17942:78;17957:1;17949:4;:9;17942:78;;17975:8;;;;;:::i;:::-;;;;18006:2;17998:10;;;;;:::i;:::-;;;17942:78;;;18030:19;18062:6;18052:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18030:39;;18080:154;18096:1;18087:5;:10;18080:154;;18124:1;18114:11;;;;;:::i;:::-;;;18191:2;18183:5;:10;;;;:::i;:::-;18170:2;:24;;;;:::i;:::-;18157:39;;18140:6;18147;18140:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18220:2;18211:11;;;;;:::i;:::-;;;18080:154;;;18258:6;18244:21;;;;;17550:723;;;;:::o;28251:110::-;28327:26;28337:2;28341:7;28327:26;;;;;;;;;;;;:9;:26::i;:::-;28251:110;;:::o;33339:93::-;;;;:::o;31883:843::-;32004:4;32030:15;:2;:13;;;:15::i;:::-;32026:693;;;32082:2;32066:36;;;32103:12;:10;:12::i;:::-;32117:4;32123:7;32132:5;32066:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32062:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32329:1;32312:6;:13;:18;32308:341;;32355:60;;;;;;;;;;:::i;:::-;;;;;;;;32308:341;32599:6;32593:13;32584:6;32580:2;32576:15;32569:38;32062:602;32199:45;;;32189:55;;;:6;:55;;;;32182:62;;;;;32026:693;32703:4;32696:11;;31883:843;;;;;;;:::o;28588:250::-;28684:18;28690:2;28694:7;28684:5;:18::i;:::-;28721:54;28752:1;28756:2;28760:7;28769:5;28721:22;:54::i;:::-;28713:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;28588:250;;;:::o;9000:422::-;9060:4;9268:12;9379:7;9367:20;9359:28;;9413:1;9406:4;:8;9399:15;;;9000:422;;;:::o;29174:382::-;29268:1;29254:16;;:2;:16;;;29246:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29327:16;29335:7;29327;:16::i;:::-;29326:17;29318:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29389:45;29418:1;29422:2;29426:7;29389:20;:45::i;:::-;29464:1;29447:9;:13;29457:2;29447:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29495:2;29476:7;:16;29484:7;29476:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29540:7;29536:2;29515:33;;29532:1;29515:33;;;;;;;;;;;;29174:382;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:619::-;5212:6;5220;5228;5277:2;5265:9;5256:7;5252:23;5248:32;5245:119;;;5283:79;;:::i;:::-;5245:119;5403:1;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5374:117;5530:2;5556:53;5601:7;5592:6;5581:9;5577:22;5556:53;:::i;:::-;5546:63;;5501:118;5658:2;5684:53;5729:7;5720:6;5709:9;5705:22;5684:53;:::i;:::-;5674:63;;5629:118;5135:619;;;;;:::o;5760:329::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:53;6064:7;6055:6;6044:9;6040:22;6019:53;:::i;:::-;6009:63;;5965:117;5760:329;;;;:::o;6095:117::-;6204:1;6201;6194:12;6218:117;6327:1;6324;6317:12;6341:180;6389:77;6386:1;6379:88;6486:4;6483:1;6476:15;6510:4;6507:1;6500:15;6527:281;6610:27;6632:4;6610:27;:::i;:::-;6602:6;6598:40;6740:6;6728:10;6725:22;6704:18;6692:10;6689:34;6686:62;6683:88;;;6751:18;;:::i;:::-;6683:88;6791:10;6787:2;6780:22;6570:238;6527:281;;:::o;6814:129::-;6848:6;6875:20;;:::i;:::-;6865:30;;6904:33;6932:4;6924:6;6904:33;:::i;:::-;6814:129;;;:::o;6949:308::-;7011:4;7101:18;7093:6;7090:30;7087:56;;;7123:18;;:::i;:::-;7087:56;7161:29;7183:6;7161:29;:::i;:::-;7153:37;;7245:4;7239;7235:15;7227:23;;6949:308;;;:::o;7263:148::-;7361:6;7356:3;7351;7338:30;7402:1;7393:6;7388:3;7384:16;7377:27;7263:148;;;:::o;7417:425::-;7495:5;7520:66;7536:49;7578:6;7536:49;:::i;:::-;7520:66;:::i;:::-;7511:75;;7609:6;7602:5;7595:21;7647:4;7640:5;7636:16;7685:3;7676:6;7671:3;7667:16;7664:25;7661:112;;;7692:79;;:::i;:::-;7661:112;7782:54;7829:6;7824:3;7819;7782:54;:::i;:::-;7501:341;7417:425;;;;;:::o;7862:340::-;7918:5;7967:3;7960:4;7952:6;7948:17;7944:27;7934:122;;7975:79;;:::i;:::-;7934:122;8092:6;8079:20;8117:79;8192:3;8184:6;8177:4;8169:6;8165:17;8117:79;:::i;:::-;8108:88;;7924:278;7862:340;;;;:::o;8208:509::-;8277:6;8326:2;8314:9;8305:7;8301:23;8297:32;8294:119;;;8332:79;;:::i;:::-;8294:119;8480:1;8469:9;8465:17;8452:31;8510:18;8502:6;8499:30;8496:117;;;8532:79;;:::i;:::-;8496:117;8637:63;8692:7;8683:6;8672:9;8668:22;8637:63;:::i;:::-;8627:73;;8423:287;8208:509;;;;:::o;8723:116::-;8793:21;8808:5;8793:21;:::i;:::-;8786:5;8783:32;8773:60;;8829:1;8826;8819:12;8773:60;8723:116;:::o;8845:133::-;8888:5;8926:6;8913:20;8904:29;;8942:30;8966:5;8942:30;:::i;:::-;8845:133;;;;:::o;8984:468::-;9049:6;9057;9106:2;9094:9;9085:7;9081:23;9077:32;9074:119;;;9112:79;;:::i;:::-;9074:119;9232:1;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9203:117;9359:2;9385:50;9427:7;9418:6;9407:9;9403:22;9385:50;:::i;:::-;9375:60;;9330:115;8984:468;;;;;:::o;9458:307::-;9519:4;9609:18;9601:6;9598:30;9595:56;;;9631:18;;:::i;:::-;9595:56;9669:29;9691:6;9669:29;:::i;:::-;9661:37;;9753:4;9747;9743:15;9735:23;;9458:307;;;:::o;9771:423::-;9848:5;9873:65;9889:48;9930:6;9889:48;:::i;:::-;9873:65;:::i;:::-;9864:74;;9961:6;9954:5;9947:21;9999:4;9992:5;9988:16;10037:3;10028:6;10023:3;10019:16;10016:25;10013:112;;;10044:79;;:::i;:::-;10013:112;10134:54;10181:6;10176:3;10171;10134:54;:::i;:::-;9854:340;9771:423;;;;;:::o;10213:338::-;10268:5;10317:3;10310:4;10302:6;10298:17;10294:27;10284:122;;10325:79;;:::i;:::-;10284:122;10442:6;10429:20;10467:78;10541:3;10533:6;10526:4;10518:6;10514:17;10467:78;:::i;:::-;10458:87;;10274:277;10213:338;;;;:::o;10557:943::-;10652:6;10660;10668;10676;10725:3;10713:9;10704:7;10700:23;10696:33;10693:120;;;10732:79;;:::i;:::-;10693:120;10852:1;10877:53;10922:7;10913:6;10902:9;10898:22;10877:53;:::i;:::-;10867:63;;10823:117;10979:2;11005:53;11050:7;11041:6;11030:9;11026:22;11005:53;:::i;:::-;10995:63;;10950:118;11107:2;11133:53;11178:7;11169:6;11158:9;11154:22;11133:53;:::i;:::-;11123:63;;11078:118;11263:2;11252:9;11248:18;11235:32;11294:18;11286:6;11283:30;11280:117;;;11316:79;;:::i;:::-;11280:117;11421:62;11475:7;11466:6;11455:9;11451:22;11421:62;:::i;:::-;11411:72;;11206:287;10557:943;;;;;;;:::o;11506:474::-;11574:6;11582;11631:2;11619:9;11610:7;11606:23;11602:32;11599:119;;;11637:79;;:::i;:::-;11599:119;11757:1;11782:53;11827:7;11818:6;11807:9;11803:22;11782:53;:::i;:::-;11772:63;;11728:117;11884:2;11910:53;11955:7;11946:6;11935:9;11931:22;11910:53;:::i;:::-;11900:63;;11855:118;11506:474;;;;;:::o;11986:180::-;12034:77;12031:1;12024:88;12131:4;12128:1;12121:15;12155:4;12152:1;12145:15;12172:320;12216:6;12253:1;12247:4;12243:12;12233:22;;12300:1;12294:4;12290:12;12321:18;12311:81;;12377:4;12369:6;12365:17;12355:27;;12311:81;12439:2;12431:6;12428:14;12408:18;12405:38;12402:84;;12458:18;;:::i;:::-;12402:84;12223:269;12172:320;;;:::o;12498:231::-;12638:34;12634:1;12626:6;12622:14;12615:58;12707:14;12702:2;12694:6;12690:15;12683:39;12498:231;:::o;12735:366::-;12877:3;12898:67;12962:2;12957:3;12898:67;:::i;:::-;12891:74;;12974:93;13063:3;12974:93;:::i;:::-;13092:2;13087:3;13083:12;13076:19;;12735:366;;;:::o;13107:419::-;13273:4;13311:2;13300:9;13296:18;13288:26;;13360:9;13354:4;13350:20;13346:1;13335:9;13331:17;13324:47;13388:131;13514:4;13388:131;:::i;:::-;13380:139;;13107:419;;;:::o;13532:220::-;13672:34;13668:1;13660:6;13656:14;13649:58;13741:3;13736:2;13728:6;13724:15;13717:28;13532:220;:::o;13758:366::-;13900:3;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;13997:93;14086:3;13997:93;:::i;:::-;14115:2;14110:3;14106:12;14099:19;;13758:366;;;:::o;14130:419::-;14296:4;14334:2;14323:9;14319:18;14311:26;;14383:9;14377:4;14373:20;14369:1;14358:9;14354:17;14347:47;14411:131;14537:4;14411:131;:::i;:::-;14403:139;;14130:419;;;:::o;14555:243::-;14695:34;14691:1;14683:6;14679:14;14672:58;14764:26;14759:2;14751:6;14747:15;14740:51;14555:243;:::o;14804:366::-;14946:3;14967:67;15031:2;15026:3;14967:67;:::i;:::-;14960:74;;15043:93;15132:3;15043:93;:::i;:::-;15161:2;15156:3;15152:12;15145:19;;14804:366;;;:::o;15176:419::-;15342:4;15380:2;15369:9;15365:18;15357:26;;15429:9;15423:4;15419:20;15415:1;15404:9;15400:17;15393:47;15457:131;15583:4;15457:131;:::i;:::-;15449:139;;15176:419;;;:::o;15601:236::-;15741:34;15737:1;15729:6;15725:14;15718:58;15810:19;15805:2;15797:6;15793:15;15786:44;15601:236;:::o;15843:366::-;15985:3;16006:67;16070:2;16065:3;16006:67;:::i;:::-;15999:74;;16082:93;16171:3;16082:93;:::i;:::-;16200:2;16195:3;16191:12;16184:19;;15843:366;;;:::o;16215:419::-;16381:4;16419:2;16408:9;16404:18;16396:26;;16468:9;16462:4;16458:20;16454:1;16443:9;16439:17;16432:47;16496:131;16622:4;16496:131;:::i;:::-;16488:139;;16215:419;;;:::o;16640:228::-;16780:34;16776:1;16768:6;16764:14;16757:58;16849:11;16844:2;16836:6;16832:15;16825:36;16640:228;:::o;16874:366::-;17016:3;17037:67;17101:2;17096:3;17037:67;:::i;:::-;17030:74;;17113:93;17202:3;17113:93;:::i;:::-;17231:2;17226:3;17222:12;17215:19;;16874:366;;;:::o;17246:419::-;17412:4;17450:2;17439:9;17435:18;17427:26;;17499:9;17493:4;17489:20;17485:1;17474:9;17470:17;17463:47;17527:131;17653:4;17527:131;:::i;:::-;17519:139;;17246:419;;;:::o;17671:229::-;17811:34;17807:1;17799:6;17795:14;17788:58;17880:12;17875:2;17867:6;17863:15;17856:37;17671:229;:::o;17906:366::-;18048:3;18069:67;18133:2;18128:3;18069:67;:::i;:::-;18062:74;;18145:93;18234:3;18145:93;:::i;:::-;18263:2;18258:3;18254:12;18247:19;;17906:366;;;:::o;18278:419::-;18444:4;18482:2;18471:9;18467:18;18459:26;;18531:9;18525:4;18521:20;18517:1;18506:9;18502:17;18495:47;18559:131;18685:4;18559:131;:::i;:::-;18551:139;;18278:419;;;:::o;18703:182::-;18843:34;18839:1;18831:6;18827:14;18820:58;18703:182;:::o;18891:366::-;19033:3;19054:67;19118:2;19113:3;19054:67;:::i;:::-;19047:74;;19130:93;19219:3;19130:93;:::i;:::-;19248:2;19243:3;19239:12;19232:19;;18891:366;;;:::o;19263:419::-;19429:4;19467:2;19456:9;19452:18;19444:26;;19516:9;19510:4;19506:20;19502:1;19491:9;19487:17;19480:47;19544:131;19670:4;19544:131;:::i;:::-;19536:139;;19263:419;;;:::o;19688:141::-;19737:4;19760:3;19752:11;;19783:3;19780:1;19773:14;19817:4;19814:1;19804:18;19796:26;;19688:141;;;:::o;19835:93::-;19872:6;19919:2;19914;19907:5;19903:14;19899:23;19889:33;;19835:93;;;:::o;19934:107::-;19978:8;20028:5;20022:4;20018:16;19997:37;;19934:107;;;;:::o;20047:393::-;20116:6;20166:1;20154:10;20150:18;20189:97;20219:66;20208:9;20189:97;:::i;:::-;20307:39;20337:8;20326:9;20307:39;:::i;:::-;20295:51;;20379:4;20375:9;20368:5;20364:21;20355:30;;20428:4;20418:8;20414:19;20407:5;20404:30;20394:40;;20123:317;;20047:393;;;;;:::o;20446:60::-;20474:3;20495:5;20488:12;;20446:60;;;:::o;20512:142::-;20562:9;20595:53;20613:34;20622:24;20640:5;20622:24;:::i;:::-;20613:34;:::i;:::-;20595:53;:::i;:::-;20582:66;;20512:142;;;:::o;20660:75::-;20703:3;20724:5;20717:12;;20660:75;;;:::o;20741:269::-;20851:39;20882:7;20851:39;:::i;:::-;20912:91;20961:41;20985:16;20961:41;:::i;:::-;20953:6;20946:4;20940:11;20912:91;:::i;:::-;20906:4;20899:105;20817:193;20741:269;;;:::o;21016:73::-;21061:3;21016:73;:::o;21095:189::-;21172:32;;:::i;:::-;21213:65;21271:6;21263;21257:4;21213:65;:::i;:::-;21148:136;21095:189;;:::o;21290:186::-;21350:120;21367:3;21360:5;21357:14;21350:120;;;21421:39;21458:1;21451:5;21421:39;:::i;:::-;21394:1;21387:5;21383:13;21374:22;;21350:120;;;21290:186;;:::o;21482:543::-;21583:2;21578:3;21575:11;21572:446;;;21617:38;21649:5;21617:38;:::i;:::-;21701:29;21719:10;21701:29;:::i;:::-;21691:8;21687:44;21884:2;21872:10;21869:18;21866:49;;;21905:8;21890:23;;21866:49;21928:80;21984:22;22002:3;21984:22;:::i;:::-;21974:8;21970:37;21957:11;21928:80;:::i;:::-;21587:431;;21572:446;21482:543;;;:::o;22031:117::-;22085:8;22135:5;22129:4;22125:16;22104:37;;22031:117;;;;:::o;22154:169::-;22198:6;22231:51;22279:1;22275:6;22267:5;22264:1;22260:13;22231:51;:::i;:::-;22227:56;22312:4;22306;22302:15;22292:25;;22205:118;22154:169;;;;:::o;22328:295::-;22404:4;22550:29;22575:3;22569:4;22550:29;:::i;:::-;22542:37;;22612:3;22609:1;22605:11;22599:4;22596:21;22588:29;;22328:295;;;;:::o;22628:1395::-;22745:37;22778:3;22745:37;:::i;:::-;22847:18;22839:6;22836:30;22833:56;;;22869:18;;:::i;:::-;22833:56;22913:38;22945:4;22939:11;22913:38;:::i;:::-;22998:67;23058:6;23050;23044:4;22998:67;:::i;:::-;23092:1;23116:4;23103:17;;23148:2;23140:6;23137:14;23165:1;23160:618;;;;23822:1;23839:6;23836:77;;;23888:9;23883:3;23879:19;23873:26;23864:35;;23836:77;23939:67;23999:6;23992:5;23939:67;:::i;:::-;23933:4;23926:81;23795:222;23130:887;;23160:618;23212:4;23208:9;23200:6;23196:22;23246:37;23278:4;23246:37;:::i;:::-;23305:1;23319:208;23333:7;23330:1;23327:14;23319:208;;;23412:9;23407:3;23403:19;23397:26;23389:6;23382:42;23463:1;23455:6;23451:14;23441:24;;23510:2;23499:9;23495:18;23482:31;;23356:4;23353:1;23349:12;23344:17;;23319:208;;;23555:6;23546:7;23543:19;23540:179;;;23613:9;23608:3;23604:19;23598:26;23656:48;23698:4;23690:6;23686:17;23675:9;23656:48;:::i;:::-;23648:6;23641:64;23563:156;23540:179;23765:1;23761;23753:6;23749:14;23745:22;23739:4;23732:36;23167:611;;;23130:887;;22720:1303;;;22628:1395;;:::o;24029:175::-;24169:27;24165:1;24157:6;24153:14;24146:51;24029:175;:::o;24210:366::-;24352:3;24373:67;24437:2;24432:3;24373:67;:::i;:::-;24366:74;;24449:93;24538:3;24449:93;:::i;:::-;24567:2;24562:3;24558:12;24551:19;;24210:366;;;:::o;24582:419::-;24748:4;24786:2;24775:9;24771:18;24763:26;;24835:9;24829:4;24825:20;24821:1;24810:9;24806:17;24799:47;24863:131;24989:4;24863:131;:::i;:::-;24855:139;;24582:419;;;:::o;25007:234::-;25147:34;25143:1;25135:6;25131:14;25124:58;25216:17;25211:2;25203:6;25199:15;25192:42;25007:234;:::o;25247:366::-;25389:3;25410:67;25474:2;25469:3;25410:67;:::i;:::-;25403:74;;25486:93;25575:3;25486:93;:::i;:::-;25604:2;25599:3;25595:12;25588:19;;25247:366;;;:::o;25619:419::-;25785:4;25823:2;25812:9;25808:18;25800:26;;25872:9;25866:4;25862:20;25858:1;25847:9;25843:17;25836:47;25900:131;26026:4;25900:131;:::i;:::-;25892:139;;25619:419;;;:::o;26044:148::-;26146:11;26183:3;26168:18;;26044:148;;;;:::o;26198:390::-;26304:3;26332:39;26365:5;26332:39;:::i;:::-;26387:89;26469:6;26464:3;26387:89;:::i;:::-;26380:96;;26485:65;26543:6;26538:3;26531:4;26524:5;26520:16;26485:65;:::i;:::-;26575:6;26570:3;26566:16;26559:23;;26308:280;26198:390;;;;:::o;26618:874::-;26721:3;26758:5;26752:12;26787:36;26813:9;26787:36;:::i;:::-;26839:89;26921:6;26916:3;26839:89;:::i;:::-;26832:96;;26959:1;26948:9;26944:17;26975:1;26970:166;;;;27150:1;27145:341;;;;26937:549;;26970:166;27054:4;27050:9;27039;27035:25;27030:3;27023:38;27116:6;27109:14;27102:22;27094:6;27090:35;27085:3;27081:45;27074:52;;26970:166;;27145:341;27212:38;27244:5;27212:38;:::i;:::-;27272:1;27286:154;27300:6;27297:1;27294:13;27286:154;;;27374:7;27368:14;27364:1;27359:3;27355:11;27348:35;27424:1;27415:7;27411:15;27400:26;;27322:4;27319:1;27315:12;27310:17;;27286:154;;;27469:6;27464:3;27460:16;27453:23;;27152:334;;26937:549;;26725:767;;26618:874;;;;:::o;27498:589::-;27723:3;27745:95;27836:3;27827:6;27745:95;:::i;:::-;27738:102;;27857:95;27948:3;27939:6;27857:95;:::i;:::-;27850:102;;27969:92;28057:3;28048:6;27969:92;:::i;:::-;27962:99;;28078:3;28071:10;;27498:589;;;;;;:::o;28093:228::-;28233:34;28229:1;28221:6;28217:14;28210:58;28302:11;28297:2;28289:6;28285:15;28278:36;28093:228;:::o;28327:366::-;28469:3;28490:67;28554:2;28549:3;28490:67;:::i;:::-;28483:74;;28566:93;28655:3;28566:93;:::i;:::-;28684:2;28679:3;28675:12;28668:19;;28327:366;;;:::o;28699:419::-;28865:4;28903:2;28892:9;28888:18;28880:26;;28952:9;28946:4;28942:20;28938:1;28927:9;28923:17;28916:47;28980:131;29106:4;28980:131;:::i;:::-;28972:139;;28699:419;;;:::o;29124:180::-;29172:77;29169:1;29162:88;29269:4;29266:1;29259:15;29293:4;29290:1;29283:15;29310:191;29350:3;29369:20;29387:1;29369:20;:::i;:::-;29364:25;;29403:20;29421:1;29403:20;:::i;:::-;29398:25;;29446:1;29443;29439:9;29432:16;;29467:3;29464:1;29461:10;29458:36;;;29474:18;;:::i;:::-;29458:36;29310:191;;;;:::o;29507:171::-;29647:23;29643:1;29635:6;29631:14;29624:47;29507:171;:::o;29684:366::-;29826:3;29847:67;29911:2;29906:3;29847:67;:::i;:::-;29840:74;;29923:93;30012:3;29923:93;:::i;:::-;30041:2;30036:3;30032:12;30025:19;;29684:366;;;:::o;30056:419::-;30222:4;30260:2;30249:9;30245:18;30237:26;;30309:9;30303:4;30299:20;30295:1;30284:9;30280:17;30273:47;30337:131;30463:4;30337:131;:::i;:::-;30329:139;;30056:419;;;:::o;30481:225::-;30621:34;30617:1;30609:6;30605:14;30598:58;30690:8;30685:2;30677:6;30673:15;30666:33;30481:225;:::o;30712:366::-;30854:3;30875:67;30939:2;30934:3;30875:67;:::i;:::-;30868:74;;30951:93;31040:3;30951:93;:::i;:::-;31069:2;31064:3;31060:12;31053:19;;30712:366;;;:::o;31084:419::-;31250:4;31288:2;31277:9;31273:18;31265:26;;31337:9;31331:4;31327:20;31323:1;31312:9;31308:17;31301:47;31365:131;31491:4;31365:131;:::i;:::-;31357:139;;31084:419;;;:::o;31509:231::-;31649:34;31645:1;31637:6;31633:14;31626:58;31718:14;31713:2;31705:6;31701:15;31694:39;31509:231;:::o;31746:366::-;31888:3;31909:67;31973:2;31968:3;31909:67;:::i;:::-;31902:74;;31985:93;32074:3;31985:93;:::i;:::-;32103:2;32098:3;32094:12;32087:19;;31746:366;;;:::o;32118:419::-;32284:4;32322:2;32311:9;32307:18;32299:26;;32371:9;32365:4;32361:20;32357:1;32346:9;32342:17;32335:47;32399:131;32525:4;32399:131;:::i;:::-;32391:139;;32118:419;;;:::o;32543:228::-;32683:34;32679:1;32671:6;32667:14;32660:58;32752:11;32747:2;32739:6;32735:15;32728:36;32543:228;:::o;32777:366::-;32919:3;32940:67;33004:2;32999:3;32940:67;:::i;:::-;32933:74;;33016:93;33105:3;33016:93;:::i;:::-;33134:2;33129:3;33125:12;33118:19;;32777:366;;;:::o;33149:419::-;33315:4;33353:2;33342:9;33338:18;33330:26;;33402:9;33396:4;33392:20;33388:1;33377:9;33373:17;33366:47;33430:131;33556:4;33430:131;:::i;:::-;33422:139;;33149:419;;;:::o;33574:223::-;33714:34;33710:1;33702:6;33698:14;33691:58;33783:6;33778:2;33770:6;33766:15;33759:31;33574:223;:::o;33803:366::-;33945:3;33966:67;34030:2;34025:3;33966:67;:::i;:::-;33959:74;;34042:93;34131:3;34042:93;:::i;:::-;34160:2;34155:3;34151:12;34144:19;;33803:366;;;:::o;34175:419::-;34341:4;34379:2;34368:9;34364:18;34356:26;;34428:9;34422:4;34418:20;34414:1;34403:9;34399:17;34392:47;34456:131;34582:4;34456:131;:::i;:::-;34448:139;;34175:419;;;:::o;34600:194::-;34640:4;34660:20;34678:1;34660:20;:::i;:::-;34655:25;;34694:20;34712:1;34694:20;:::i;:::-;34689:25;;34738:1;34735;34731:9;34723:17;;34762:1;34756:4;34753:11;34750:37;;;34767:18;;:::i;:::-;34750:37;34600:194;;;;:::o;34800:237::-;34940:34;34936:1;34928:6;34924:14;34917:58;35009:20;35004:2;34996:6;34992:15;34985:45;34800:237;:::o;35043:366::-;35185:3;35206:67;35270:2;35265:3;35206:67;:::i;:::-;35199:74;;35282:93;35371:3;35282:93;:::i;:::-;35400:2;35395:3;35391:12;35384:19;;35043:366;;;:::o;35415:419::-;35581:4;35619:2;35608:9;35604:18;35596:26;;35668:9;35662:4;35658:20;35654:1;35643:9;35639:17;35632:47;35696:131;35822:4;35696:131;:::i;:::-;35688:139;;35415:419;;;:::o;35840:233::-;35879:3;35902:24;35920:5;35902:24;:::i;:::-;35893:33;;35948:66;35941:5;35938:77;35935:103;;36018:18;;:::i;:::-;35935:103;36065:1;36058:5;36054:13;36047:20;;35840:233;;;:::o;36079:180::-;36127:77;36124:1;36117:88;36224:4;36221:1;36214:15;36248:4;36245:1;36238:15;36265:185;36305:1;36322:20;36340:1;36322:20;:::i;:::-;36317:25;;36356:20;36374:1;36356:20;:::i;:::-;36351:25;;36395:1;36385:35;;36400:18;;:::i;:::-;36385:35;36442:1;36439;36435:9;36430:14;;36265:185;;;;:::o;36456:176::-;36488:1;36505:20;36523:1;36505:20;:::i;:::-;36500:25;;36539:20;36557:1;36539:20;:::i;:::-;36534:25;;36578:1;36568:35;;36583:18;;:::i;:::-;36568:35;36624:1;36621;36617:9;36612:14;;36456:176;;;;:::o;36638:180::-;36686:77;36683:1;36676:88;36783:4;36780:1;36773:15;36807:4;36804:1;36797:15;36824:98;36875:6;36909:5;36903:12;36893:22;;36824:98;;;:::o;36928:168::-;37011:11;37045:6;37040:3;37033:19;37085:4;37080:3;37076:14;37061:29;;36928:168;;;;:::o;37102:373::-;37188:3;37216:38;37248:5;37216:38;:::i;:::-;37270:70;37333:6;37328:3;37270:70;:::i;:::-;37263:77;;37349:65;37407:6;37402:3;37395:4;37388:5;37384:16;37349:65;:::i;:::-;37439:29;37461:6;37439:29;:::i;:::-;37434:3;37430:39;37423:46;;37192:283;37102:373;;;;:::o;37481:640::-;37676:4;37714:3;37703:9;37699:19;37691:27;;37728:71;37796:1;37785:9;37781:17;37772:6;37728:71;:::i;:::-;37809:72;37877:2;37866:9;37862:18;37853:6;37809:72;:::i;:::-;37891;37959:2;37948:9;37944:18;37935:6;37891:72;:::i;:::-;38010:9;38004:4;38000:20;37995:2;37984:9;37980:18;37973:48;38038:76;38109:4;38100:6;38038:76;:::i;:::-;38030:84;;37481:640;;;;;;;:::o;38127:141::-;38183:5;38214:6;38208:13;38199:22;;38230:32;38256:5;38230:32;:::i;:::-;38127:141;;;;:::o;38274:349::-;38343:6;38392:2;38380:9;38371:7;38367:23;38363:32;38360:119;;;38398:79;;:::i;:::-;38360:119;38518:1;38543:63;38598:7;38589:6;38578:9;38574:22;38543:63;:::i;:::-;38533:73;;38489:127;38274:349;;;;:::o;38629:182::-;38769:34;38765:1;38757:6;38753:14;38746:58;38629:182;:::o;38817:366::-;38959:3;38980:67;39044:2;39039:3;38980:67;:::i;:::-;38973:74;;39056:93;39145:3;39056:93;:::i;:::-;39174:2;39169:3;39165:12;39158:19;;38817:366;;;:::o;39189:419::-;39355:4;39393:2;39382:9;39378:18;39370:26;;39442:9;39436:4;39432:20;39428:1;39417:9;39413:17;39406:47;39470:131;39596:4;39470:131;:::i;:::-;39462:139;;39189:419;;;:::o;39614:178::-;39754:30;39750:1;39742:6;39738:14;39731:54;39614:178;:::o;39798:366::-;39940:3;39961:67;40025:2;40020:3;39961:67;:::i;:::-;39954:74;;40037:93;40126:3;40037:93;:::i;:::-;40155:2;40150:3;40146:12;40139:19;;39798:366;;;:::o;40170:419::-;40336:4;40374:2;40363:9;40359:18;40351:26;;40423:9;40417:4;40413:20;40409:1;40398:9;40394:17;40387:47;40451:131;40577:4;40451:131;:::i;:::-;40443:139;;40170:419;;;:::o

Swarm Source

ipfs://18636428671cbc75563675357b4feb2e8cb6ed1bf16910e5ffe402e438777769
[ 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.