Token Fittipaldi

Overview ERC-721

Total Supply:
212 FITTI

Holders:
9 addresses

Profile Summary

 
Contract:
0xc96661d9813b4438cab0d23232bcb3266be3c56f0xC96661D9813B4438cAB0D23232bcB3266be3C56F

Balance
0 FITTI
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x15dbb490001bec3b437da99e45f6e89991cf26bb

Contract Name:
FittiNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-09
*/

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


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

// OpenZeppelin Contracts (last updated v4.5.0) (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);

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


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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


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

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

pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/FittiNft.sol

pragma solidity ^0.8.0;




contract FittiNft is
    ERC721Enumerable,
    ERC721URIStorage,
    ERC721Burnable,
    Ownable
{
    uint256 public counter;

    string private baseURI;

    constructor(
        string memory name,
        string memory symbol,
        string memory uri
    ) ERC721(name, symbol) {
        baseURI = uri;
    }

    function setBaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

    function mint(address receiver, string memory uri) public onlyOwner {
        require(bytes(uri).length > 0, "FittiNft: uri is invalid");

        uint256 id = ++counter;

        _mint(receiver, id);

        _setTokenURI(id, uri);
    }

    function mintBatch(address[] memory receivers, string[] memory uris)
        public
        onlyOwner
    {
        uint256 lengthUrl = uris.length;
        uint256 lengthReceiver = receivers.length;

        require(
            lengthUrl == lengthReceiver,
            "FittiNft: array params is invalid"
        );
        require(lengthUrl > 0, "FittiNft: array length is invalid");

        uint256 id = counter;

        for (uint256 i = 0; i < lengthUrl; i++) {
            require(bytes(uris[i]).length > 0, "FittiNft: uri is invalid");

            id++;

            _mint(receivers[i], id);

            _setTokenURI(id, uris[i]);
        }

        counter = id;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function setTokenURI(uint256 tokenId, string memory uri) public onlyOwner {
        _setTokenURI(tokenId, uri);
    }

    function _burn(uint256 tokenId)
        internal
        virtual
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004874380380620048748339818101604052810190620000379190620002ab565b82828160009080519060200190620000519291906200017d565b5080600190805190602001906200006a9291906200017d565b5050506200008d62000081620000af60201b60201c565b620000b760201b60201c565b80600d9080519060200190620000a59291906200017d565b50505050620004e8565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200018b90620003f9565b90600052602060002090601f016020900481019282620001af5760008555620001fb565b82601f10620001ca57805160ff1916838001178555620001fb565b82800160010185558215620001fb579182015b82811115620001fa578251825591602001919060010190620001dd565b5b5090506200020a91906200020e565b5090565b5b80821115620002295760008160009055506001016200020f565b5090565b6000620002446200023e846200038d565b62000364565b905082815260208101848484011115620002635762000262620004c8565b5b62000270848285620003c3565b509392505050565b600082601f83011262000290576200028f620004c3565b5b8151620002a28482602086016200022d565b91505092915050565b600080600060608486031215620002c757620002c6620004d2565b5b600084015167ffffffffffffffff811115620002e857620002e7620004cd565b5b620002f68682870162000278565b935050602084015167ffffffffffffffff8111156200031a5762000319620004cd565b5b620003288682870162000278565b925050604084015167ffffffffffffffff8111156200034c576200034b620004cd565b5b6200035a8682870162000278565b9150509250925092565b60006200037062000383565b90506200037e82826200042f565b919050565b6000604051905090565b600067ffffffffffffffff821115620003ab57620003aa62000494565b5b620003b682620004d7565b9050602081019050919050565b60005b83811015620003e3578082015181840152602081019050620003c6565b83811115620003f3576000848401525b50505050565b600060028204905060018216806200041257607f821691505b6020821081141562000429576200042862000465565b5b50919050565b6200043a82620004d7565b810181811067ffffffffffffffff821117156200045c576200045b62000494565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61437c80620004f86000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806361bc221a116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd14610434578063d0def52114610464578063e985e9c514610480578063f2fde38b146104b057610173565b806395d89b41146103de578063a22cb465146103fc578063b88d4fde1461041857610173565b806361bc221a1461031c5780636352211e1461033a57806370a082311461036a578063715018a61461039a5780638da5cb5b146103a4578063924cff6d146103c257610173565b806323b872dd1161013057806323b872dd1461024c5780632f745c591461026857806342842e0e1461029857806342966c68146102b45780634f6ccce7146102d057806355f804b31461030057610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f6578063162094c41461021257806318160ddd1461022e575b600080fd5b610192600480360381019061018d9190612e65565b6104cc565b60405161019f9190613434565b60405180910390f35b6101b06104de565b6040516101bd919061344f565b60405180910390f35b6101e060048036038101906101db9190612f08565b610570565b6040516101ed91906133cd565b60405180910390f35b610210600480360381019061020b9190612dad565b6105f5565b005b61022c60048036038101906102279190612f35565b61070d565b005b610236610797565b6040516102439190613771565b60405180910390f35b61026660048036038101906102619190612c3b565b6107a4565b005b610282600480360381019061027d9190612dad565b610804565b60405161028f9190613771565b60405180910390f35b6102b260048036038101906102ad9190612c3b565b6108a9565b005b6102ce60048036038101906102c99190612f08565b6108c9565b005b6102ea60048036038101906102e59190612f08565b610925565b6040516102f79190613771565b60405180910390f35b61031a60048036038101906103159190612ebf565b610996565b005b610324610a2c565b6040516103319190613771565b60405180910390f35b610354600480360381019061034f9190612f08565b610a32565b60405161036191906133cd565b60405180910390f35b610384600480360381019061037f9190612bce565b610ae4565b6040516103919190613771565b60405180910390f35b6103a2610b9c565b005b6103ac610c24565b6040516103b991906133cd565b60405180910390f35b6103dc60048036038101906103d79190612ded565b610c4e565b005b6103e6610e43565b6040516103f3919061344f565b60405180910390f35b61041660048036038101906104119190612d11565b610ed5565b005b610432600480360381019061042d9190612c8e565b610eeb565b005b61044e60048036038101906104499190612f08565b610f4d565b60405161045b919061344f565b60405180910390f35b61047e60048036038101906104799190612d51565b610f5f565b005b61049a60048036038101906104959190612bfb565b611051565b6040516104a79190613434565b60405180910390f35b6104ca60048036038101906104c59190612bce565b6110e5565b005b60006104d7826111dd565b9050919050565b6060600080546104ed90613a1f565b80601f016020809104026020016040519081016040528092919081815260200182805461051990613a1f565b80156105665780601f1061053b57610100808354040283529160200191610566565b820191906000526020600020905b81548152906001019060200180831161054957829003601f168201915b5050505050905090565b600061057b82611257565b6105ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b190613651565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061060082610a32565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610668906136d1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106906112c3565b73ffffffffffffffffffffffffffffffffffffffff1614806106bf57506106be816106b96112c3565b611051565b5b6106fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f590613571565b60405180910390fd5b61070883836112cb565b505050565b6107156112c3565b73ffffffffffffffffffffffffffffffffffffffff16610733610c24565b73ffffffffffffffffffffffffffffffffffffffff1614610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078090613691565b60405180910390fd5b6107938282611384565b5050565b6000600880549050905090565b6107b56107af6112c3565b826113f8565b6107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90613711565b60405180910390fd5b6107ff8383836114d6565b505050565b600061080f83610ae4565b8210610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084790613471565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108c483838360405180602001604052806000815250610eeb565b505050565b6108da6108d46112c3565b826113f8565b610919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091090613751565b60405180910390fd5b6109228161173d565b50565b600061092f610797565b8210610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790613731565b60405180910390fd5b6008828154811061098457610983613bb8565b5b90600052602060002001549050919050565b61099e6112c3565b73ffffffffffffffffffffffffffffffffffffffff166109bc610c24565b73ffffffffffffffffffffffffffffffffffffffff1614610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0990613691565b60405180910390fd5b80600d9080519060200190610a28929190612848565b5050565b600c5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad2906135b1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c90613591565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ba46112c3565b73ffffffffffffffffffffffffffffffffffffffff16610bc2610c24565b73ffffffffffffffffffffffffffffffffffffffff1614610c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0f90613691565b60405180910390fd5b610c226000611749565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c566112c3565b73ffffffffffffffffffffffffffffffffffffffff16610c74610c24565b73ffffffffffffffffffffffffffffffffffffffff1614610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc190613691565b60405180910390fd5b600081519050600083519050808214610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f906135f1565b60405180910390fd5b60008211610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906136f1565b60405180910390fd5b6000600c54905060005b83811015610e34576000858281518110610d8257610d81613bb8565b5b60200260200101515111610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290613671565b60405180910390fd5b8180610dd690613a82565b925050610dfd868281518110610def57610dee613bb8565b5b60200260200101518361180f565b610e2182868381518110610e1457610e13613bb8565b5b6020026020010151611384565b8080610e2c90613a82565b915050610d65565b5080600c819055505050505050565b606060018054610e5290613a1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7e90613a1f565b8015610ecb5780601f10610ea057610100808354040283529160200191610ecb565b820191906000526020600020905b815481529060010190602001808311610eae57829003601f168201915b5050505050905090565b610ee7610ee06112c3565b83836119e9565b5050565b610efc610ef66112c3565b836113f8565b610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290613711565b60405180910390fd5b610f4784848484611b56565b50505050565b6060610f5882611bb2565b9050919050565b610f676112c3565b73ffffffffffffffffffffffffffffffffffffffff16610f85610c24565b73ffffffffffffffffffffffffffffffffffffffff1614610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290613691565b60405180910390fd5b600081511161101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690613671565b60405180910390fd5b6000600c6000815461103090613a82565b9190508190559050611042838261180f565b61104c8183611384565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110ed6112c3565b73ffffffffffffffffffffffffffffffffffffffff1661110b610c24565b73ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115890613691565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c8906134b1565b60405180910390fd5b6111da81611749565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611250575061124f82611d04565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661133e83610a32565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61138d82611257565b6113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c3906135d1565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906113f3929190612848565b505050565b600061140382611257565b611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990613551565b60405180910390fd5b600061144d83610a32565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114bc57508373ffffffffffffffffffffffffffffffffffffffff166114a484610570565b73ffffffffffffffffffffffffffffffffffffffff16145b806114cd57506114cc8185611051565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114f682610a32565b73ffffffffffffffffffffffffffffffffffffffff161461154c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611543906134d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390613511565b60405180910390fd5b6115c7838383611de6565b6115d26000826112cb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190613935565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461167991906138ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611738838383611df6565b505050565b61174681611dfb565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690613611565b60405180910390fd5b61188881611257565b156118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf906134f1565b60405180910390fd5b6118d460008383611de6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461192491906138ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e560008383611df6565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90613531565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b499190613434565b60405180910390a3505050565b611b618484846114d6565b611b6d84848484611e4e565b611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390613491565b60405180910390fd5b50505050565b6060611bbd82611257565b611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390613631565b60405180910390fd5b6000600a60008481526020019081526020016000208054611c1c90613a1f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4890613a1f565b8015611c955780601f10611c6a57610100808354040283529160200191611c95565b820191906000526020600020905b815481529060010190602001808311611c7857829003601f168201915b505050505090506000611ca6611fe5565b9050600081511415611cbc578192505050611cff565b600082511115611cf1578082604051602001611cd99291906133a9565b60405160208183030381529060405292505050611cff565b611cfa84612077565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dcf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ddf5750611dde8261211e565b5b9050919050565b611df1838383612188565b505050565b505050565b611e048161229c565b6000600a60008381526020019081526020016000208054611e2490613a1f565b905014611e4b57600a60008281526020019081526020016000206000611e4a91906128ce565b5b50565b6000611e6f8473ffffffffffffffffffffffffffffffffffffffff166123b9565b15611fd8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e986112c3565b8786866040518563ffffffff1660e01b8152600401611eba94939291906133e8565b602060405180830381600087803b158015611ed457600080fd5b505af1925050508015611f0557506040513d601f19601f82011682018060405250810190611f029190612e92565b60015b611f88573d8060008114611f35576040519150601f19603f3d011682016040523d82523d6000602084013e611f3a565b606091505b50600081511415611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790613491565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fdd565b600190505b949350505050565b6060600d8054611ff490613a1f565b80601f016020809104026020016040519081016040528092919081815260200182805461202090613a1f565b801561206d5780601f106120425761010080835404028352916020019161206d565b820191906000526020600020905b81548152906001019060200180831161205057829003601f168201915b5050505050905090565b606061208282611257565b6120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b8906136b1565b60405180910390fd5b60006120cb611fe5565b905060008151116120eb5760405180602001604052806000815250612116565b806120f5846123dc565b6040516020016121069291906133a9565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61219383838361253d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121d6576121d181612542565b612215565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461221457612213838261258b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225857612253816126f8565b612297565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122965761229582826127c9565b5b5b505050565b60006122a782610a32565b90506122b581600084611de6565b6122c06000836112cb565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123109190613935565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b581600084611df6565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612424576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612538565b600082905060005b6000821461245657808061243f90613a82565b915050600a8261244f9190613904565b915061242c565b60008167ffffffffffffffff81111561247257612471613be7565b5b6040519080825280601f01601f1916602001820160405280156124a45781602001600182028036833780820191505090505b5090505b60008514612531576001826124bd9190613935565b9150600a856124cc9190613acb565b60306124d891906138ae565b60f81b8183815181106124ee576124ed613bb8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561252a9190613904565b94506124a8565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161259884610ae4565b6125a29190613935565b9050600060076000848152602001908152602001600020549050818114612687576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061270c9190613935565b905060006009600084815260200190815260200160002054905060006008838154811061273c5761273b613bb8565b5b90600052602060002001549050806008838154811061275e5761275d613bb8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127ad576127ac613b89565b5b6001900381819060005260206000200160009055905550505050565b60006127d483610ae4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461285490613a1f565b90600052602060002090601f01602090048101928261287657600085556128bd565b82601f1061288f57805160ff19168380011785556128bd565b828001600101855582156128bd579182015b828111156128bc5782518255916020019190600101906128a1565b5b5090506128ca919061290e565b5090565b5080546128da90613a1f565b6000825580601f106128ec575061290b565b601f01602090049060005260206000209081019061290a919061290e565b5b50565b5b8082111561292757600081600090555060010161290f565b5090565b600061293e612939846137b1565b61378c565b9050808382526020820190508285602086028201111561296157612960613c1b565b5b60005b8581101561299157816129778882612aad565b845260208401935060208301925050600181019050612964565b5050509392505050565b60006129ae6129a9846137dd565b61378c565b905080838252602082019050828560208602820111156129d1576129d0613c1b565b5b60005b85811015612a1f57813567ffffffffffffffff8111156129f7576129f6613c16565b5b808601612a048982612b8b565b855260208501945060208401935050506001810190506129d4565b5050509392505050565b6000612a3c612a3784613809565b61378c565b905082815260208101848484011115612a5857612a57613c20565b5b612a638482856139dd565b509392505050565b6000612a7e612a798461383a565b61378c565b905082815260208101848484011115612a9a57612a99613c20565b5b612aa58482856139dd565b509392505050565b600081359050612abc816142ea565b92915050565b600082601f830112612ad757612ad6613c16565b5b8135612ae784826020860161292b565b91505092915050565b600082601f830112612b0557612b04613c16565b5b8135612b1584826020860161299b565b91505092915050565b600081359050612b2d81614301565b92915050565b600081359050612b4281614318565b92915050565b600081519050612b5781614318565b92915050565b600082601f830112612b7257612b71613c16565b5b8135612b82848260208601612a29565b91505092915050565b600082601f830112612ba057612b9f613c16565b5b8135612bb0848260208601612a6b565b91505092915050565b600081359050612bc88161432f565b92915050565b600060208284031215612be457612be3613c2a565b5b6000612bf284828501612aad565b91505092915050565b60008060408385031215612c1257612c11613c2a565b5b6000612c2085828601612aad565b9250506020612c3185828601612aad565b9150509250929050565b600080600060608486031215612c5457612c53613c2a565b5b6000612c6286828701612aad565b9350506020612c7386828701612aad565b9250506040612c8486828701612bb9565b9150509250925092565b60008060008060808587031215612ca857612ca7613c2a565b5b6000612cb687828801612aad565b9450506020612cc787828801612aad565b9350506040612cd887828801612bb9565b925050606085013567ffffffffffffffff811115612cf957612cf8613c25565b5b612d0587828801612b5d565b91505092959194509250565b60008060408385031215612d2857612d27613c2a565b5b6000612d3685828601612aad565b9250506020612d4785828601612b1e565b9150509250929050565b60008060408385031215612d6857612d67613c2a565b5b6000612d7685828601612aad565b925050602083013567ffffffffffffffff811115612d9757612d96613c25565b5b612da385828601612b8b565b9150509250929050565b60008060408385031215612dc457612dc3613c2a565b5b6000612dd285828601612aad565b9250506020612de385828601612bb9565b9150509250929050565b60008060408385031215612e0457612e03613c2a565b5b600083013567ffffffffffffffff811115612e2257612e21613c25565b5b612e2e85828601612ac2565b925050602083013567ffffffffffffffff811115612e4f57612e4e613c25565b5b612e5b85828601612af0565b9150509250929050565b600060208284031215612e7b57612e7a613c2a565b5b6000612e8984828501612b33565b91505092915050565b600060208284031215612ea857612ea7613c2a565b5b6000612eb684828501612b48565b91505092915050565b600060208284031215612ed557612ed4613c2a565b5b600082013567ffffffffffffffff811115612ef357612ef2613c25565b5b612eff84828501612b8b565b91505092915050565b600060208284031215612f1e57612f1d613c2a565b5b6000612f2c84828501612bb9565b91505092915050565b60008060408385031215612f4c57612f4b613c2a565b5b6000612f5a85828601612bb9565b925050602083013567ffffffffffffffff811115612f7b57612f7a613c25565b5b612f8785828601612b8b565b9150509250929050565b612f9a81613969565b82525050565b612fa98161397b565b82525050565b6000612fba8261386b565b612fc48185613881565b9350612fd48185602086016139ec565b612fdd81613c2f565b840191505092915050565b6000612ff382613876565b612ffd8185613892565b935061300d8185602086016139ec565b61301681613c2f565b840191505092915050565b600061302c82613876565b61303681856138a3565b93506130468185602086016139ec565b80840191505092915050565b600061305f602b83613892565b915061306a82613c40565b604082019050919050565b6000613082603283613892565b915061308d82613c8f565b604082019050919050565b60006130a5602683613892565b91506130b082613cde565b604082019050919050565b60006130c8602583613892565b91506130d382613d2d565b604082019050919050565b60006130eb601c83613892565b91506130f682613d7c565b602082019050919050565b600061310e602483613892565b915061311982613da5565b604082019050919050565b6000613131601983613892565b915061313c82613df4565b602082019050919050565b6000613154602c83613892565b915061315f82613e1d565b604082019050919050565b6000613177603883613892565b915061318282613e6c565b604082019050919050565b600061319a602a83613892565b91506131a582613ebb565b604082019050919050565b60006131bd602983613892565b91506131c882613f0a565b604082019050919050565b60006131e0602e83613892565b91506131eb82613f59565b604082019050919050565b6000613203602183613892565b915061320e82613fa8565b604082019050919050565b6000613226602083613892565b915061323182613ff7565b602082019050919050565b6000613249603183613892565b915061325482614020565b604082019050919050565b600061326c602c83613892565b91506132778261406f565b604082019050919050565b600061328f601883613892565b915061329a826140be565b602082019050919050565b60006132b2602083613892565b91506132bd826140e7565b602082019050919050565b60006132d5602f83613892565b91506132e082614110565b604082019050919050565b60006132f8602183613892565b91506133038261415f565b604082019050919050565b600061331b602183613892565b9150613326826141ae565b604082019050919050565b600061333e603183613892565b9150613349826141fd565b604082019050919050565b6000613361602c83613892565b915061336c8261424c565b604082019050919050565b6000613384603083613892565b915061338f8261429b565b604082019050919050565b6133a3816139d3565b82525050565b60006133b58285613021565b91506133c18284613021565b91508190509392505050565b60006020820190506133e26000830184612f91565b92915050565b60006080820190506133fd6000830187612f91565b61340a6020830186612f91565b613417604083018561339a565b81810360608301526134298184612faf565b905095945050505050565b60006020820190506134496000830184612fa0565b92915050565b600060208201905081810360008301526134698184612fe8565b905092915050565b6000602082019050818103600083015261348a81613052565b9050919050565b600060208201905081810360008301526134aa81613075565b9050919050565b600060208201905081810360008301526134ca81613098565b9050919050565b600060208201905081810360008301526134ea816130bb565b9050919050565b6000602082019050818103600083015261350a816130de565b9050919050565b6000602082019050818103600083015261352a81613101565b9050919050565b6000602082019050818103600083015261354a81613124565b9050919050565b6000602082019050818103600083015261356a81613147565b9050919050565b6000602082019050818103600083015261358a8161316a565b9050919050565b600060208201905081810360008301526135aa8161318d565b9050919050565b600060208201905081810360008301526135ca816131b0565b9050919050565b600060208201905081810360008301526135ea816131d3565b9050919050565b6000602082019050818103600083015261360a816131f6565b9050919050565b6000602082019050818103600083015261362a81613219565b9050919050565b6000602082019050818103600083015261364a8161323c565b9050919050565b6000602082019050818103600083015261366a8161325f565b9050919050565b6000602082019050818103600083015261368a81613282565b9050919050565b600060208201905081810360008301526136aa816132a5565b9050919050565b600060208201905081810360008301526136ca816132c8565b9050919050565b600060208201905081810360008301526136ea816132eb565b9050919050565b6000602082019050818103600083015261370a8161330e565b9050919050565b6000602082019050818103600083015261372a81613331565b9050919050565b6000602082019050818103600083015261374a81613354565b9050919050565b6000602082019050818103600083015261376a81613377565b9050919050565b6000602082019050613786600083018461339a565b92915050565b60006137966137a7565b90506137a28282613a51565b919050565b6000604051905090565b600067ffffffffffffffff8211156137cc576137cb613be7565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156137f8576137f7613be7565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561382457613823613be7565b5b61382d82613c2f565b9050602081019050919050565b600067ffffffffffffffff82111561385557613854613be7565b5b61385e82613c2f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138b9826139d3565b91506138c4836139d3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138f9576138f8613afc565b5b828201905092915050565b600061390f826139d3565b915061391a836139d3565b92508261392a57613929613b2b565b5b828204905092915050565b6000613940826139d3565b915061394b836139d3565b92508282101561395e5761395d613afc565b5b828203905092915050565b6000613974826139b3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a0a5780820151818401526020810190506139ef565b83811115613a19576000848401525b50505050565b60006002820490506001821680613a3757607f821691505b60208210811415613a4b57613a4a613b5a565b5b50919050565b613a5a82613c2f565b810181811067ffffffffffffffff82111715613a7957613a78613be7565b5b80604052505050565b6000613a8d826139d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ac057613abf613afc565b5b600182019050919050565b6000613ad6826139d3565b9150613ae1836139d3565b925082613af157613af0613b2b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f46697474694e66743a20617272617920706172616d7320697320696e76616c6960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f46697474694e66743a2075726920697320696e76616c69640000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f46697474694e66743a206172726179206c656e67746820697320696e76616c6960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6142f381613969565b81146142fe57600080fd5b50565b61430a8161397b565b811461431557600080fd5b50565b61432181613987565b811461432c57600080fd5b50565b614338816139d3565b811461434357600080fd5b5056fea2646970667358221220de36557c6e7c11bc4b09bbd53c986bcfd8abf4f4a323d74fe010493ab934a4cd64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a466974746970616c646900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546495454490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5a4b55474e4d446b77385452737662374139554c41527034596762387950614d51753468684645437774774e0000000000000000000000

Deployed ByteCode Sourcemap

48485:2495:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50748:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22665:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24224:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23747:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50111:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37573:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24974:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37241:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25384:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45630:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37763:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48824:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48594:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22359:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22089:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47599:103;;;:::i;:::-;;46948:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49176:706;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22834:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24517:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25640:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49890:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48922:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24743:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47857:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50748:229;50904:4;50933:36;50957:11;50933:23;:36::i;:::-;50926:43;;50748:229;;;:::o;22665:100::-;22719:13;22752:5;22745:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22665:100;:::o;24224:221::-;24300:7;24328:16;24336:7;24328;:16::i;:::-;24320:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24413:15;:24;24429:7;24413:24;;;;;;;;;;;;;;;;;;;;;24406:31;;24224:221;;;:::o;23747:411::-;23828:13;23844:23;23859:7;23844:14;:23::i;:::-;23828:39;;23892:5;23886:11;;:2;:11;;;;23878:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23986:5;23970:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23995:37;24012:5;24019:12;:10;:12::i;:::-;23995:16;:37::i;:::-;23970:62;23948:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24129:21;24138:2;24142:7;24129:8;:21::i;:::-;23817:341;23747:411;;:::o;50111:119::-;47179:12;:10;:12::i;:::-;47168:23;;:7;:5;:7::i;:::-;:23;;;47160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50196:26:::1;50209:7;50218:3;50196:12;:26::i;:::-;50111:119:::0;;:::o;37573:113::-;37634:7;37661:10;:17;;;;37654:24;;37573:113;:::o;24974:339::-;25169:41;25188:12;:10;:12::i;:::-;25202:7;25169:18;:41::i;:::-;25161:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25277:28;25287:4;25293:2;25297:7;25277:9;:28::i;:::-;24974:339;;;:::o;37241:256::-;37338:7;37374:23;37391:5;37374:16;:23::i;:::-;37366:5;:31;37358:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37463:12;:19;37476:5;37463:19;;;;;;;;;;;;;;;:26;37483:5;37463:26;;;;;;;;;;;;37456:33;;37241:256;;;;:::o;25384:185::-;25522:39;25539:4;25545:2;25549:7;25522:39;;;;;;;;;;;;:16;:39::i;:::-;25384:185;;;:::o;45630:245::-;45748:41;45767:12;:10;:12::i;:::-;45781:7;45748:18;:41::i;:::-;45740:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;45853:14;45859:7;45853:5;:14::i;:::-;45630:245;:::o;37763:233::-;37838:7;37874:30;:28;:30::i;:::-;37866:5;:38;37858:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37971:10;37982:5;37971:17;;;;;;;;:::i;:::-;;;;;;;;;;37964:24;;37763:233;;;:::o;48824:90::-;47179:12;:10;:12::i;:::-;47168:23;;:7;:5;:7::i;:::-;:23;;;47160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48903:3:::1;48893:7;:13;;;;;;;;;;;;:::i;:::-;;48824:90:::0;:::o;48594:22::-;;;;:::o;22359:239::-;22431:7;22451:13;22467:7;:16;22475:7;22467:16;;;;;;;;;;;;;;;;;;;;;22451:32;;22519:1;22502:19;;:5;:19;;;;22494:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22585:5;22578:12;;;22359:239;;;:::o;22089:208::-;22161:7;22206:1;22189:19;;:5;:19;;;;22181:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22273:9;:16;22283:5;22273:16;;;;;;;;;;;;;;;;22266:23;;22089:208;;;:::o;47599:103::-;47179:12;:10;:12::i;:::-;47168:23;;:7;:5;:7::i;:::-;:23;;;47160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47664:30:::1;47691:1;47664:18;:30::i;:::-;47599:103::o:0;46948:87::-;46994:7;47021:6;;;;;;;;;;;47014:13;;46948:87;:::o;49176:706::-;47179:12;:10;:12::i;:::-;47168:23;;:7;:5;:7::i;:::-;:23;;;47160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49296:17:::1;49316:4;:11;49296:31;;49338:22;49363:9;:16;49338:41;;49427:14;49414:9;:27;49392:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49533:1;49521:9;:13;49513:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;49585:10;49598:7;;49585:20;;49623:9;49618:232;49642:9;49638:1;:13;49618:232;;;49705:1;49687:4;49692:1;49687:7;;;;;;;;:::i;:::-;;;;;;;;49681:21;:25;49673:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49752:4;;;;;:::i;:::-;;;;49773:23;49779:9;49789:1;49779:12;;;;;;;;:::i;:::-;;;;;;;;49793:2;49773:5;:23::i;:::-;49813:25;49826:2;49830:4;49835:1;49830:7;;;;;;;;:::i;:::-;;;;;;;;49813:12;:25::i;:::-;49653:3;;;;;:::i;:::-;;;;49618:232;;;;49872:2;49862:7;:12;;;;49285:597;;;49176:706:::0;;:::o;22834:104::-;22890:13;22923:7;22916:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22834:104;:::o;24517:155::-;24612:52;24631:12;:10;:12::i;:::-;24645:8;24655;24612:18;:52::i;:::-;24517:155;;:::o;25640:328::-;25815:41;25834:12;:10;:12::i;:::-;25848:7;25815:18;:41::i;:::-;25807:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25921:39;25935:4;25941:2;25945:7;25954:5;25921:13;:39::i;:::-;25640:328;;;;:::o;49890:213::-;50034:13;50072:23;50087:7;50072:14;:23::i;:::-;50065:30;;49890:213;;;:::o;48922:246::-;47179:12;:10;:12::i;:::-;47168:23;;:7;:5;:7::i;:::-;:23;;;47160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49029:1:::1;49015:3;49009:17;:21;49001:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49072:10;49087:7;;49085:9;;;;;:::i;:::-;;;;;;;49072:22;;49107:19;49113:8;49123:2;49107:5;:19::i;:::-;49139:21;49152:2;49156:3;49139:12;:21::i;:::-;48990:178;48922:246:::0;;:::o;24743:164::-;24840:4;24864:18;:25;24883:5;24864:25;;;;;;;;;;;;;;;:35;24890:8;24864:35;;;;;;;;;;;;;;;;;;;;;;;;;24857:42;;24743:164;;;;:::o;47857:201::-;47179:12;:10;:12::i;:::-;47168:23;;:7;:5;:7::i;:::-;:23;;;47160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47966:1:::1;47946:22;;:8;:22;;;;47938:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48022:28;48041:8;48022:18;:28::i;:::-;47857:201:::0;:::o;36933:224::-;37035:4;37074:35;37059:50;;;:11;:50;;;;:90;;;;37113:36;37137:11;37113:23;:36::i;:::-;37059:90;37052:97;;36933:224;;;:::o;27478:127::-;27543:4;27595:1;27567:30;;:7;:16;27575:7;27567:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27560:37;;27478:127;;;:::o;16932:98::-;16985:7;17012:10;17005:17;;16932:98;:::o;31624:174::-;31726:2;31699:15;:24;31715:7;31699:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31782:7;31778:2;31744:46;;31753:23;31768:7;31753:14;:23::i;:::-;31744:46;;;;;;;;;;;;31624:174;;:::o;44431:217::-;44531:16;44539:7;44531;:16::i;:::-;44523:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;44631:9;44609:10;:19;44620:7;44609:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;44431:217;;:::o;27772:348::-;27865:4;27890:16;27898:7;27890;:16::i;:::-;27882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27966:13;27982:23;27997:7;27982:14;:23::i;:::-;27966:39;;28035:5;28024:16;;:7;:16;;;:51;;;;28068:7;28044:31;;:20;28056:7;28044:11;:20::i;:::-;:31;;;28024:51;:87;;;;28079:32;28096:5;28103:7;28079:16;:32::i;:::-;28024:87;28016:96;;;27772:348;;;;:::o;30881:625::-;31040:4;31013:31;;:23;31028:7;31013:14;:23::i;:::-;:31;;;31005:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31119:1;31105:16;;:2;:16;;;;31097:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31175:39;31196:4;31202:2;31206:7;31175:20;:39::i;:::-;31279:29;31296:1;31300:7;31279:8;:29::i;:::-;31340:1;31321:9;:15;31331:4;31321:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31369:1;31352:9;:13;31362:2;31352:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31400:2;31381:7;:16;31389:7;31381:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31439:7;31435:2;31420:27;;31429:4;31420:27;;;;;;;;;;;;31460:38;31480:4;31486:2;31490:7;31460:19;:38::i;:::-;30881:625;;;:::o;50238:155::-;50365:20;50377:7;50365:11;:20::i;:::-;50238:155;:::o;48218:191::-;48292:16;48311:6;;;;;;;;;;;48292:25;;48337:8;48328:6;;:17;;;;;;;;;;;;;;;;;;48392:8;48361:40;;48382:8;48361:40;;;;;;;;;;;;48281:128;48218:191;:::o;29456:439::-;29550:1;29536:16;;:2;:16;;;;29528:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29609:16;29617:7;29609;:16::i;:::-;29608:17;29600:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29671:45;29700:1;29704:2;29708:7;29671:20;:45::i;:::-;29746:1;29729:9;:13;29739:2;29729:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29777:2;29758:7;:16;29766:7;29758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29822:7;29818:2;29797:33;;29814:1;29797:33;;;;;;;;;;;;29843:44;29871:1;29875:2;29879:7;29843:19;:44::i;:::-;29456:439;;:::o;31940:315::-;32095:8;32086:17;;:5;:17;;;;32078:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32182:8;32144:18;:25;32163:5;32144:25;;;;;;;;;;;;;;;:35;32170:8;32144:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32228:8;32206:41;;32221:5;32206:41;;;32238:8;32206:41;;;;;;:::i;:::-;;;;;;;;31940:315;;;:::o;26850:::-;27007:28;27017:4;27023:2;27027:7;27007:9;:28::i;:::-;27054:48;27077:4;27083:2;27087:7;27096:5;27054:22;:48::i;:::-;27046:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26850:315;;;;:::o;43596:679::-;43669:13;43703:16;43711:7;43703;:16::i;:::-;43695:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;43786:23;43812:10;:19;43823:7;43812:19;;;;;;;;;;;43786:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43842:18;43863:10;:8;:10::i;:::-;43842:31;;43971:1;43955:4;43949:18;:23;43945:72;;;43996:9;43989:16;;;;;;43945:72;44147:1;44127:9;44121:23;:27;44117:108;;;44196:4;44202:9;44179:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44165:48;;;;;;44117:108;44244:23;44259:7;44244:14;:23::i;:::-;44237:30;;;;43596:679;;;;:::o;21720:305::-;21822:4;21874:25;21859:40;;;:11;:40;;;;:105;;;;21931:33;21916:48;;;:11;:48;;;;21859:105;:158;;;;21981:36;22005:11;21981:23;:36::i;:::-;21859:158;21839:178;;21720:305;;;:::o;50517:223::-;50687:45;50714:4;50720:2;50724:7;50687:26;:45::i;:::-;50517:223;;;:::o;34702:125::-;;;;:::o;44877:206::-;44946:20;44958:7;44946:11;:20::i;:::-;45020:1;44989:10;:19;45000:7;44989:19;;;;;;;;;;;44983:33;;;;;:::i;:::-;;;:38;44979:97;;45045:10;:19;45056:7;45045:19;;;;;;;;;;;;45038:26;;;;:::i;:::-;44979:97;44877:206;:::o;32820:799::-;32975:4;32996:15;:2;:13;;;:15::i;:::-;32992:620;;;33048:2;33032:36;;;33069:12;:10;:12::i;:::-;33083:4;33089:7;33098:5;33032:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33028:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33291:1;33274:6;:13;:18;33270:272;;;33317:60;;;;;;;;;;:::i;:::-;;;;;;;;33270:272;33492:6;33486:13;33477:6;33473:2;33469:15;33462:38;33028:529;33165:41;;;33155:51;;;:6;:51;;;;33148:58;;;;;32992:620;33596:4;33589:11;;32820:799;;;;;;;:::o;50401:108::-;50461:13;50494:7;50487:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50401:108;:::o;23009:334::-;23082:13;23116:16;23124:7;23116;:16::i;:::-;23108:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23197:21;23221:10;:8;:10::i;:::-;23197:34;;23273:1;23255:7;23249:21;:25;:86;;;;;;;;;;;;;;;;;23301:7;23310:18;:7;:16;:18::i;:::-;23284:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23249:86;23242:93;;;23009:334;;;:::o;20145:157::-;20230:4;20269:25;20254:40;;;:11;:40;;;;20247:47;;20145:157;;;:::o;38609:589::-;38753:45;38780:4;38786:2;38790:7;38753:26;:45::i;:::-;38831:1;38815:18;;:4;:18;;;38811:187;;;38850:40;38882:7;38850:31;:40::i;:::-;38811:187;;;38920:2;38912:10;;:4;:10;;;38908:90;;38939:47;38972:4;38978:7;38939:32;:47::i;:::-;38908:90;38811:187;39026:1;39012:16;;:2;:16;;;39008:183;;;39045:45;39082:7;39045:36;:45::i;:::-;39008:183;;;39118:4;39112:10;;:2;:10;;;39108:83;;39139:40;39167:2;39171:7;39139:27;:40::i;:::-;39108:83;39008:183;38609:589;;;:::o;30124:420::-;30184:13;30200:23;30215:7;30200:14;:23::i;:::-;30184:39;;30236:48;30257:5;30272:1;30276:7;30236:20;:48::i;:::-;30325:29;30342:1;30346:7;30325:8;:29::i;:::-;30387:1;30367:9;:16;30377:5;30367:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30406:7;:16;30414:7;30406:16;;;;;;;;;;;;30399:23;;;;;;;;;;;30468:7;30464:1;30440:36;;30449:5;30440:36;;;;;;;;;;;;30489:47;30509:5;30524:1;30528:7;30489:19;:47::i;:::-;30173:371;30124:420;:::o;8977:326::-;9037:4;9294:1;9272:7;:19;;;:23;9265:30;;8977:326;;;:::o;17517:723::-;17573:13;17803:1;17794:5;:10;17790:53;;;17821:10;;;;;;;;;;;;;;;;;;;;;17790:53;17853:12;17868:5;17853:20;;17884:14;17909:78;17924:1;17916:4;:9;17909:78;;17942:8;;;;;:::i;:::-;;;;17973:2;17965:10;;;;;:::i;:::-;;;17909:78;;;17997:19;18029:6;18019:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17997:39;;18047:154;18063:1;18054:5;:10;18047:154;;18091:1;18081:11;;;;;:::i;:::-;;;18158:2;18150:5;:10;;;;:::i;:::-;18137:2;:24;;;;:::i;:::-;18124:39;;18107:6;18114;18107:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18187:2;18178:11;;;;;:::i;:::-;;;18047:154;;;18225:6;18211:21;;;;;17517:723;;;;:::o;34191:126::-;;;;:::o;39921:164::-;40025:10;:17;;;;39998:15;:24;40014:7;39998:24;;;;;;;;;;;:44;;;;40053:10;40069:7;40053:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39921:164;:::o;40712:988::-;40978:22;41028:1;41003:22;41020:4;41003:16;:22::i;:::-;:26;;;;:::i;:::-;40978:51;;41040:18;41061:17;:26;41079:7;41061:26;;;;;;;;;;;;41040:47;;41208:14;41194:10;:28;41190:328;;41239:19;41261:12;:18;41274:4;41261:18;;;;;;;;;;;;;;;:34;41280:14;41261:34;;;;;;;;;;;;41239:56;;41345:11;41312:12;:18;41325:4;41312:18;;;;;;;;;;;;;;;:30;41331:10;41312:30;;;;;;;;;;;:44;;;;41462:10;41429:17;:30;41447:11;41429:30;;;;;;;;;;;:43;;;;41224:294;41190:328;41614:17;:26;41632:7;41614:26;;;;;;;;;;;41607:33;;;41658:12;:18;41671:4;41658:18;;;;;;;;;;;;;;;:34;41677:14;41658:34;;;;;;;;;;;41651:41;;;40793:907;;40712:988;;:::o;41995:1079::-;42248:22;42293:1;42273:10;:17;;;;:21;;;;:::i;:::-;42248:46;;42305:18;42326:15;:24;42342:7;42326:24;;;;;;;;;;;;42305:45;;42677:19;42699:10;42710:14;42699:26;;;;;;;;:::i;:::-;;;;;;;;;;42677:48;;42763:11;42738:10;42749;42738:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42874:10;42843:15;:28;42859:11;42843:28;;;;;;;;;;;:41;;;;43015:15;:24;43031:7;43015:24;;;;;;;;;;;43008:31;;;43050:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42066:1008;;;41995:1079;:::o;39499:221::-;39584:14;39601:20;39618:2;39601:16;:20::i;:::-;39584:37;;39659:7;39632:12;:16;39645:2;39632:16;;;;;;;;;;;;;;;:24;39649:6;39632:24;;;;;;;;;;;:34;;;;39706:6;39677:17;:26;39695:7;39677:26;;;;;;;;;;;:35;;;;39573:147;39499:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:957::-;874:5;899:91;915:74;982:6;915:74;:::i;:::-;899:91;:::i;:::-;890:100;;1010:5;1039:6;1032:5;1025:21;1073:4;1066:5;1062:16;1055:23;;1099:6;1149:3;1141:4;1133:6;1129:17;1124:3;1120:27;1117:36;1114:143;;;1168:79;;:::i;:::-;1114:143;1281:1;1266:453;1291:6;1288:1;1285:13;1266:453;;;1373:3;1360:17;1409:18;1396:11;1393:35;1390:122;;;1431:79;;:::i;:::-;1390:122;1555:11;1547:6;1543:24;1593:47;1636:3;1624:10;1593:47;:::i;:::-;1588:3;1581:60;1670:4;1665:3;1661:14;1654:21;;1704:4;1699:3;1695:14;1688:21;;1326:393;;1313:1;1310;1306:9;1301:14;;1266:453;;;1270:14;880:845;;768:957;;;;;:::o;1731:410::-;1808:5;1833:65;1849:48;1890:6;1849:48;:::i;:::-;1833:65;:::i;:::-;1824:74;;1921:6;1914:5;1907:21;1959:4;1952:5;1948:16;1997:3;1988:6;1983:3;1979:16;1976:25;1973:112;;;2004:79;;:::i;:::-;1973:112;2094:41;2128:6;2123:3;2118;2094:41;:::i;:::-;1814:327;1731:410;;;;;:::o;2147:412::-;2225:5;2250:66;2266:49;2308:6;2266:49;:::i;:::-;2250:66;:::i;:::-;2241:75;;2339:6;2332:5;2325:21;2377:4;2370:5;2366:16;2415:3;2406:6;2401:3;2397:16;2394:25;2391:112;;;2422:79;;:::i;:::-;2391:112;2512:41;2546:6;2541:3;2536;2512:41;:::i;:::-;2231:328;2147:412;;;;;:::o;2565:139::-;2611:5;2649:6;2636:20;2627:29;;2665:33;2692:5;2665:33;:::i;:::-;2565:139;;;;:::o;2727:370::-;2798:5;2847:3;2840:4;2832:6;2828:17;2824:27;2814:122;;2855:79;;:::i;:::-;2814:122;2972:6;2959:20;2997:94;3087:3;3079:6;3072:4;3064:6;3060:17;2997:94;:::i;:::-;2988:103;;2804:293;2727:370;;;;:::o;3119:390::-;3200:5;3249:3;3242:4;3234:6;3230:17;3226:27;3216:122;;3257:79;;:::i;:::-;3216:122;3374:6;3361:20;3399:104;3499:3;3491:6;3484:4;3476:6;3472:17;3399:104;:::i;:::-;3390:113;;3206:303;3119:390;;;;:::o;3515:133::-;3558:5;3596:6;3583:20;3574:29;;3612:30;3636:5;3612:30;:::i;:::-;3515:133;;;;:::o;3654:137::-;3699:5;3737:6;3724:20;3715:29;;3753:32;3779:5;3753:32;:::i;:::-;3654:137;;;;:::o;3797:141::-;3853:5;3884:6;3878:13;3869:22;;3900:32;3926:5;3900:32;:::i;:::-;3797:141;;;;:::o;3957:338::-;4012:5;4061:3;4054:4;4046:6;4042:17;4038:27;4028:122;;4069:79;;:::i;:::-;4028:122;4186:6;4173:20;4211:78;4285:3;4277:6;4270:4;4262:6;4258:17;4211:78;:::i;:::-;4202:87;;4018:277;3957:338;;;;:::o;4315:340::-;4371:5;4420:3;4413:4;4405:6;4401:17;4397:27;4387:122;;4428:79;;:::i;:::-;4387:122;4545:6;4532:20;4570:79;4645:3;4637:6;4630:4;4622:6;4618:17;4570:79;:::i;:::-;4561:88;;4377:278;4315:340;;;;:::o;4661:139::-;4707:5;4745:6;4732:20;4723:29;;4761:33;4788:5;4761:33;:::i;:::-;4661:139;;;;:::o;4806:329::-;4865:6;4914:2;4902:9;4893:7;4889:23;4885:32;4882:119;;;4920:79;;:::i;:::-;4882:119;5040:1;5065:53;5110:7;5101:6;5090:9;5086:22;5065:53;:::i;:::-;5055:63;;5011:117;4806:329;;;;:::o;5141:474::-;5209:6;5217;5266:2;5254:9;5245:7;5241:23;5237:32;5234:119;;;5272:79;;:::i;:::-;5234:119;5392:1;5417:53;5462:7;5453:6;5442:9;5438:22;5417:53;:::i;:::-;5407:63;;5363:117;5519:2;5545:53;5590:7;5581:6;5570:9;5566:22;5545:53;:::i;:::-;5535:63;;5490:118;5141:474;;;;;:::o;5621:619::-;5698:6;5706;5714;5763:2;5751:9;5742:7;5738:23;5734:32;5731:119;;;5769:79;;:::i;:::-;5731:119;5889:1;5914:53;5959:7;5950:6;5939:9;5935:22;5914:53;:::i;:::-;5904:63;;5860:117;6016:2;6042:53;6087:7;6078:6;6067:9;6063:22;6042:53;:::i;:::-;6032:63;;5987:118;6144:2;6170:53;6215:7;6206:6;6195:9;6191:22;6170:53;:::i;:::-;6160:63;;6115:118;5621:619;;;;;:::o;6246:943::-;6341:6;6349;6357;6365;6414:3;6402:9;6393:7;6389:23;6385:33;6382:120;;;6421:79;;:::i;:::-;6382:120;6541:1;6566:53;6611:7;6602:6;6591:9;6587:22;6566:53;:::i;:::-;6556:63;;6512:117;6668:2;6694:53;6739:7;6730:6;6719:9;6715:22;6694:53;:::i;:::-;6684:63;;6639:118;6796:2;6822:53;6867:7;6858:6;6847:9;6843:22;6822:53;:::i;:::-;6812:63;;6767:118;6952:2;6941:9;6937:18;6924:32;6983:18;6975:6;6972:30;6969:117;;;7005:79;;:::i;:::-;6969:117;7110:62;7164:7;7155:6;7144:9;7140:22;7110:62;:::i;:::-;7100:72;;6895:287;6246:943;;;;;;;:::o;7195:468::-;7260:6;7268;7317:2;7305:9;7296:7;7292:23;7288:32;7285:119;;;7323:79;;:::i;:::-;7285:119;7443:1;7468:53;7513:7;7504:6;7493:9;7489:22;7468:53;:::i;:::-;7458:63;;7414:117;7570:2;7596:50;7638:7;7629:6;7618:9;7614:22;7596:50;:::i;:::-;7586:60;;7541:115;7195:468;;;;;:::o;7669:654::-;7747:6;7755;7804:2;7792:9;7783:7;7779:23;7775:32;7772:119;;;7810:79;;:::i;:::-;7772:119;7930:1;7955:53;8000:7;7991:6;7980:9;7976:22;7955:53;:::i;:::-;7945:63;;7901:117;8085:2;8074:9;8070:18;8057:32;8116:18;8108:6;8105:30;8102:117;;;8138:79;;:::i;:::-;8102:117;8243:63;8298:7;8289:6;8278:9;8274:22;8243:63;:::i;:::-;8233:73;;8028:288;7669:654;;;;;:::o;8329:474::-;8397:6;8405;8454:2;8442:9;8433:7;8429:23;8425:32;8422:119;;;8460:79;;:::i;:::-;8422:119;8580:1;8605:53;8650:7;8641:6;8630:9;8626:22;8605:53;:::i;:::-;8595:63;;8551:117;8707:2;8733:53;8778:7;8769:6;8758:9;8754:22;8733:53;:::i;:::-;8723:63;;8678:118;8329:474;;;;;:::o;8809:914::-;8937:6;8945;8994:2;8982:9;8973:7;8969:23;8965:32;8962:119;;;9000:79;;:::i;:::-;8962:119;9148:1;9137:9;9133:17;9120:31;9178:18;9170:6;9167:30;9164:117;;;9200:79;;:::i;:::-;9164:117;9305:78;9375:7;9366:6;9355:9;9351:22;9305:78;:::i;:::-;9295:88;;9091:302;9460:2;9449:9;9445:18;9432:32;9491:18;9483:6;9480:30;9477:117;;;9513:79;;:::i;:::-;9477:117;9618:88;9698:7;9689:6;9678:9;9674:22;9618:88;:::i;:::-;9608:98;;9403:313;8809:914;;;;;:::o;9729:327::-;9787:6;9836:2;9824:9;9815:7;9811:23;9807:32;9804:119;;;9842:79;;:::i;:::-;9804:119;9962:1;9987:52;10031:7;10022:6;10011:9;10007:22;9987:52;:::i;:::-;9977:62;;9933:116;9729:327;;;;:::o;10062:349::-;10131:6;10180:2;10168:9;10159:7;10155:23;10151:32;10148:119;;;10186:79;;:::i;:::-;10148:119;10306:1;10331:63;10386:7;10377:6;10366:9;10362:22;10331:63;:::i;:::-;10321:73;;10277:127;10062:349;;;;:::o;10417:509::-;10486:6;10535:2;10523:9;10514:7;10510:23;10506:32;10503:119;;;10541:79;;:::i;:::-;10503:119;10689:1;10678:9;10674:17;10661:31;10719:18;10711:6;10708:30;10705:117;;;10741:79;;:::i;:::-;10705:117;10846:63;10901:7;10892:6;10881:9;10877:22;10846:63;:::i;:::-;10836:73;;10632:287;10417:509;;;;:::o;10932:329::-;10991:6;11040:2;11028:9;11019:7;11015:23;11011:32;11008:119;;;11046:79;;:::i;:::-;11008:119;11166:1;11191:53;11236:7;11227:6;11216:9;11212:22;11191:53;:::i;:::-;11181:63;;11137:117;10932:329;;;;:::o;11267:654::-;11345:6;11353;11402:2;11390:9;11381:7;11377:23;11373:32;11370:119;;;11408:79;;:::i;:::-;11370:119;11528:1;11553:53;11598:7;11589:6;11578:9;11574:22;11553:53;:::i;:::-;11543:63;;11499:117;11683:2;11672:9;11668:18;11655:32;11714:18;11706:6;11703:30;11700:117;;;11736:79;;:::i;:::-;11700:117;11841:63;11896:7;11887:6;11876:9;11872:22;11841:63;:::i;:::-;11831:73;;11626:288;11267:654;;;;;:::o;11927:118::-;12014:24;12032:5;12014:24;:::i;:::-;12009:3;12002:37;11927:118;;:::o;12051:109::-;12132:21;12147:5;12132:21;:::i;:::-;12127:3;12120:34;12051:109;;:::o;12166:360::-;12252:3;12280:38;12312:5;12280:38;:::i;:::-;12334:70;12397:6;12392:3;12334:70;:::i;:::-;12327:77;;12413:52;12458:6;12453:3;12446:4;12439:5;12435:16;12413:52;:::i;:::-;12490:29;12512:6;12490:29;:::i;:::-;12485:3;12481:39;12474:46;;12256:270;12166:360;;;;:::o;12532:364::-;12620:3;12648:39;12681:5;12648:39;:::i;:::-;12703:71;12767:6;12762:3;12703:71;:::i;:::-;12696:78;;12783:52;12828:6;12823:3;12816:4;12809:5;12805:16;12783:52;:::i;:::-;12860:29;12882:6;12860:29;:::i;:::-;12855:3;12851:39;12844:46;;12624:272;12532:364;;;;:::o;12902:377::-;13008:3;13036:39;13069:5;13036:39;:::i;:::-;13091:89;13173:6;13168:3;13091:89;:::i;:::-;13084:96;;13189:52;13234:6;13229:3;13222:4;13215:5;13211:16;13189:52;:::i;:::-;13266:6;13261:3;13257:16;13250:23;;13012:267;12902:377;;;;:::o;13285:366::-;13427:3;13448:67;13512:2;13507:3;13448:67;:::i;:::-;13441:74;;13524:93;13613:3;13524:93;:::i;:::-;13642:2;13637:3;13633:12;13626:19;;13285:366;;;:::o;13657:::-;13799:3;13820:67;13884:2;13879:3;13820:67;:::i;:::-;13813:74;;13896:93;13985:3;13896:93;:::i;:::-;14014:2;14009:3;14005:12;13998:19;;13657:366;;;:::o;14029:::-;14171:3;14192:67;14256:2;14251:3;14192:67;:::i;:::-;14185:74;;14268:93;14357:3;14268:93;:::i;:::-;14386:2;14381:3;14377:12;14370:19;;14029:366;;;:::o;14401:::-;14543:3;14564:67;14628:2;14623:3;14564:67;:::i;:::-;14557:74;;14640:93;14729:3;14640:93;:::i;:::-;14758:2;14753:3;14749:12;14742:19;;14401:366;;;:::o;14773:::-;14915:3;14936:67;15000:2;14995:3;14936:67;:::i;:::-;14929:74;;15012:93;15101:3;15012:93;:::i;:::-;15130:2;15125:3;15121:12;15114:19;;14773:366;;;:::o;15145:::-;15287:3;15308:67;15372:2;15367:3;15308:67;:::i;:::-;15301:74;;15384:93;15473:3;15384:93;:::i;:::-;15502:2;15497:3;15493:12;15486:19;;15145:366;;;:::o;15517:::-;15659:3;15680:67;15744:2;15739:3;15680:67;:::i;:::-;15673:74;;15756:93;15845:3;15756:93;:::i;:::-;15874:2;15869:3;15865:12;15858:19;;15517:366;;;:::o;15889:::-;16031:3;16052:67;16116:2;16111:3;16052:67;:::i;:::-;16045:74;;16128:93;16217:3;16128:93;:::i;:::-;16246:2;16241:3;16237:12;16230:19;;15889:366;;;:::o;16261:::-;16403:3;16424:67;16488:2;16483:3;16424:67;:::i;:::-;16417:74;;16500:93;16589:3;16500:93;:::i;:::-;16618:2;16613:3;16609:12;16602:19;;16261:366;;;:::o;16633:::-;16775:3;16796:67;16860:2;16855:3;16796:67;:::i;:::-;16789:74;;16872:93;16961:3;16872:93;:::i;:::-;16990:2;16985:3;16981:12;16974:19;;16633:366;;;:::o;17005:::-;17147:3;17168:67;17232:2;17227:3;17168:67;:::i;:::-;17161:74;;17244:93;17333:3;17244:93;:::i;:::-;17362:2;17357:3;17353:12;17346:19;;17005:366;;;:::o;17377:::-;17519:3;17540:67;17604:2;17599:3;17540:67;:::i;:::-;17533:74;;17616:93;17705:3;17616:93;:::i;:::-;17734:2;17729:3;17725:12;17718:19;;17377:366;;;:::o;17749:::-;17891:3;17912:67;17976:2;17971:3;17912:67;:::i;:::-;17905:74;;17988:93;18077:3;17988:93;:::i;:::-;18106:2;18101:3;18097:12;18090:19;;17749:366;;;:::o;18121:::-;18263:3;18284:67;18348:2;18343:3;18284:67;:::i;:::-;18277:74;;18360:93;18449:3;18360:93;:::i;:::-;18478:2;18473:3;18469:12;18462:19;;18121:366;;;:::o;18493:::-;18635:3;18656:67;18720:2;18715:3;18656:67;:::i;:::-;18649:74;;18732:93;18821:3;18732:93;:::i;:::-;18850:2;18845:3;18841:12;18834:19;;18493:366;;;:::o;18865:::-;19007:3;19028:67;19092:2;19087:3;19028:67;:::i;:::-;19021:74;;19104:93;19193:3;19104:93;:::i;:::-;19222:2;19217:3;19213:12;19206:19;;18865:366;;;:::o;19237:::-;19379:3;19400:67;19464:2;19459:3;19400:67;:::i;:::-;19393:74;;19476:93;19565:3;19476:93;:::i;:::-;19594:2;19589:3;19585:12;19578:19;;19237:366;;;:::o;19609:::-;19751:3;19772:67;19836:2;19831:3;19772:67;:::i;:::-;19765:74;;19848:93;19937:3;19848:93;:::i;:::-;19966:2;19961:3;19957:12;19950:19;;19609:366;;;:::o;19981:::-;20123:3;20144:67;20208:2;20203:3;20144:67;:::i;:::-;20137:74;;20220:93;20309:3;20220:93;:::i;:::-;20338:2;20333:3;20329:12;20322:19;;19981:366;;;:::o;20353:::-;20495:3;20516:67;20580:2;20575:3;20516:67;:::i;:::-;20509:74;;20592:93;20681:3;20592:93;:::i;:::-;20710:2;20705:3;20701:12;20694:19;;20353:366;;;:::o;20725:::-;20867:3;20888:67;20952:2;20947:3;20888:67;:::i;:::-;20881:74;;20964:93;21053:3;20964:93;:::i;:::-;21082:2;21077:3;21073:12;21066:19;;20725:366;;;:::o;21097:::-;21239:3;21260:67;21324:2;21319:3;21260:67;:::i;:::-;21253:74;;21336:93;21425:3;21336:93;:::i;:::-;21454:2;21449:3;21445:12;21438:19;;21097:366;;;:::o;21469:::-;21611:3;21632:67;21696:2;21691:3;21632:67;:::i;:::-;21625:74;;21708:93;21797:3;21708:93;:::i;:::-;21826:2;21821:3;21817:12;21810:19;;21469:366;;;:::o;21841:::-;21983:3;22004:67;22068:2;22063:3;22004:67;:::i;:::-;21997:74;;22080:93;22169:3;22080:93;:::i;:::-;22198:2;22193:3;22189:12;22182:19;;21841:366;;;:::o;22213:118::-;22300:24;22318:5;22300:24;:::i;:::-;22295:3;22288:37;22213:118;;:::o;22337:435::-;22517:3;22539:95;22630:3;22621:6;22539:95;:::i;:::-;22532:102;;22651:95;22742:3;22733:6;22651:95;:::i;:::-;22644:102;;22763:3;22756:10;;22337:435;;;;;:::o;22778:222::-;22871:4;22909:2;22898:9;22894:18;22886:26;;22922:71;22990:1;22979:9;22975:17;22966:6;22922:71;:::i;:::-;22778:222;;;;:::o;23006:640::-;23201:4;23239:3;23228:9;23224:19;23216:27;;23253:71;23321:1;23310:9;23306:17;23297:6;23253:71;:::i;:::-;23334:72;23402:2;23391:9;23387:18;23378:6;23334:72;:::i;:::-;23416;23484:2;23473:9;23469:18;23460:6;23416:72;:::i;:::-;23535:9;23529:4;23525:20;23520:2;23509:9;23505:18;23498:48;23563:76;23634:4;23625:6;23563:76;:::i;:::-;23555:84;;23006:640;;;;;;;:::o;23652:210::-;23739:4;23777:2;23766:9;23762:18;23754:26;;23790:65;23852:1;23841:9;23837:17;23828:6;23790:65;:::i;:::-;23652:210;;;;:::o;23868:313::-;23981:4;24019:2;24008:9;24004:18;23996:26;;24068:9;24062:4;24058:20;24054:1;24043:9;24039:17;24032:47;24096:78;24169:4;24160:6;24096:78;:::i;:::-;24088:86;;23868:313;;;;:::o;24187:419::-;24353:4;24391:2;24380:9;24376:18;24368:26;;24440:9;24434:4;24430:20;24426:1;24415:9;24411:17;24404:47;24468:131;24594:4;24468:131;:::i;:::-;24460:139;;24187:419;;;:::o;24612:::-;24778:4;24816:2;24805:9;24801:18;24793:26;;24865:9;24859:4;24855:20;24851:1;24840:9;24836:17;24829:47;24893:131;25019:4;24893:131;:::i;:::-;24885:139;;24612:419;;;:::o;25037:::-;25203:4;25241:2;25230:9;25226:18;25218:26;;25290:9;25284:4;25280:20;25276:1;25265:9;25261:17;25254:47;25318:131;25444:4;25318:131;:::i;:::-;25310:139;;25037:419;;;:::o;25462:::-;25628:4;25666:2;25655:9;25651:18;25643:26;;25715:9;25709:4;25705:20;25701:1;25690:9;25686:17;25679:47;25743:131;25869:4;25743:131;:::i;:::-;25735:139;;25462:419;;;:::o;25887:::-;26053:4;26091:2;26080:9;26076:18;26068:26;;26140:9;26134:4;26130:20;26126:1;26115:9;26111:17;26104:47;26168:131;26294:4;26168:131;:::i;:::-;26160:139;;25887:419;;;:::o;26312:::-;26478:4;26516:2;26505:9;26501:18;26493:26;;26565:9;26559:4;26555:20;26551:1;26540:9;26536:17;26529:47;26593:131;26719:4;26593:131;:::i;:::-;26585:139;;26312:419;;;:::o;26737:::-;26903:4;26941:2;26930:9;26926:18;26918:26;;26990:9;26984:4;26980:20;26976:1;26965:9;26961:17;26954:47;27018:131;27144:4;27018:131;:::i;:::-;27010:139;;26737:419;;;:::o;27162:::-;27328:4;27366:2;27355:9;27351:18;27343:26;;27415:9;27409:4;27405:20;27401:1;27390:9;27386:17;27379:47;27443:131;27569:4;27443:131;:::i;:::-;27435:139;;27162:419;;;:::o;27587:::-;27753:4;27791:2;27780:9;27776:18;27768:26;;27840:9;27834:4;27830:20;27826:1;27815:9;27811:17;27804:47;27868:131;27994:4;27868:131;:::i;:::-;27860:139;;27587:419;;;:::o;28012:::-;28178:4;28216:2;28205:9;28201:18;28193:26;;28265:9;28259:4;28255:20;28251:1;28240:9;28236:17;28229:47;28293:131;28419:4;28293:131;:::i;:::-;28285:139;;28012:419;;;:::o;28437:::-;28603:4;28641:2;28630:9;28626:18;28618:26;;28690:9;28684:4;28680:20;28676:1;28665:9;28661:17;28654:47;28718:131;28844:4;28718:131;:::i;:::-;28710:139;;28437:419;;;:::o;28862:::-;29028:4;29066:2;29055:9;29051:18;29043:26;;29115:9;29109:4;29105:20;29101:1;29090:9;29086:17;29079:47;29143:131;29269:4;29143:131;:::i;:::-;29135:139;;28862:419;;;:::o;29287:::-;29453:4;29491:2;29480:9;29476:18;29468:26;;29540:9;29534:4;29530:20;29526:1;29515:9;29511:17;29504:47;29568:131;29694:4;29568:131;:::i;:::-;29560:139;;29287:419;;;:::o;29712:::-;29878:4;29916:2;29905:9;29901:18;29893:26;;29965:9;29959:4;29955:20;29951:1;29940:9;29936:17;29929:47;29993:131;30119:4;29993:131;:::i;:::-;29985:139;;29712:419;;;:::o;30137:::-;30303:4;30341:2;30330:9;30326:18;30318:26;;30390:9;30384:4;30380:20;30376:1;30365:9;30361:17;30354:47;30418:131;30544:4;30418:131;:::i;:::-;30410:139;;30137:419;;;:::o;30562:::-;30728:4;30766:2;30755:9;30751:18;30743:26;;30815:9;30809:4;30805:20;30801:1;30790:9;30786:17;30779:47;30843:131;30969:4;30843:131;:::i;:::-;30835:139;;30562:419;;;:::o;30987:::-;31153:4;31191:2;31180:9;31176:18;31168:26;;31240:9;31234:4;31230:20;31226:1;31215:9;31211:17;31204:47;31268:131;31394:4;31268:131;:::i;:::-;31260:139;;30987:419;;;:::o;31412:::-;31578:4;31616:2;31605:9;31601:18;31593:26;;31665:9;31659:4;31655:20;31651:1;31640:9;31636:17;31629:47;31693:131;31819:4;31693:131;:::i;:::-;31685:139;;31412:419;;;:::o;31837:::-;32003:4;32041:2;32030:9;32026:18;32018:26;;32090:9;32084:4;32080:20;32076:1;32065:9;32061:17;32054:47;32118:131;32244:4;32118:131;:::i;:::-;32110:139;;31837:419;;;:::o;32262:::-;32428:4;32466:2;32455:9;32451:18;32443:26;;32515:9;32509:4;32505:20;32501:1;32490:9;32486:17;32479:47;32543:131;32669:4;32543:131;:::i;:::-;32535:139;;32262:419;;;:::o;32687:::-;32853:4;32891:2;32880:9;32876:18;32868:26;;32940:9;32934:4;32930:20;32926:1;32915:9;32911:17;32904:47;32968:131;33094:4;32968:131;:::i;:::-;32960:139;;32687:419;;;:::o;33112:::-;33278:4;33316:2;33305:9;33301:18;33293:26;;33365:9;33359:4;33355:20;33351:1;33340:9;33336:17;33329:47;33393:131;33519:4;33393:131;:::i;:::-;33385:139;;33112:419;;;:::o;33537:::-;33703:4;33741:2;33730:9;33726:18;33718:26;;33790:9;33784:4;33780:20;33776:1;33765:9;33761:17;33754:47;33818:131;33944:4;33818:131;:::i;:::-;33810:139;;33537:419;;;:::o;33962:::-;34128:4;34166:2;34155:9;34151:18;34143:26;;34215:9;34209:4;34205:20;34201:1;34190:9;34186:17;34179:47;34243:131;34369:4;34243:131;:::i;:::-;34235:139;;33962:419;;;:::o;34387:222::-;34480:4;34518:2;34507:9;34503:18;34495:26;;34531:71;34599:1;34588:9;34584:17;34575:6;34531:71;:::i;:::-;34387:222;;;;:::o;34615:129::-;34649:6;34676:20;;:::i;:::-;34666:30;;34705:33;34733:4;34725:6;34705:33;:::i;:::-;34615:129;;;:::o;34750:75::-;34783:6;34816:2;34810:9;34800:19;;34750:75;:::o;34831:311::-;34908:4;34998:18;34990:6;34987:30;34984:56;;;35020:18;;:::i;:::-;34984:56;35070:4;35062:6;35058:17;35050:25;;35130:4;35124;35120:15;35112:23;;34831:311;;;:::o;35148:321::-;35235:4;35325:18;35317:6;35314:30;35311:56;;;35347:18;;:::i;:::-;35311:56;35397:4;35389:6;35385:17;35377:25;;35457:4;35451;35447:15;35439:23;;35148:321;;;:::o;35475:307::-;35536:4;35626:18;35618:6;35615:30;35612:56;;;35648:18;;:::i;:::-;35612:56;35686:29;35708:6;35686:29;:::i;:::-;35678:37;;35770:4;35764;35760:15;35752:23;;35475:307;;;:::o;35788:308::-;35850:4;35940:18;35932:6;35929:30;35926:56;;;35962:18;;:::i;:::-;35926:56;36000:29;36022:6;36000:29;:::i;:::-;35992:37;;36084:4;36078;36074:15;36066:23;;35788:308;;;:::o;36102:98::-;36153:6;36187:5;36181:12;36171:22;;36102:98;;;:::o;36206:99::-;36258:6;36292:5;36286:12;36276:22;;36206:99;;;:::o;36311:168::-;36394:11;36428:6;36423:3;36416:19;36468:4;36463:3;36459:14;36444:29;;36311:168;;;;:::o;36485:169::-;36569:11;36603:6;36598:3;36591:19;36643:4;36638:3;36634:14;36619:29;;36485:169;;;;:::o;36660:148::-;36762:11;36799:3;36784:18;;36660:148;;;;:::o;36814:305::-;36854:3;36873:20;36891:1;36873:20;:::i;:::-;36868:25;;36907:20;36925:1;36907:20;:::i;:::-;36902:25;;37061:1;36993:66;36989:74;36986:1;36983:81;36980:107;;;37067:18;;:::i;:::-;36980:107;37111:1;37108;37104:9;37097:16;;36814:305;;;;:::o;37125:185::-;37165:1;37182:20;37200:1;37182:20;:::i;:::-;37177:25;;37216:20;37234:1;37216:20;:::i;:::-;37211:25;;37255:1;37245:35;;37260:18;;:::i;:::-;37245:35;37302:1;37299;37295:9;37290:14;;37125:185;;;;:::o;37316:191::-;37356:4;37376:20;37394:1;37376:20;:::i;:::-;37371:25;;37410:20;37428:1;37410:20;:::i;:::-;37405:25;;37449:1;37446;37443:8;37440:34;;;37454:18;;:::i;:::-;37440:34;37499:1;37496;37492:9;37484:17;;37316:191;;;;:::o;37513:96::-;37550:7;37579:24;37597:5;37579:24;:::i;:::-;37568:35;;37513:96;;;:::o;37615:90::-;37649:7;37692:5;37685:13;37678:21;37667:32;;37615:90;;;:::o;37711:149::-;37747:7;37787:66;37780:5;37776:78;37765:89;;37711:149;;;:::o;37866:126::-;37903:7;37943:42;37936:5;37932:54;37921:65;;37866:126;;;:::o;37998:77::-;38035:7;38064:5;38053:16;;37998:77;;;:::o;38081:154::-;38165:6;38160:3;38155;38142:30;38227:1;38218:6;38213:3;38209:16;38202:27;38081:154;;;:::o;38241:307::-;38309:1;38319:113;38333:6;38330:1;38327:13;38319:113;;;38418:1;38413:3;38409:11;38403:18;38399:1;38394:3;38390:11;38383:39;38355:2;38352:1;38348:10;38343:15;;38319:113;;;38450:6;38447:1;38444:13;38441:101;;;38530:1;38521:6;38516:3;38512:16;38505:27;38441:101;38290:258;38241:307;;;:::o;38554:320::-;38598:6;38635:1;38629:4;38625:12;38615:22;;38682:1;38676:4;38672:12;38703:18;38693:81;;38759:4;38751:6;38747:17;38737:27;;38693:81;38821:2;38813:6;38810:14;38790:18;38787:38;38784:84;;;38840:18;;:::i;:::-;38784:84;38605:269;38554:320;;;:::o;38880:281::-;38963:27;38985:4;38963:27;:::i;:::-;38955:6;38951:40;39093:6;39081:10;39078:22;39057:18;39045:10;39042:34;39039:62;39036:88;;;39104:18;;:::i;:::-;39036:88;39144:10;39140:2;39133:22;38923:238;38880:281;;:::o;39167:233::-;39206:3;39229:24;39247:5;39229:24;:::i;:::-;39220:33;;39275:66;39268:5;39265:77;39262:103;;;39345:18;;:::i;:::-;39262:103;39392:1;39385:5;39381:13;39374:20;;39167:233;;;:::o;39406:176::-;39438:1;39455:20;39473:1;39455:20;:::i;:::-;39450:25;;39489:20;39507:1;39489:20;:::i;:::-;39484:25;;39528:1;39518:35;;39533:18;;:::i;:::-;39518:35;39574:1;39571;39567:9;39562:14;;39406:176;;;;:::o;39588:180::-;39636:77;39633:1;39626:88;39733:4;39730:1;39723:15;39757:4;39754:1;39747:15;39774:180;39822:77;39819:1;39812:88;39919:4;39916:1;39909:15;39943:4;39940:1;39933:15;39960:180;40008:77;40005:1;39998:88;40105:4;40102:1;40095:15;40129:4;40126:1;40119:15;40146:180;40194:77;40191:1;40184:88;40291:4;40288:1;40281:15;40315:4;40312:1;40305:15;40332:180;40380:77;40377:1;40370:88;40477:4;40474:1;40467:15;40501:4;40498:1;40491:15;40518:180;40566:77;40563:1;40556:88;40663:4;40660:1;40653:15;40687:4;40684:1;40677:15;40704:117;40813:1;40810;40803:12;40827:117;40936:1;40933;40926:12;40950:117;41059:1;41056;41049:12;41073:117;41182:1;41179;41172:12;41196:117;41305:1;41302;41295:12;41319:102;41360:6;41411:2;41407:7;41402:2;41395:5;41391:14;41387:28;41377:38;;41319:102;;;:::o;41427:230::-;41567:34;41563:1;41555:6;41551:14;41544:58;41636:13;41631:2;41623:6;41619:15;41612:38;41427:230;:::o;41663:237::-;41803:34;41799:1;41791:6;41787:14;41780:58;41872:20;41867:2;41859:6;41855:15;41848:45;41663:237;:::o;41906:225::-;42046:34;42042:1;42034:6;42030:14;42023:58;42115:8;42110:2;42102:6;42098:15;42091:33;41906:225;:::o;42137:224::-;42277:34;42273:1;42265:6;42261:14;42254:58;42346:7;42341:2;42333:6;42329:15;42322:32;42137:224;:::o;42367:178::-;42507:30;42503:1;42495:6;42491:14;42484:54;42367:178;:::o;42551:223::-;42691:34;42687:1;42679:6;42675:14;42668:58;42760:6;42755:2;42747:6;42743:15;42736:31;42551:223;:::o;42780:175::-;42920:27;42916:1;42908:6;42904:14;42897:51;42780:175;:::o;42961:231::-;43101:34;43097:1;43089:6;43085:14;43078:58;43170:14;43165:2;43157:6;43153:15;43146:39;42961:231;:::o;43198:243::-;43338:34;43334:1;43326:6;43322:14;43315:58;43407:26;43402:2;43394:6;43390:15;43383:51;43198:243;:::o;43447:229::-;43587:34;43583:1;43575:6;43571:14;43564:58;43656:12;43651:2;43643:6;43639:15;43632:37;43447:229;:::o;43682:228::-;43822:34;43818:1;43810:6;43806:14;43799:58;43891:11;43886:2;43878:6;43874:15;43867:36;43682:228;:::o;43916:233::-;44056:34;44052:1;44044:6;44040:14;44033:58;44125:16;44120:2;44112:6;44108:15;44101:41;43916:233;:::o;44155:220::-;44295:34;44291:1;44283:6;44279:14;44272:58;44364:3;44359:2;44351:6;44347:15;44340:28;44155:220;:::o;44381:182::-;44521:34;44517:1;44509:6;44505:14;44498:58;44381:182;:::o;44569:236::-;44709:34;44705:1;44697:6;44693:14;44686:58;44778:19;44773:2;44765:6;44761:15;44754:44;44569:236;:::o;44811:231::-;44951:34;44947:1;44939:6;44935:14;44928:58;45020:14;45015:2;45007:6;45003:15;44996:39;44811:231;:::o;45048:174::-;45188:26;45184:1;45176:6;45172:14;45165:50;45048:174;:::o;45228:182::-;45368:34;45364:1;45356:6;45352:14;45345:58;45228:182;:::o;45416:234::-;45556:34;45552:1;45544:6;45540:14;45533:58;45625:17;45620:2;45612:6;45608:15;45601:42;45416:234;:::o;45656:220::-;45796:34;45792:1;45784:6;45780:14;45773:58;45865:3;45860:2;45852:6;45848:15;45841:28;45656:220;:::o;45882:::-;46022:34;46018:1;46010:6;46006:14;45999:58;46091:3;46086:2;46078:6;46074:15;46067:28;45882:220;:::o;46108:236::-;46248:34;46244:1;46236:6;46232:14;46225:58;46317:19;46312:2;46304:6;46300:15;46293:44;46108:236;:::o;46350:231::-;46490:34;46486:1;46478:6;46474:14;46467:58;46559:14;46554:2;46546:6;46542:15;46535:39;46350:231;:::o;46587:235::-;46727:34;46723:1;46715:6;46711:14;46704:58;46796:18;46791:2;46783:6;46779:15;46772:43;46587:235;:::o;46828:122::-;46901:24;46919:5;46901:24;:::i;:::-;46894:5;46891:35;46881:63;;46940:1;46937;46930:12;46881:63;46828:122;:::o;46956:116::-;47026:21;47041:5;47026:21;:::i;:::-;47019:5;47016:32;47006:60;;47062:1;47059;47052:12;47006:60;46956:116;:::o;47078:120::-;47150:23;47167:5;47150:23;:::i;:::-;47143:5;47140:34;47130:62;;47188:1;47185;47178:12;47130:62;47078:120;:::o;47204:122::-;47277:24;47295:5;47277:24;:::i;:::-;47270:5;47267:35;47257:63;;47316:1;47313;47306:12;47257:63;47204:122;:::o

Swarm Source

ipfs://de36557c6e7c11bc4b09bbd53c986bcfd8abf4f4a323d74fe010493ab934a4cd
Loading