Token FantoLanterns

 

Overview ERC-721

Total Supply:
2,107 FOL

Holders:
585 addresses
Balance
0 FOL
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FantoLanterns

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 2021-10-23
*/

/**
 *Submitted for verification at FtmScan.com on 2021-09-12
 */

/**
 *Submitted for verification at FtmScan.com on 2021-09-11
 */

// SPDX-License-Identifier: MIT

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

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]

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]

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]

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]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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]

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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]

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/security/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

pragma solidity ^0.8.7;

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

interface IERC20 {
    function transfer(address _to, uint256 _amount) external returns (bool);

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

// File contracts/HamsterHeroes.sol

pragma solidity ^0.8.0;

contract FantoLanterns is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    IERC2981,
    Pausable,
    Ownable,
    ERC721Burnable
{
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    uint256 public constant maxSupply = 4444;
    uint256 public maxBuy = 10;
    uint256 public price = 55 ether;

    uint256 public presaleStart = 1634392800;
    uint256 public saleStart = 1634400000;
    string public baseURI;
    address private royaltyAddress=0x4E5710a75c1c718Cf7F79688883F94Ea6cA02043;
    address private splitterAddress;

    uint256 public royalty = 500;

    constructor() ERC721("FantoLanterns", "FOL") {
        _pause();
    }

    

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

   

    function reserveLanterns(uint256 amount) public onlyOwner {
        for (uint256 i = 0; i < amount; i++) {
            internalMint(royaltyAddress);
        }
    }

    function buyLanterns(uint256 amount) public payable {
        require(msg.value >= price * amount, "You didn't pay enough");
        require(
            amount <= maxBuy,
            "Amount Exceeds max buy per transaction"
        );
        for (uint256 i = 0; i < amount; i++) {
            internalMint(msg.sender);
        }
    }



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

    function lanternsOwned(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function tokenExists(uint256 _id) external view returns (bool) {
        return (_exists(_id));
    }

    function royaltyInfo(uint256, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (royaltyAddress, (_salePrice * royalty) / 10000);
    }

    
    //dev 
    
    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function setMaxBuy(uint256 newMaxBuy) public onlyOwner {
        maxBuy = newMaxBuy;
    }

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }
    
    
    function setURI(uint256 tokenId, string memory uri) external onlyOwner {
        _setTokenURI(tokenId, uri);
    }

    
    function setRoyalty(uint16 _royalty) external onlyOwner {
        require(_royalty >= 0, "Royalty must be greater than or equal to 0%");
        require(
            _royalty <= 750,
            "Royalty must be greater than or equal to 7.5%"
        );

        royalty = _royalty;
    }
    
    function setRoyaltyAddress(address _royaltyAddress) external onlyOwner {
        royaltyAddress = _royaltyAddress;
    }
    
    function setSplitterAddress(address _address) external onlyOwner {
        splitterAddress = _address;
    }
    
    
    //Overrides
    
     function internalMint(address to) internal {
        require(totalSupply() < maxSupply, "Not enough tokens left!");
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function trickOrTreat(address to) public onlyOwner {
        internalMint(to);
    }
    
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

    function withdraw() public onlyOwner {
        payable(splitterAddress).transfer(address(this).balance);
    }
    
    receive() external payable {
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyLanterns","outputs":[],"stateMutability":"payable","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":"_owner","type":"address"}],"name":"lanternsOwned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserveLanterns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":[],"name":"saleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSplitterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","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":"uint256","name":"_id","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"trickOrTreat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a600d556802fb474098f67c0000600e5563616adae0600f5563616af700601055734e5710a75c1c718cf7f79688883f94ea6ca02043601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101f46014553480156200008e57600080fd5b506040518060400160405280600d81526020017f46616e746f4c616e7465726e73000000000000000000000000000000000000008152506040518060400160405280600381526020017f464f4c0000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000113929190620002e8565b5080600190805190602001906200012c929190620002e8565b5050506000600b60006101000a81548160ff02191690831515021790555060006200015c6200021160201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200020b6200021960201b60201c565b620004e2565b600033905090565b62000229620002d160201b60201c565b156200026c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026390620003ed565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002b86200021160201b60201c565b604051620002c79190620003d0565b60405180910390a1565b6000600b60009054906101000a900460ff16905090565b828054620002f69062000454565b90600052602060002090601f0160209004810192826200031a576000855562000366565b82601f106200033557805160ff191683800117855562000366565b8280016001018555821562000366579182015b828111156200036557825182559160200191906001019062000348565b5b50905062000375919062000379565b5090565b5b80821115620003945760008160009055506001016200037a565b5090565b620003a38162000420565b82525050565b6000620003b86010836200040f565b9150620003c582620004b9565b602082019050919050565b6000602082019050620003e7600083018462000398565b92915050565b600060208201905081810360008301526200040881620003a9565b9050919050565b600082825260208201905092915050565b60006200042d8262000434565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200046d57607f821691505b602082108114156200048457620004836200048a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b61547c80620004f26000396000f3fe60806040526004361061026a5760003560e01c80636c0360eb11610144578063a22cb465116100b6578063d1634a7d1161007a578063d1634a7d14610914578063d5abeb011461093d578063de8801e514610968578063e985e9c514610993578063f2fde38b146109d0578063f53bc835146109f957610271565b8063a22cb4651461081d578063ab0bcc4114610846578063b88d4fde14610871578063c87b56dd1461089a578063cc17e91b146108d757610271565b80638456cb59116101085780638456cb5914610733578063862440e21461074a5780638da5cb5b1461077357806391b7f5ed1461079e57806395d89b41146107c7578063a035b1fe146107f257610271565b80636c0360eb1461066d57806370a082311461069857806370db69d6146106d5578063715018a6146107005780637ce7818c1461071757610271565b80632f745c59116101dd57806342842e0e116101a157806342842e0e1461054d57806342966c68146105765780634f6ccce71461059f57806355f804b3146105dc5780635c975abb146106055780636352211e1461063057610271565b80632f745c591461049057806336e79a5a146104cd5780633ccfd60b146104f65780633f4ba83a1461050d57806340dbdd211461052457610271565b8063081812fc1161022f578063081812fc1461036d578063095ea7b3146103aa57806318160ddd146103d357806323b872dd146103fe57806329ee566c146104275780632a55205a1461045257610271565b8062923f9e1461027657806301ffc9a7146102b357806305042e5c146102f057806306d254da1461031957806306fdde031461034257610271565b3661027157005b600080fd5b34801561028257600080fd5b5061029d60048036038101906102989190613cc7565b610a22565b6040516102aa919061438f565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613bf7565b610a34565b6040516102e7919061438f565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613a34565b610aae565b005b34801561032557600080fd5b50610340600480360381019061033b9190613a34565b610b36565b005b34801561034e57600080fd5b50610357610bf6565b60405161036491906143aa565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613cc7565b610c88565b6040516103a191906142dd565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613bb7565b610d0d565b005b3480156103df57600080fd5b506103e8610e25565b6040516103f5919061474c565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613aa1565b610e32565b005b34801561043357600080fd5b5061043c610e92565b604051610449919061474c565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613d50565b610e98565b604051610487929190614344565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b29190613bb7565b610ee4565b6040516104c4919061474c565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190613c9a565b610f89565b005b34801561050257600080fd5b5061050b6110a4565b005b34801561051957600080fd5b5061052261118b565b005b34801561053057600080fd5b5061054b60048036038101906105469190613a34565b611211565b005b34801561055957600080fd5b50610574600480360381019061056f9190613aa1565b6112d1565b005b34801561058257600080fd5b5061059d60048036038101906105989190613cc7565b6112f1565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190613cc7565b61134d565b6040516105d3919061474c565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613c51565b6113be565b005b34801561061157600080fd5b5061061a611454565b604051610627919061438f565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613cc7565b61146b565b60405161066491906142dd565b60405180910390f35b34801561067957600080fd5b5061068261151d565b60405161068f91906143aa565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613a34565b6115ab565b6040516106cc919061474c565b60405180910390f35b3480156106e157600080fd5b506106ea611663565b6040516106f7919061474c565b60405180910390f35b34801561070c57600080fd5b50610715611669565b005b610731600480360381019061072c9190613cc7565b6117a6565b005b34801561073f57600080fd5b50610748611866565b005b34801561075657600080fd5b50610771600480360381019061076c9190613cf4565b6118ec565b005b34801561077f57600080fd5b50610788611976565b60405161079591906142dd565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613cc7565b6119a0565b005b3480156107d357600080fd5b506107dc611a26565b6040516107e991906143aa565b60405180910390f35b3480156107fe57600080fd5b50610807611ab8565b604051610814919061474c565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190613b77565b611abe565b005b34801561085257600080fd5b5061085b611c3f565b604051610868919061474c565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613af4565b611c45565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613cc7565b611ca7565b6040516108ce91906143aa565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190613a34565b611cb9565b60405161090b919061436d565b60405180910390f35b34801561092057600080fd5b5061093b60048036038101906109369190613cc7565b611dc3565b005b34801561094957600080fd5b50610952611e8c565b60405161095f919061474c565b60405180910390f35b34801561097457600080fd5b5061097d611e92565b60405161098a919061474c565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190613a61565b611e98565b6040516109c7919061438f565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613a34565b611f2c565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190613cc7565b6120d8565b005b6000610a2d8261215e565b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa75750610aa6826121ca565b5b9050919050565b610ab6612244565b73ffffffffffffffffffffffffffffffffffffffff16610ad4611976565b73ffffffffffffffffffffffffffffffffffffffff1614610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b219061464c565b60405180910390fd5b610b338161224c565b50565b610b3e612244565b73ffffffffffffffffffffffffffffffffffffffff16610b5c611976565b73ffffffffffffffffffffffffffffffffffffffff1614610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061464c565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610c0590614a43565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3190614a43565b8015610c7e5780601f10610c5357610100808354040283529160200191610c7e565b820191906000526020600020905b815481529060010190602001808311610c6157829003601f168201915b5050505050905090565b6000610c938261215e565b610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc99061462c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d188261146b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d80906146ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da8612244565b73ffffffffffffffffffffffffffffffffffffffff161480610dd75750610dd681610dd1612244565b611e98565b5b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d9061454c565b60405180910390fd5b610e2083836122b7565b505050565b6000600880549050905090565b610e43610e3d612244565b82612370565b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e79906146ec565b60405180910390fd5b610e8d83838361244e565b505050565b60145481565b600080601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060145485610ecf91906148f1565b610ed991906148c0565b915091509250929050565b6000610eef836115ab565b8210610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f279061440c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f91612244565b73ffffffffffffffffffffffffffffffffffffffff16610faf611976565b73ffffffffffffffffffffffffffffffffffffffff1614611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc9061464c565b60405180910390fd5b60008161ffff16101561104d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110449061456c565b60405180910390fd5b6102ee8161ffff161115611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d906146cc565b60405180910390fd5b8061ffff1660148190555050565b6110ac612244565b73ffffffffffffffffffffffffffffffffffffffff166110ca611976565b73ffffffffffffffffffffffffffffffffffffffff1614611120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111179061464c565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611188573d6000803e3d6000fd5b50565b611193612244565b73ffffffffffffffffffffffffffffffffffffffff166111b1611976565b73ffffffffffffffffffffffffffffffffffffffff1614611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe9061464c565b60405180910390fd5b61120f6126aa565b565b611219612244565b73ffffffffffffffffffffffffffffffffffffffff16611237611976565b73ffffffffffffffffffffffffffffffffffffffff161461128d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112849061464c565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112ec83838360405180602001604052806000815250611c45565b505050565b6113026112fc612244565b82612370565b611341576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113389061472c565b60405180910390fd5b61134a8161274c565b50565b6000611357610e25565b8210611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f9061470c565b60405180910390fd5b600882815481106113ac576113ab614bdc565b5b90600052602060002001549050919050565b6113c6612244565b73ffffffffffffffffffffffffffffffffffffffff166113e4611976565b73ffffffffffffffffffffffffffffffffffffffff161461143a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114319061464c565b60405180910390fd5b80601190805190602001906114509291906137f3565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906145ac565b60405180910390fd5b80915050919050565b6011805461152a90614a43565b80601f016020809104026020016040519081016040528092919081815260200182805461155690614a43565b80156115a35780601f10611578576101008083540402835291602001916115a3565b820191906000526020600020905b81548152906001019060200180831161158657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116139061458c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b611671612244565b73ffffffffffffffffffffffffffffffffffffffff1661168f611976565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc9061464c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b80600e546117b491906148f1565b3410156117f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ed906144ac565b60405180910390fd5b600d5481111561183b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611832906143cc565b60405180910390fd5b60005b818110156118625761184f3361224c565b808061185a90614aa6565b91505061183e565b5050565b61186e612244565b73ffffffffffffffffffffffffffffffffffffffff1661188c611976565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d99061464c565b60405180910390fd5b6118ea612758565b565b6118f4612244565b73ffffffffffffffffffffffffffffffffffffffff16611912611976565b73ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061464c565b60405180910390fd5b61197282826127fb565b5050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119a8612244565b73ffffffffffffffffffffffffffffffffffffffff166119c6611976565b73ffffffffffffffffffffffffffffffffffffffff1614611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a139061464c565b60405180910390fd5b80600e8190555050565b606060018054611a3590614a43565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6190614a43565b8015611aae5780601f10611a8357610100808354040283529160200191611aae565b820191906000526020600020905b815481529060010190602001808311611a9157829003601f168201915b5050505050905090565b600e5481565b611ac6612244565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b906144ec565b60405180910390fd5b8060056000611b41612244565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bee612244565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c33919061438f565b60405180910390a35050565b60105481565b611c56611c50612244565b83612370565b611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c906146ec565b60405180910390fd5b611ca18484848461286f565b50505050565b6060611cb2826128cb565b9050919050565b60606000611cc6836115ab565b90506000811415611d2357600067ffffffffffffffff811115611cec57611ceb614c0b565b5b604051908082528060200260200182016040528015611d1a5781602001602082028036833780820191505090505b50915050611dbe565b60008167ffffffffffffffff811115611d3f57611d3e614c0b565b5b604051908082528060200260200182016040528015611d6d5781602001602082028036833780820191505090505b50905060005b82811015611db757611d858582610ee4565b828281518110611d9857611d97614bdc565b5b6020026020010181815250508080611daf90614aa6565b915050611d73565b8193505050505b919050565b611dcb612244565b73ffffffffffffffffffffffffffffffffffffffff16611de9611976565b73ffffffffffffffffffffffffffffffffffffffff1614611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e369061464c565b60405180910390fd5b60005b81811015611e8857611e75601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661224c565b8080611e8090614aa6565b915050611e42565b5050565b61115c81565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f34612244565b73ffffffffffffffffffffffffffffffffffffffff16611f52611976565b73ffffffffffffffffffffffffffffffffffffffff1614611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f9061464c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200f9061444c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6120e0612244565b73ffffffffffffffffffffffffffffffffffffffff166120fe611976565b73ffffffffffffffffffffffffffffffffffffffff1614612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b9061464c565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061223d575061223c82612a1d565b5b9050919050565b600033905090565b61115c612257610e25565b10612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e9061446c565b60405180910390fd5b6122aa816122a5600c612aff565b612b0d565b6122b4600c612b2b565b50565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661232a8361146b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061237b8261215e565b6123ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b19061450c565b60405180910390fd5b60006123c58361146b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061243457508373ffffffffffffffffffffffffffffffffffffffff1661241c84610c88565b73ffffffffffffffffffffffffffffffffffffffff16145b8061244557506124448185611e98565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661246e8261146b565b73ffffffffffffffffffffffffffffffffffffffff16146124c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bb9061466c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252b906144cc565b60405180910390fd5b61253f838383612b41565b61254a6000826122b7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259a919061494b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125f1919061486a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126b2611454565b6126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e8906143ec565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612735612244565b60405161274291906142dd565b60405180910390a1565b61275581612b99565b50565b612760611454565b156127a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127979061452c565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127e4612244565b6040516127f191906142dd565b60405180910390a1565b6128048261215e565b612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283a906145cc565b60405180910390fd5b80600a6000848152602001908152602001600020908051906020019061286a9291906137f3565b505050565b61287a84848461244e565b61288684848484612bec565b6128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc9061442c565b60405180910390fd5b50505050565b60606128d68261215e565b612915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290c9061460c565b60405180910390fd5b6000600a6000848152602001908152602001600020805461293590614a43565b80601f016020809104026020016040519081016040528092919081815260200182805461296190614a43565b80156129ae5780601f10612983576101008083540402835291602001916129ae565b820191906000526020600020905b81548152906001019060200180831161299157829003601f168201915b5050505050905060006129bf612d83565b90506000815114156129d5578192505050612a18565b600082511115612a0a5780826040516020016129f29291906142b9565b60405160208183030381529060405292505050612a18565b612a1384612e15565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612af85750612af782612ebc565b5b9050919050565b600081600001549050919050565b612b27828260405180602001604052806000815250612f26565b5050565b6001816000016000828254019250508190555050565b612b49611454565b15612b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b809061452c565b60405180910390fd5b612b94838383612f81565b505050565b612ba281613095565b6000600a60008381526020019081526020016000208054612bc290614a43565b905014612be957600a60008281526020019081526020016000206000612be89190613879565b5b50565b6000612c0d8473ffffffffffffffffffffffffffffffffffffffff166131a6565b15612d76578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c36612244565b8786866040518563ffffffff1660e01b8152600401612c5894939291906142f8565b602060405180830381600087803b158015612c7257600080fd5b505af1925050508015612ca357506040513d601f19601f82011682018060405250810190612ca09190613c24565b60015b612d26573d8060008114612cd3576040519150601f19603f3d011682016040523d82523d6000602084013e612cd8565b606091505b50600081511415612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d159061442c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d7b565b600190505b949350505050565b606060118054612d9290614a43565b80601f0160208091040260200160405190810160405280929190818152602001828054612dbe90614a43565b8015612e0b5780601f10612de057610100808354040283529160200191612e0b565b820191906000526020600020905b815481529060010190602001808311612dee57829003601f168201915b5050505050905090565b6060612e208261215e565b612e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e569061468c565b60405180910390fd5b6000612e69612d83565b90506000815111612e895760405180602001604052806000815250612eb4565b80612e93846131b9565b604051602001612ea49291906142b9565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f30838361331a565b612f3d6000848484612bec565b612f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f739061442c565b60405180910390fd5b505050565b612f8c8383836134e8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fcf57612fca816134ed565b61300e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461300d5761300c8382613536565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130515761304c816136a3565b613090565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461308f5761308e8282613774565b5b5b505050565b60006130a08261146b565b90506130ae81600084612b41565b6130b96000836122b7565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613109919061494b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415613201576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613315565b600082905060005b6000821461323357808061321c90614aa6565b915050600a8261322c91906148c0565b9150613209565b60008167ffffffffffffffff81111561324f5761324e614c0b565b5b6040519080825280601f01601f1916602001820160405280156132815781602001600182028036833780820191505090505b5090505b6000851461330e5760018261329a919061494b565b9150600a856132a99190614aef565b60306132b5919061486a565b60f81b8183815181106132cb576132ca614bdc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561330791906148c0565b9450613285565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613381906145ec565b60405180910390fd5b6133938161215e565b156133d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ca9061448c565b60405180910390fd5b6133df60008383612b41565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461342f919061486a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613543846115ab565b61354d919061494b565b9050600060076000848152602001908152602001600020549050818114613632576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136b7919061494b565b90506000600960008481526020019081526020016000205490506000600883815481106136e7576136e6614bdc565b5b90600052602060002001549050806008838154811061370957613708614bdc565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061375857613757614bad565b5b6001900381819060005260206000200160009055905550505050565b600061377f836115ab565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546137ff90614a43565b90600052602060002090601f0160209004810192826138215760008555613868565b82601f1061383a57805160ff1916838001178555613868565b82800160010185558215613868579182015b8281111561386757825182559160200191906001019061384c565b5b50905061387591906138b9565b5090565b50805461388590614a43565b6000825580601f1061389757506138b6565b601f0160209004906000526020600020908101906138b591906138b9565b5b50565b5b808211156138d25760008160009055506001016138ba565b5090565b60006138e96138e48461478c565b614767565b90508281526020810184848401111561390557613904614c3f565b5b613910848285614a01565b509392505050565b600061392b613926846147bd565b614767565b90508281526020810184848401111561394757613946614c3f565b5b613952848285614a01565b509392505050565b600081359050613969816153d3565b92915050565b60008135905061397e816153ea565b92915050565b60008135905061399381615401565b92915050565b6000815190506139a881615401565b92915050565b600082601f8301126139c3576139c2614c3a565b5b81356139d38482602086016138d6565b91505092915050565b600082601f8301126139f1576139f0614c3a565b5b8135613a01848260208601613918565b91505092915050565b600081359050613a1981615418565b92915050565b600081359050613a2e8161542f565b92915050565b600060208284031215613a4a57613a49614c49565b5b6000613a588482850161395a565b91505092915050565b60008060408385031215613a7857613a77614c49565b5b6000613a868582860161395a565b9250506020613a978582860161395a565b9150509250929050565b600080600060608486031215613aba57613ab9614c49565b5b6000613ac88682870161395a565b9350506020613ad98682870161395a565b9250506040613aea86828701613a1f565b9150509250925092565b60008060008060808587031215613b0e57613b0d614c49565b5b6000613b1c8782880161395a565b9450506020613b2d8782880161395a565b9350506040613b3e87828801613a1f565b925050606085013567ffffffffffffffff811115613b5f57613b5e614c44565b5b613b6b878288016139ae565b91505092959194509250565b60008060408385031215613b8e57613b8d614c49565b5b6000613b9c8582860161395a565b9250506020613bad8582860161396f565b9150509250929050565b60008060408385031215613bce57613bcd614c49565b5b6000613bdc8582860161395a565b9250506020613bed85828601613a1f565b9150509250929050565b600060208284031215613c0d57613c0c614c49565b5b6000613c1b84828501613984565b91505092915050565b600060208284031215613c3a57613c39614c49565b5b6000613c4884828501613999565b91505092915050565b600060208284031215613c6757613c66614c49565b5b600082013567ffffffffffffffff811115613c8557613c84614c44565b5b613c91848285016139dc565b91505092915050565b600060208284031215613cb057613caf614c49565b5b6000613cbe84828501613a0a565b91505092915050565b600060208284031215613cdd57613cdc614c49565b5b6000613ceb84828501613a1f565b91505092915050565b60008060408385031215613d0b57613d0a614c49565b5b6000613d1985828601613a1f565b925050602083013567ffffffffffffffff811115613d3a57613d39614c44565b5b613d46858286016139dc565b9150509250929050565b60008060408385031215613d6757613d66614c49565b5b6000613d7585828601613a1f565b9250506020613d8685828601613a1f565b9150509250929050565b6000613d9c838361429b565b60208301905092915050565b613db18161497f565b82525050565b6000613dc2826147fe565b613dcc818561482c565b9350613dd7836147ee565b8060005b83811015613e08578151613def8882613d90565b9750613dfa8361481f565b925050600181019050613ddb565b5085935050505092915050565b613e1e81614991565b82525050565b6000613e2f82614809565b613e39818561483d565b9350613e49818560208601614a10565b613e5281614c4e565b840191505092915050565b6000613e6882614814565b613e72818561484e565b9350613e82818560208601614a10565b613e8b81614c4e565b840191505092915050565b6000613ea182614814565b613eab818561485f565b9350613ebb818560208601614a10565b80840191505092915050565b6000613ed460268361484e565b9150613edf82614c5f565b604082019050919050565b6000613ef760148361484e565b9150613f0282614cae565b602082019050919050565b6000613f1a602b8361484e565b9150613f2582614cd7565b604082019050919050565b6000613f3d60328361484e565b9150613f4882614d26565b604082019050919050565b6000613f6060268361484e565b9150613f6b82614d75565b604082019050919050565b6000613f8360178361484e565b9150613f8e82614dc4565b602082019050919050565b6000613fa6601c8361484e565b9150613fb182614ded565b602082019050919050565b6000613fc960158361484e565b9150613fd482614e16565b602082019050919050565b6000613fec60248361484e565b9150613ff782614e3f565b604082019050919050565b600061400f60198361484e565b915061401a82614e8e565b602082019050919050565b6000614032602c8361484e565b915061403d82614eb7565b604082019050919050565b600061405560108361484e565b915061406082614f06565b602082019050919050565b600061407860388361484e565b915061408382614f2f565b604082019050919050565b600061409b602b8361484e565b91506140a682614f7e565b604082019050919050565b60006140be602a8361484e565b91506140c982614fcd565b604082019050919050565b60006140e160298361484e565b91506140ec8261501c565b604082019050919050565b6000614104602e8361484e565b915061410f8261506b565b604082019050919050565b600061412760208361484e565b9150614132826150ba565b602082019050919050565b600061414a60318361484e565b9150614155826150e3565b604082019050919050565b600061416d602c8361484e565b915061417882615132565b604082019050919050565b600061419060208361484e565b915061419b82615181565b602082019050919050565b60006141b360298361484e565b91506141be826151aa565b604082019050919050565b60006141d6602f8361484e565b91506141e1826151f9565b604082019050919050565b60006141f960218361484e565b915061420482615248565b604082019050919050565b600061421c602d8361484e565b915061422782615297565b604082019050919050565b600061423f60318361484e565b915061424a826152e6565b604082019050919050565b6000614262602c8361484e565b915061426d82615335565b604082019050919050565b600061428560308361484e565b915061429082615384565b604082019050919050565b6142a4816149f7565b82525050565b6142b3816149f7565b82525050565b60006142c58285613e96565b91506142d18284613e96565b91508190509392505050565b60006020820190506142f26000830184613da8565b92915050565b600060808201905061430d6000830187613da8565b61431a6020830186613da8565b61432760408301856142aa565b81810360608301526143398184613e24565b905095945050505050565b60006040820190506143596000830185613da8565b61436660208301846142aa565b9392505050565b600060208201905081810360008301526143878184613db7565b905092915050565b60006020820190506143a46000830184613e15565b92915050565b600060208201905081810360008301526143c48184613e5d565b905092915050565b600060208201905081810360008301526143e581613ec7565b9050919050565b6000602082019050818103600083015261440581613eea565b9050919050565b6000602082019050818103600083015261442581613f0d565b9050919050565b6000602082019050818103600083015261444581613f30565b9050919050565b6000602082019050818103600083015261446581613f53565b9050919050565b6000602082019050818103600083015261448581613f76565b9050919050565b600060208201905081810360008301526144a581613f99565b9050919050565b600060208201905081810360008301526144c581613fbc565b9050919050565b600060208201905081810360008301526144e581613fdf565b9050919050565b6000602082019050818103600083015261450581614002565b9050919050565b6000602082019050818103600083015261452581614025565b9050919050565b6000602082019050818103600083015261454581614048565b9050919050565b600060208201905081810360008301526145658161406b565b9050919050565b600060208201905081810360008301526145858161408e565b9050919050565b600060208201905081810360008301526145a5816140b1565b9050919050565b600060208201905081810360008301526145c5816140d4565b9050919050565b600060208201905081810360008301526145e5816140f7565b9050919050565b600060208201905081810360008301526146058161411a565b9050919050565b600060208201905081810360008301526146258161413d565b9050919050565b6000602082019050818103600083015261464581614160565b9050919050565b6000602082019050818103600083015261466581614183565b9050919050565b60006020820190508181036000830152614685816141a6565b9050919050565b600060208201905081810360008301526146a5816141c9565b9050919050565b600060208201905081810360008301526146c5816141ec565b9050919050565b600060208201905081810360008301526146e58161420f565b9050919050565b6000602082019050818103600083015261470581614232565b9050919050565b6000602082019050818103600083015261472581614255565b9050919050565b6000602082019050818103600083015261474581614278565b9050919050565b600060208201905061476160008301846142aa565b92915050565b6000614771614782565b905061477d8282614a75565b919050565b6000604051905090565b600067ffffffffffffffff8211156147a7576147a6614c0b565b5b6147b082614c4e565b9050602081019050919050565b600067ffffffffffffffff8211156147d8576147d7614c0b565b5b6147e182614c4e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614875826149f7565b9150614880836149f7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148b5576148b4614b20565b5b828201905092915050565b60006148cb826149f7565b91506148d6836149f7565b9250826148e6576148e5614b4f565b5b828204905092915050565b60006148fc826149f7565b9150614907836149f7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149405761493f614b20565b5b828202905092915050565b6000614956826149f7565b9150614961836149f7565b92508282101561497457614973614b20565b5b828203905092915050565b600061498a826149d7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a2e578082015181840152602081019050614a13565b83811115614a3d576000848401525b50505050565b60006002820490506001821680614a5b57607f821691505b60208210811415614a6f57614a6e614b7e565b5b50919050565b614a7e82614c4e565b810181811067ffffffffffffffff82111715614a9d57614a9c614c0b565b5b80604052505050565b6000614ab1826149f7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ae457614ae3614b20565b5b600182019050919050565b6000614afa826149f7565b9150614b05836149f7565b925082614b1557614b14614b4f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416d6f756e742045786365656473206d61782062757920706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667421000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f75206469646e27742070617920656e6f7567680000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f203025000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f20372e352500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6153dc8161497f565b81146153e757600080fd5b50565b6153f381614991565b81146153fe57600080fd5b50565b61540a8161499d565b811461541557600080fd5b50565b615421816149c9565b811461542c57600080fd5b50565b615438816149f7565b811461544357600080fd5b5056fea26469706673582212203d5bec5c35415ed3ac07b7f4a32700cbd6ed4e5c8e3393ba0b354354fa913ea564736f6c63430008070033

Deployed ByteCode Sourcemap

53054:4864:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55182:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57069:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56965:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56459:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22981:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24563:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24086:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37647:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25622:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53663:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55293:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37228:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56151:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57756:112;;;;;;;;;;;;;:::i;:::-;;55632:65;;;;;;;;;;;;;:::i;:::-;;56593:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26069:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50404:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37837:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55805:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46401:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22588:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53515:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22231:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53351:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49358:148;;;;;;;;;;;;;:::i;:::-;;54079:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55563:61;;;;;;;;;;;;;:::i;:::-;;56021:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48707:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55915:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23150:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53384:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24943:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53471:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26325:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54436:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54640:534;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53903:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53304:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53424;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25341:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49661:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55705:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55182:103;55239:4;55264:12;55272:3;55264:7;:12::i;:::-;55256:21;;55182:103;;;:::o;57069:292::-;57217:4;57274:26;57259:41;;;:11;:41;;;;:94;;;;57317:36;57341:11;57317:23;:36::i;:::-;57259:94;57239:114;;57069:292;;;:::o;56965:86::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57027:16:::1;57040:2;57027:12;:16::i;:::-;56965:86:::0;:::o;56459:122::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56558:15:::1;56541:14;;:32;;;;;;;;;;;;;;;;;;56459:122:::0;:::o;22981:100::-;23035:13;23068:5;23061:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22981:100;:::o;24563:308::-;24684:7;24731:16;24739:7;24731;:16::i;:::-;24709:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24839:15;:24;24855:7;24839:24;;;;;;;;;;;;;;;;;;;;;24832:31;;24563:308;;;:::o;24086:411::-;24167:13;24183:23;24198:7;24183:14;:23::i;:::-;24167:39;;24231:5;24225:11;;:2;:11;;;;24217:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24325:5;24309:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24334:37;24351:5;24358:12;:10;:12::i;:::-;24334:16;:37::i;:::-;24309:62;24287:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24468:21;24477:2;24481:7;24468:8;:21::i;:::-;24156:341;24086:411;;:::o;37647:113::-;37708:7;37735:10;:17;;;;37728:24;;37647:113;:::o;25622:376::-;25831:41;25850:12;:10;:12::i;:::-;25864:7;25831:18;:41::i;:::-;25809:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25962:28;25972:4;25978:2;25982:7;25962:9;:28::i;:::-;25622:376;;;:::o;53663:28::-;;;;:::o;55293:238::-;55411:16;55429:21;55476:14;;;;;;;;;;;55517:5;55506:7;;55493:10;:20;;;;:::i;:::-;55492:30;;;;:::i;:::-;55468:55;;;;55293:238;;;;;:::o;37228:343::-;37370:7;37425:23;37442:5;37425:16;:23::i;:::-;37417:5;:31;37395:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37537:12;:19;37550:5;37537:19;;;;;;;;;;;;;;;:26;37557:5;37537:26;;;;;;;;;;;;37530:33;;37228:343;;;;:::o;56151:296::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56238:1:::1;56226:8;:13;;;;56218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;56332:3;56320:8;:15;;;;56298:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;56431:8;56421:18;;:7;:18;;;;56151:296:::0;:::o;57756:112::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57812:15:::1;;;;;;;;;;;57804:33;;:56;57838:21;57804:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57756:112::o:0;55632:65::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55679:10:::1;:8;:10::i;:::-;55632:65::o:0;56593:110::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56687:8:::1;56669:15;;:26;;;;;;;;;;;;;;;;;;56593:110:::0;:::o;26069:185::-;26207:39;26224:4;26230:2;26234:7;26207:39;;;;;;;;;;;;:16;:39::i;:::-;26069:185;;;:::o;50404:282::-;50536:41;50555:12;:10;:12::i;:::-;50569:7;50536:18;:41::i;:::-;50514:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;50664:14;50670:7;50664:5;:14::i;:::-;50404:282;:::o;37837:320::-;37957:7;38012:30;:28;:30::i;:::-;38004:5;:38;37982:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;38132:10;38143:5;38132:17;;;;;;;;:::i;:::-;;;;;;;;;;38125:24;;37837:320;;;:::o;55805:102::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55889:10:::1;55879:7;:20;;;;;;;;;;;;:::i;:::-;;55805:102:::0;:::o;46401:86::-;46448:4;46472:7;;;;;;;;;;;46465:14;;46401:86;:::o;22588:326::-;22705:7;22730:13;22746:7;:16;22754:7;22746:16;;;;;;;;;;;;;;;;;;;;;22730:32;;22812:1;22795:19;;:5;:19;;;;22773:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22901:5;22894:12;;;22588:326;;;:::o;53515:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22231:295::-;22348:7;22412:1;22395:19;;:5;:19;;;;22373:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22502:9;:16;22512:5;22502:16;;;;;;;;;;;;;;;;22495:23;;22231:295;;;:::o;53351:26::-;;;;:::o;49358:148::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49465:1:::1;49428:40;;49449:6;;;;;;;;;;;49428:40;;;;;;;;;;;;49496:1;49479:6;;:19;;;;;;;;;;;;;;;;;;49358:148::o:0;54079:345::-;54171:6;54163:5;;:14;;;;:::i;:::-;54150:9;:27;;54142:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54246:6;;54236;:16;;54214:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;54334:9;54329:88;54353:6;54349:1;:10;54329:88;;;54381:24;54394:10;54381:12;:24::i;:::-;54361:3;;;;;:::i;:::-;;;;54329:88;;;;54079:345;:::o;55563:61::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55608:8:::1;:6;:8::i;:::-;55563:61::o:0;56021:116::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56103:26:::1;56116:7;56125:3;56103:12;:26::i;:::-;56021:116:::0;;:::o;48707:87::-;48753:7;48780:6;;;;;;;;;;;48773:13;;48707:87;:::o;55915:88::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55987:8:::1;55979:5;:16;;;;55915:88:::0;:::o;23150:104::-;23206:13;23239:7;23232:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23150:104;:::o;53384:31::-;;;;:::o;24943:327::-;25090:12;:10;:12::i;:::-;25078:24;;:8;:24;;;;25070:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25190:8;25145:18;:32;25164:12;:10;:12::i;:::-;25145:32;;;;;;;;;;;;;;;:42;25178:8;25145:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25243:8;25214:48;;25229:12;:10;:12::i;:::-;25214:48;;;25253:8;25214:48;;;;;;:::i;:::-;;;;;;;;24943:327;;:::o;53471:37::-;;;;:::o;26325:365::-;26514:41;26533:12;:10;:12::i;:::-;26547:7;26514:18;:41::i;:::-;26492:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26643:39;26657:4;26663:2;26667:7;26676:5;26643:13;:39::i;:::-;26325:365;;;;:::o;54436:196::-;54563:13;54601:23;54616:7;54601:14;:23::i;:::-;54594:30;;54436:196;;;:::o;54640:534::-;54729:16;54763:18;54784:17;54794:6;54784:9;:17::i;:::-;54763:38;;54830:1;54816:10;:15;54812:355;;;54869:1;54855:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54848:23;;;;;54812:355;54904:23;54944:10;54930:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54904:51;;54970:13;54998:130;55022:10;55014:5;:18;54998:130;;;55078:34;55098:6;55106:5;55078:19;:34::i;:::-;55062:6;55069:5;55062:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;55034:7;;;;;:::i;:::-;;;;54998:130;;;55149:6;55142:13;;;;;54640:534;;;;:::o;53903:168::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53977:9:::1;53972:92;53996:6;53992:1;:10;53972:92;;;54024:28;54037:14;;;;;;;;;;;54024:12;:28::i;:::-;54004:3;;;;;:::i;:::-;;;;53972:92;;;;53903:168:::0;:::o;53304:40::-;53340:4;53304:40;:::o;53424:::-;;;;:::o;25341:214::-;25483:4;25512:18;:25;25531:5;25512:25;;;;;;;;;;;;;;;:35;25538:8;25512:35;;;;;;;;;;;;;;;;;;;;;;;;;25505:42;;25341:214;;;;:::o;49661:281::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49784:1:::1;49764:22;;:8;:22;;;;49742:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49897:8;49868:38;;49889:6;;;;;;;;;;;49868:38;;;;;;;;;;;;49926:8;49917:6;;:17;;;;;;;;;;;;;;;;;;49661:281:::0;:::o;55705:92::-;48938:12;:10;:12::i;:::-;48927:23;;:7;:5;:7::i;:::-;:23;;;48919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55780:9:::1;55771:6;:18;;;;55705:92:::0;:::o;28237:127::-;28302:4;28354:1;28326:30;;:7;:16;28334:7;28326:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28319:37;;28237:127;;;:::o;36844:300::-;36991:4;37048:35;37033:50;;;:11;:50;;;;:103;;;;37100:36;37124:11;37100:23;:36::i;:::-;37033:103;37013:123;;36844:300;;;:::o;17036:98::-;17089:7;17116:10;17109:17;;17036:98;:::o;56745:212::-;53340:4;56807:13;:11;:13::i;:::-;:25;56799:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56871:40;56881:2;56885:25;:15;:23;:25::i;:::-;56871:9;:40::i;:::-;56922:27;:15;:25;:27::i;:::-;56745:212;:::o;32360:174::-;32462:2;32435:15;:24;32451:7;32435:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32518:7;32514:2;32480:46;;32489:23;32504:7;32489:14;:23::i;:::-;32480:46;;;;;;;;;;;;32360:174;;:::o;28531:452::-;28660:4;28704:16;28712:7;28704;:16::i;:::-;28682:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28803:13;28819:23;28834:7;28819:14;:23::i;:::-;28803:39;;28872:5;28861:16;;:7;:16;;;:64;;;;28918:7;28894:31;;:20;28906:7;28894:11;:20::i;:::-;:31;;;28861:64;:113;;;;28942:32;28959:5;28966:7;28942:16;:32::i;:::-;28861:113;28853:122;;;28531:452;;;;:::o;31627:615::-;31800:4;31773:31;;:23;31788:7;31773:14;:23::i;:::-;:31;;;31751:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;31906:1;31892:16;;:2;:16;;;;31884:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31962:39;31983:4;31989:2;31993:7;31962:20;:39::i;:::-;32066:29;32083:1;32087:7;32066:8;:29::i;:::-;32127:1;32108:9;:15;32118:4;32108:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32156:1;32139:9;:13;32149:2;32139:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32187:2;32168:7;:16;32176:7;32168:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32226:7;32222:2;32207:27;;32216:4;32207:27;;;;;;;;;;;;31627:615;;;:::o;47460:120::-;47004:8;:6;:8::i;:::-;46996:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;47529:5:::1;47519:7;;:15;;;;;;;;;;;;;;;;;;47550:22;47559:12;:10;:12::i;:::-;47550:22;;;;;;:::i;:::-;;;;;;;;47460:120::o:0;57610:138::-;57720:20;57732:7;57720:11;:20::i;:::-;57610:138;:::o;47201:118::-;46727:8;:6;:8::i;:::-;46726:9;46718:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;47271:4:::1;47261:7;;:14;;;;;;;;;;;;;;;;;;47291:20;47298:12;:10;:12::i;:::-;47291:20;;;;;;:::i;:::-;;;;;;;;47201:118::o:0;44608:277::-;44745:16;44753:7;44745;:16::i;:::-;44723:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44868:9;44846:10;:19;44857:7;44846:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;44608:277;;:::o;27572:352::-;27729:28;27739:4;27745:2;27749:7;27729:9;:28::i;:::-;27790:48;27813:4;27819:2;27823:7;27832:5;27790:22;:48::i;:::-;27768:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27572:352;;;;:::o;43686:766::-;43804:13;43857:16;43865:7;43857;:16::i;:::-;43835:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;43963:23;43989:10;:19;44000:7;43989:19;;;;;;;;;;;43963:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44019:18;44040:10;:8;:10::i;:::-;44019:31;;44148:1;44132:4;44126:18;:23;44122:72;;;44173:9;44166:16;;;;;;44122:72;44324:1;44304:9;44298:23;:27;44294:108;;;44373:4;44379:9;44356:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44342:48;;;;;;44294:108;44421:23;44436:7;44421:14;:23::i;:::-;44414:30;;;;43686:766;;;;:::o;21812:355::-;21959:4;22016:25;22001:40;;;:11;:40;;;;:105;;;;22073:33;22058:48;;;:11;:48;;;;22001:105;:158;;;;22123:36;22147:11;22123:23;:36::i;:::-;22001:158;21981:178;;21812:355;;;:::o;51512:114::-;51577:7;51604;:14;;;51597:21;;51512:114;;;:::o;29325:110::-;29401:26;29411:2;29415:7;29401:26;;;;;;;;;;;;:9;:26::i;:::-;29325:110;;:::o;51634:127::-;51741:1;51723:7;:14;;;:19;;;;;;;;;;;51634:127;:::o;57373:229::-;46727:8;:6;:8::i;:::-;46726:9;46718:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57549:45:::1;57576:4;57582:2;57586:7;57549:26;:45::i;:::-;57373:229:::0;;;:::o;45114:206::-;45183:20;45195:7;45183:11;:20::i;:::-;45257:1;45226:10;:19;45237:7;45226:19;;;;;;;;;;;45220:33;;;;;:::i;:::-;;;:38;45216:97;;45282:10;:19;45293:7;45282:19;;;;;;;;;;;;45275:26;;;;:::i;:::-;45216:97;45114:206;:::o;33099:1053::-;33254:4;33275:15;:2;:13;;;:15::i;:::-;33271:874;;;33344:2;33328:36;;;33387:12;:10;:12::i;:::-;33422:4;33449:7;33479:5;33328:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33307:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33707:1;33690:6;:13;:18;33686:389;;;33733:108;;;;;;;;;;:::i;:::-;;;;;;;;33686:389;34025:6;34019:13;34010:6;34006:2;34002:15;33995:38;33307:783;33577:45;;;33567:55;;;:6;:55;;;;33560:62;;;;;33271:874;34129:4;34122:11;;33099:1053;;;;;;;:::o;53788:100::-;53840:13;53873:7;53866:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53788:100;:::o;23325:468::-;23443:13;23496:16;23504:7;23496;:16::i;:::-;23474:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;23600:21;23624:10;:8;:10::i;:::-;23600:34;;23689:1;23671:7;23665:21;:25;:120;;;;;;;;;;;;;;;;;23734:7;23743:18;:7;:16;:18::i;:::-;23717:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23665:120;23645:140;;;23325:468;;;:::o;20278:207::-;20408:4;20452:25;20437:40;;;:11;:40;;;;20430:47;;20278:207;;;:::o;29662:321::-;29792:18;29798:2;29802:7;29792:5;:18::i;:::-;29843:54;29874:1;29878:2;29882:7;29891:5;29843:22;:54::i;:::-;29821:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29662:321;;;:::o;38770:589::-;38914:45;38941:4;38947:2;38951:7;38914:26;:45::i;:::-;38992:1;38976:18;;:4;:18;;;38972:187;;;39011:40;39043:7;39011:31;:40::i;:::-;38972:187;;;39081:2;39073:10;;:4;:10;;;39069:90;;39100:47;39133:4;39139:7;39100:32;:47::i;:::-;39069:90;38972:187;39187:1;39173:16;;:2;:16;;;39169:183;;;39206:45;39243:7;39206:36;:45::i;:::-;39169:183;;;39279:4;39273:10;;:2;:10;;;39269:83;;39300:40;39328:2;39332:7;39300:27;:40::i;:::-;39269:83;39169:183;38770:589;;;:::o;30930:360::-;30990:13;31006:23;31021:7;31006:14;:23::i;:::-;30990:39;;31042:48;31063:5;31078:1;31082:7;31042:20;:48::i;:::-;31131:29;31148:1;31152:7;31131:8;:29::i;:::-;31193:1;31173:9;:16;31183:5;31173:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31212:7;:16;31220:7;31212:16;;;;;;;;;;;;31205:23;;;;;;;;;;;31274:7;31270:1;31246:36;;31255:5;31246:36;;;;;;;;;;;;30979:311;30930:360;:::o;8450:444::-;8510:4;8718:12;8842:7;8830:20;8822:28;;8885:1;8878:4;:8;8871:15;;;8450:444;;;:::o;17693:723::-;17749:13;17979:1;17970:5;:10;17966:53;;;17997:10;;;;;;;;;;;;;;;;;;;;;17966:53;18029:12;18044:5;18029:20;;18060:14;18085:78;18100:1;18092:4;:9;18085:78;;18118:8;;;;;:::i;:::-;;;;18149:2;18141:10;;;;;:::i;:::-;;;18085:78;;;18173:19;18205:6;18195:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18173:39;;18223:154;18239:1;18230:5;:10;18223:154;;18267:1;18257:11;;;;;:::i;:::-;;;18334:2;18326:5;:10;;;;:::i;:::-;18313:2;:24;;;;:::i;:::-;18300:39;;18283:6;18290;18283:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18363:2;18354:11;;;;;:::i;:::-;;;18223:154;;;18401:6;18387:21;;;;;17693:723;;;;:::o;30319:382::-;30413:1;30399:16;;:2;:16;;;;30391:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30472:16;30480:7;30472;:16::i;:::-;30471:17;30463:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30534:45;30563:1;30567:2;30571:7;30534:20;:45::i;:::-;30609:1;30592:9;:13;30602:2;30592:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30640:2;30621:7;:16;30629:7;30621:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30685:7;30681:2;30660:33;;30677:1;30660:33;;;;;;;;;;;;30319:382;;:::o;34765:126::-;;;;:::o;40082:164::-;40186:10;:17;;;;40159:15;:24;40175:7;40159:24;;;;;;;;;;;:44;;;;40214:10;40230:7;40214:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40082:164;:::o;40873:1002::-;41153:22;41203:1;41178:22;41195:4;41178:16;:22::i;:::-;:26;;;;:::i;:::-;41153:51;;41215:18;41236:17;:26;41254:7;41236:26;;;;;;;;;;;;41215:47;;41383:14;41369:10;:28;41365:328;;41414:19;41436:12;:18;41449:4;41436:18;;;;;;;;;;;;;;;:34;41455:14;41436:34;;;;;;;;;;;;41414:56;;41520:11;41487:12;:18;41500:4;41487:18;;;;;;;;;;;;;;;:30;41506:10;41487:30;;;;;;;;;;;:44;;;;41637:10;41604:17;:30;41622:11;41604:30;;;;;;;;;;;:43;;;;41399:294;41365:328;41789:17;:26;41807:7;41789:26;;;;;;;;;;;41782:33;;;41833:12;:18;41846:4;41833:18;;;;;;;;;;;;;;;:34;41852:14;41833:34;;;;;;;;;;;41826:41;;;40968:907;;40873:1002;;:::o;42170:1079::-;42423:22;42468:1;42448:10;:17;;;;:21;;;;:::i;:::-;42423:46;;42480:18;42501:15;:24;42517:7;42501:24;;;;;;;;;;;;42480:45;;42852:19;42874:10;42885:14;42874:26;;;;;;;;:::i;:::-;;;;;;;;;;42852:48;;42938:11;42913:10;42924;42913:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43049:10;43018:15;:28;43034:11;43018:28;;;;;;;;;;;:41;;;;43190:15;:24;43206:7;43190:24;;;;;;;;;;;43183:31;;;43225:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42241:1008;;;42170:1079;:::o;39660:221::-;39745:14;39762:20;39779:2;39762:16;:20::i;:::-;39745:37;;39820:7;39793:12;:16;39806:2;39793:16;;;;;;;;;;;;;;;:24;39810:6;39793:24;;;;;;;;;;;:34;;;;39867:6;39838:17;:26;39856:7;39838:26;;;;;;;;;;;:35;;;;39734:147;39660:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:137::-;2177:5;2215:6;2202:20;2193:29;;2231:32;2257:5;2231:32;:::i;:::-;2132:137;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:327::-;5821:6;5870:2;5858:9;5849:7;5845:23;5841:32;5838:119;;;5876:79;;:::i;:::-;5838:119;5996:1;6021:52;6065:7;6056:6;6045:9;6041:22;6021:52;:::i;:::-;6011:62;;5967:116;5763:327;;;;:::o;6096:349::-;6165:6;6214:2;6202:9;6193:7;6189:23;6185:32;6182:119;;;6220:79;;:::i;:::-;6182:119;6340:1;6365:63;6420:7;6411:6;6400:9;6396:22;6365:63;:::i;:::-;6355:73;;6311:127;6096:349;;;;:::o;6451:509::-;6520:6;6569:2;6557:9;6548:7;6544:23;6540:32;6537:119;;;6575:79;;:::i;:::-;6537:119;6723:1;6712:9;6708:17;6695:31;6753:18;6745:6;6742:30;6739:117;;;6775:79;;:::i;:::-;6739:117;6880:63;6935:7;6926:6;6915:9;6911:22;6880:63;:::i;:::-;6870:73;;6666:287;6451:509;;;;:::o;6966:327::-;7024:6;7073:2;7061:9;7052:7;7048:23;7044:32;7041:119;;;7079:79;;:::i;:::-;7041:119;7199:1;7224:52;7268:7;7259:6;7248:9;7244:22;7224:52;:::i;:::-;7214:62;;7170:116;6966:327;;;;:::o;7299:329::-;7358:6;7407:2;7395:9;7386:7;7382:23;7378:32;7375:119;;;7413:79;;:::i;:::-;7375:119;7533:1;7558:53;7603:7;7594:6;7583:9;7579:22;7558:53;:::i;:::-;7548:63;;7504:117;7299:329;;;;:::o;7634:654::-;7712:6;7720;7769:2;7757:9;7748:7;7744:23;7740:32;7737:119;;;7775:79;;:::i;:::-;7737:119;7895:1;7920:53;7965:7;7956:6;7945:9;7941:22;7920:53;:::i;:::-;7910:63;;7866:117;8050:2;8039:9;8035:18;8022:32;8081:18;8073:6;8070:30;8067:117;;;8103:79;;:::i;:::-;8067:117;8208:63;8263:7;8254:6;8243:9;8239:22;8208:63;:::i;:::-;8198:73;;7993:288;7634:654;;;;;:::o;8294:474::-;8362:6;8370;8419:2;8407:9;8398:7;8394:23;8390:32;8387:119;;;8425:79;;:::i;:::-;8387:119;8545:1;8570:53;8615:7;8606:6;8595:9;8591:22;8570:53;:::i;:::-;8560:63;;8516:117;8672:2;8698:53;8743:7;8734:6;8723:9;8719:22;8698:53;:::i;:::-;8688:63;;8643:118;8294:474;;;;;:::o;8774:179::-;8843:10;8864:46;8906:3;8898:6;8864:46;:::i;:::-;8942:4;8937:3;8933:14;8919:28;;8774:179;;;;:::o;8959:118::-;9046:24;9064:5;9046:24;:::i;:::-;9041:3;9034:37;8959:118;;:::o;9113:732::-;9232:3;9261:54;9309:5;9261:54;:::i;:::-;9331:86;9410:6;9405:3;9331:86;:::i;:::-;9324:93;;9441:56;9491:5;9441:56;:::i;:::-;9520:7;9551:1;9536:284;9561:6;9558:1;9555:13;9536:284;;;9637:6;9631:13;9664:63;9723:3;9708:13;9664:63;:::i;:::-;9657:70;;9750:60;9803:6;9750:60;:::i;:::-;9740:70;;9596:224;9583:1;9580;9576:9;9571:14;;9536:284;;;9540:14;9836:3;9829:10;;9237:608;;;9113:732;;;;:::o;9851:109::-;9932:21;9947:5;9932:21;:::i;:::-;9927:3;9920:34;9851:109;;:::o;9966:360::-;10052:3;10080:38;10112:5;10080:38;:::i;:::-;10134:70;10197:6;10192:3;10134:70;:::i;:::-;10127:77;;10213:52;10258:6;10253:3;10246:4;10239:5;10235:16;10213:52;:::i;:::-;10290:29;10312:6;10290:29;:::i;:::-;10285:3;10281:39;10274:46;;10056:270;9966:360;;;;:::o;10332:364::-;10420:3;10448:39;10481:5;10448:39;:::i;:::-;10503:71;10567:6;10562:3;10503:71;:::i;:::-;10496:78;;10583:52;10628:6;10623:3;10616:4;10609:5;10605:16;10583:52;:::i;:::-;10660:29;10682:6;10660:29;:::i;:::-;10655:3;10651:39;10644:46;;10424:272;10332:364;;;;:::o;10702:377::-;10808:3;10836:39;10869:5;10836:39;:::i;:::-;10891:89;10973:6;10968:3;10891:89;:::i;:::-;10884:96;;10989:52;11034:6;11029:3;11022:4;11015:5;11011:16;10989:52;:::i;:::-;11066:6;11061:3;11057:16;11050:23;;10812:267;10702:377;;;;:::o;11085:366::-;11227:3;11248:67;11312:2;11307:3;11248:67;:::i;:::-;11241:74;;11324:93;11413:3;11324:93;:::i;:::-;11442:2;11437:3;11433:12;11426:19;;11085:366;;;:::o;11457:::-;11599:3;11620:67;11684:2;11679:3;11620:67;:::i;:::-;11613:74;;11696:93;11785:3;11696:93;:::i;:::-;11814:2;11809:3;11805:12;11798:19;;11457:366;;;:::o;11829:::-;11971:3;11992:67;12056:2;12051:3;11992:67;:::i;:::-;11985:74;;12068:93;12157:3;12068:93;:::i;:::-;12186:2;12181:3;12177:12;12170:19;;11829:366;;;:::o;12201:::-;12343:3;12364:67;12428:2;12423:3;12364:67;:::i;:::-;12357:74;;12440:93;12529:3;12440:93;:::i;:::-;12558:2;12553:3;12549:12;12542:19;;12201:366;;;:::o;12573:::-;12715:3;12736:67;12800:2;12795:3;12736:67;:::i;:::-;12729:74;;12812:93;12901:3;12812:93;:::i;:::-;12930:2;12925:3;12921:12;12914:19;;12573:366;;;:::o;12945:::-;13087:3;13108:67;13172:2;13167:3;13108:67;:::i;:::-;13101:74;;13184:93;13273:3;13184:93;:::i;:::-;13302:2;13297:3;13293:12;13286:19;;12945:366;;;:::o;13317:::-;13459:3;13480:67;13544:2;13539:3;13480:67;:::i;:::-;13473:74;;13556:93;13645:3;13556:93;:::i;:::-;13674:2;13669:3;13665:12;13658:19;;13317:366;;;:::o;13689:::-;13831:3;13852:67;13916:2;13911:3;13852:67;:::i;:::-;13845:74;;13928:93;14017:3;13928:93;:::i;:::-;14046:2;14041:3;14037:12;14030:19;;13689:366;;;:::o;14061:::-;14203:3;14224:67;14288:2;14283:3;14224:67;:::i;:::-;14217:74;;14300:93;14389:3;14300:93;:::i;:::-;14418:2;14413:3;14409:12;14402:19;;14061:366;;;:::o;14433:::-;14575:3;14596:67;14660:2;14655:3;14596:67;:::i;:::-;14589:74;;14672:93;14761:3;14672:93;:::i;:::-;14790:2;14785:3;14781:12;14774:19;;14433:366;;;:::o;14805:::-;14947:3;14968:67;15032:2;15027:3;14968:67;:::i;:::-;14961:74;;15044:93;15133:3;15044:93;:::i;:::-;15162:2;15157:3;15153:12;15146:19;;14805:366;;;:::o;15177:::-;15319:3;15340:67;15404:2;15399:3;15340:67;:::i;:::-;15333:74;;15416:93;15505:3;15416:93;:::i;:::-;15534:2;15529:3;15525:12;15518:19;;15177:366;;;:::o;15549:::-;15691:3;15712:67;15776:2;15771:3;15712:67;:::i;:::-;15705:74;;15788:93;15877:3;15788:93;:::i;:::-;15906:2;15901:3;15897:12;15890:19;;15549:366;;;:::o;15921:::-;16063:3;16084:67;16148:2;16143:3;16084:67;:::i;:::-;16077:74;;16160:93;16249:3;16160:93;:::i;:::-;16278:2;16273:3;16269:12;16262:19;;15921:366;;;:::o;16293:::-;16435:3;16456:67;16520:2;16515:3;16456:67;:::i;:::-;16449:74;;16532:93;16621:3;16532:93;:::i;:::-;16650:2;16645:3;16641:12;16634:19;;16293:366;;;:::o;16665:::-;16807:3;16828:67;16892:2;16887:3;16828:67;:::i;:::-;16821:74;;16904:93;16993:3;16904:93;:::i;:::-;17022:2;17017:3;17013:12;17006:19;;16665:366;;;:::o;17037:::-;17179:3;17200:67;17264:2;17259:3;17200:67;:::i;:::-;17193:74;;17276:93;17365:3;17276:93;:::i;:::-;17394:2;17389:3;17385:12;17378:19;;17037:366;;;:::o;17409:::-;17551:3;17572:67;17636:2;17631:3;17572:67;:::i;:::-;17565:74;;17648:93;17737:3;17648:93;:::i;:::-;17766:2;17761:3;17757:12;17750:19;;17409:366;;;:::o;17781:::-;17923:3;17944:67;18008:2;18003:3;17944:67;:::i;:::-;17937:74;;18020:93;18109:3;18020:93;:::i;:::-;18138:2;18133:3;18129:12;18122:19;;17781:366;;;:::o;18153:::-;18295:3;18316:67;18380:2;18375:3;18316:67;:::i;:::-;18309:74;;18392:93;18481:3;18392:93;:::i;:::-;18510:2;18505:3;18501:12;18494:19;;18153:366;;;:::o;18525:::-;18667:3;18688:67;18752:2;18747:3;18688:67;:::i;:::-;18681:74;;18764:93;18853:3;18764:93;:::i;:::-;18882:2;18877:3;18873:12;18866:19;;18525:366;;;:::o;18897:::-;19039:3;19060:67;19124:2;19119:3;19060:67;:::i;:::-;19053:74;;19136:93;19225:3;19136:93;:::i;:::-;19254:2;19249:3;19245:12;19238:19;;18897:366;;;:::o;19269:::-;19411:3;19432:67;19496:2;19491:3;19432:67;:::i;:::-;19425:74;;19508:93;19597:3;19508:93;:::i;:::-;19626:2;19621:3;19617:12;19610:19;;19269:366;;;:::o;19641:::-;19783:3;19804:67;19868:2;19863:3;19804:67;:::i;:::-;19797:74;;19880:93;19969:3;19880:93;:::i;:::-;19998:2;19993:3;19989:12;19982:19;;19641:366;;;:::o;20013:::-;20155:3;20176:67;20240:2;20235:3;20176:67;:::i;:::-;20169:74;;20252:93;20341:3;20252:93;:::i;:::-;20370:2;20365:3;20361:12;20354:19;;20013:366;;;:::o;20385:::-;20527:3;20548:67;20612:2;20607:3;20548:67;:::i;:::-;20541:74;;20624:93;20713:3;20624:93;:::i;:::-;20742:2;20737:3;20733:12;20726:19;;20385:366;;;:::o;20757:::-;20899:3;20920:67;20984:2;20979:3;20920:67;:::i;:::-;20913:74;;20996:93;21085:3;20996:93;:::i;:::-;21114:2;21109:3;21105:12;21098:19;;20757:366;;;:::o;21129:::-;21271:3;21292:67;21356:2;21351:3;21292:67;:::i;:::-;21285:74;;21368:93;21457:3;21368:93;:::i;:::-;21486:2;21481:3;21477:12;21470:19;;21129:366;;;:::o;21501:108::-;21578:24;21596:5;21578:24;:::i;:::-;21573:3;21566:37;21501:108;;:::o;21615:118::-;21702:24;21720:5;21702:24;:::i;:::-;21697:3;21690:37;21615:118;;:::o;21739:435::-;21919:3;21941:95;22032:3;22023:6;21941:95;:::i;:::-;21934:102;;22053:95;22144:3;22135:6;22053:95;:::i;:::-;22046:102;;22165:3;22158:10;;21739:435;;;;;:::o;22180:222::-;22273:4;22311:2;22300:9;22296:18;22288:26;;22324:71;22392:1;22381:9;22377:17;22368:6;22324:71;:::i;:::-;22180:222;;;;:::o;22408:640::-;22603:4;22641:3;22630:9;22626:19;22618:27;;22655:71;22723:1;22712:9;22708:17;22699:6;22655:71;:::i;:::-;22736:72;22804:2;22793:9;22789:18;22780:6;22736:72;:::i;:::-;22818;22886:2;22875:9;22871:18;22862:6;22818:72;:::i;:::-;22937:9;22931:4;22927:20;22922:2;22911:9;22907:18;22900:48;22965:76;23036:4;23027:6;22965:76;:::i;:::-;22957:84;;22408:640;;;;;;;:::o;23054:332::-;23175:4;23213:2;23202:9;23198:18;23190:26;;23226:71;23294:1;23283:9;23279:17;23270:6;23226:71;:::i;:::-;23307:72;23375:2;23364:9;23360:18;23351:6;23307:72;:::i;:::-;23054:332;;;;;:::o;23392:373::-;23535:4;23573:2;23562:9;23558:18;23550:26;;23622:9;23616:4;23612:20;23608:1;23597:9;23593:17;23586:47;23650:108;23753:4;23744:6;23650:108;:::i;:::-;23642:116;;23392:373;;;;:::o;23771:210::-;23858:4;23896:2;23885:9;23881:18;23873:26;;23909:65;23971:1;23960:9;23956:17;23947:6;23909:65;:::i;:::-;23771:210;;;;:::o;23987:313::-;24100:4;24138:2;24127:9;24123:18;24115:26;;24187:9;24181:4;24177:20;24173:1;24162:9;24158:17;24151:47;24215:78;24288:4;24279:6;24215:78;:::i;:::-;24207:86;;23987:313;;;;:::o;24306:419::-;24472:4;24510:2;24499:9;24495:18;24487:26;;24559:9;24553:4;24549:20;24545:1;24534:9;24530:17;24523:47;24587:131;24713:4;24587:131;:::i;:::-;24579:139;;24306:419;;;:::o;24731:::-;24897:4;24935:2;24924:9;24920:18;24912:26;;24984:9;24978:4;24974:20;24970:1;24959:9;24955:17;24948:47;25012:131;25138:4;25012:131;:::i;:::-;25004:139;;24731:419;;;:::o;25156:::-;25322:4;25360:2;25349:9;25345:18;25337:26;;25409:9;25403:4;25399:20;25395:1;25384:9;25380:17;25373:47;25437:131;25563:4;25437:131;:::i;:::-;25429:139;;25156:419;;;:::o;25581:::-;25747:4;25785:2;25774:9;25770:18;25762:26;;25834:9;25828:4;25824:20;25820:1;25809:9;25805:17;25798:47;25862:131;25988:4;25862:131;:::i;:::-;25854:139;;25581:419;;;:::o;26006:::-;26172:4;26210:2;26199:9;26195:18;26187:26;;26259:9;26253:4;26249:20;26245:1;26234:9;26230:17;26223:47;26287:131;26413:4;26287:131;:::i;:::-;26279:139;;26006:419;;;:::o;26431:::-;26597:4;26635:2;26624:9;26620:18;26612:26;;26684:9;26678:4;26674:20;26670:1;26659:9;26655:17;26648:47;26712:131;26838:4;26712:131;:::i;:::-;26704:139;;26431:419;;;:::o;26856:::-;27022:4;27060:2;27049:9;27045:18;27037:26;;27109:9;27103:4;27099:20;27095:1;27084:9;27080:17;27073:47;27137:131;27263:4;27137:131;:::i;:::-;27129:139;;26856:419;;;:::o;27281:::-;27447:4;27485:2;27474:9;27470:18;27462:26;;27534:9;27528:4;27524:20;27520:1;27509:9;27505:17;27498:47;27562:131;27688:4;27562:131;:::i;:::-;27554:139;;27281:419;;;:::o;27706:::-;27872:4;27910:2;27899:9;27895:18;27887:26;;27959:9;27953:4;27949:20;27945:1;27934:9;27930:17;27923:47;27987:131;28113:4;27987:131;:::i;:::-;27979:139;;27706:419;;;:::o;28131:::-;28297:4;28335:2;28324:9;28320:18;28312:26;;28384:9;28378:4;28374:20;28370:1;28359:9;28355:17;28348:47;28412:131;28538:4;28412:131;:::i;:::-;28404:139;;28131:419;;;:::o;28556:::-;28722:4;28760:2;28749:9;28745:18;28737:26;;28809:9;28803:4;28799:20;28795:1;28784:9;28780:17;28773:47;28837:131;28963:4;28837:131;:::i;:::-;28829:139;;28556:419;;;:::o;28981:::-;29147:4;29185:2;29174:9;29170:18;29162:26;;29234:9;29228:4;29224:20;29220:1;29209:9;29205:17;29198:47;29262:131;29388:4;29262:131;:::i;:::-;29254:139;;28981:419;;;:::o;29406:::-;29572:4;29610:2;29599:9;29595:18;29587:26;;29659:9;29653:4;29649:20;29645:1;29634:9;29630:17;29623:47;29687:131;29813:4;29687:131;:::i;:::-;29679:139;;29406:419;;;:::o;29831:::-;29997:4;30035:2;30024:9;30020:18;30012:26;;30084:9;30078:4;30074:20;30070:1;30059:9;30055:17;30048:47;30112:131;30238:4;30112:131;:::i;:::-;30104:139;;29831:419;;;:::o;30256:::-;30422:4;30460:2;30449:9;30445:18;30437:26;;30509:9;30503:4;30499:20;30495:1;30484:9;30480:17;30473:47;30537:131;30663:4;30537:131;:::i;:::-;30529:139;;30256:419;;;:::o;30681:::-;30847:4;30885:2;30874:9;30870:18;30862:26;;30934:9;30928:4;30924:20;30920:1;30909:9;30905:17;30898:47;30962:131;31088:4;30962:131;:::i;:::-;30954:139;;30681:419;;;:::o;31106:::-;31272:4;31310:2;31299:9;31295:18;31287:26;;31359:9;31353:4;31349:20;31345:1;31334:9;31330:17;31323:47;31387:131;31513:4;31387:131;:::i;:::-;31379:139;;31106:419;;;:::o;31531:::-;31697:4;31735:2;31724:9;31720:18;31712:26;;31784:9;31778:4;31774:20;31770:1;31759:9;31755:17;31748:47;31812:131;31938:4;31812:131;:::i;:::-;31804:139;;31531:419;;;:::o;31956:::-;32122:4;32160:2;32149:9;32145:18;32137:26;;32209:9;32203:4;32199:20;32195:1;32184:9;32180:17;32173:47;32237:131;32363:4;32237:131;:::i;:::-;32229:139;;31956:419;;;:::o;32381:::-;32547:4;32585:2;32574:9;32570:18;32562:26;;32634:9;32628:4;32624:20;32620:1;32609:9;32605:17;32598:47;32662:131;32788:4;32662:131;:::i;:::-;32654:139;;32381:419;;;:::o;32806:::-;32972:4;33010:2;32999:9;32995:18;32987:26;;33059:9;33053:4;33049:20;33045:1;33034:9;33030:17;33023:47;33087:131;33213:4;33087:131;:::i;:::-;33079:139;;32806:419;;;:::o;33231:::-;33397:4;33435:2;33424:9;33420:18;33412:26;;33484:9;33478:4;33474:20;33470:1;33459:9;33455:17;33448:47;33512:131;33638:4;33512:131;:::i;:::-;33504:139;;33231:419;;;:::o;33656:::-;33822:4;33860:2;33849:9;33845:18;33837:26;;33909:9;33903:4;33899:20;33895:1;33884:9;33880:17;33873:47;33937:131;34063:4;33937:131;:::i;:::-;33929:139;;33656:419;;;:::o;34081:::-;34247:4;34285:2;34274:9;34270:18;34262:26;;34334:9;34328:4;34324:20;34320:1;34309:9;34305:17;34298:47;34362:131;34488:4;34362:131;:::i;:::-;34354:139;;34081:419;;;:::o;34506:::-;34672:4;34710:2;34699:9;34695:18;34687:26;;34759:9;34753:4;34749:20;34745:1;34734:9;34730:17;34723:47;34787:131;34913:4;34787:131;:::i;:::-;34779:139;;34506:419;;;:::o;34931:::-;35097:4;35135:2;35124:9;35120:18;35112:26;;35184:9;35178:4;35174:20;35170:1;35159:9;35155:17;35148:47;35212:131;35338:4;35212:131;:::i;:::-;35204:139;;34931:419;;;:::o;35356:::-;35522:4;35560:2;35549:9;35545:18;35537:26;;35609:9;35603:4;35599:20;35595:1;35584:9;35580:17;35573:47;35637:131;35763:4;35637:131;:::i;:::-;35629:139;;35356:419;;;:::o;35781:::-;35947:4;35985:2;35974:9;35970:18;35962:26;;36034:9;36028:4;36024:20;36020:1;36009:9;36005:17;35998:47;36062:131;36188:4;36062:131;:::i;:::-;36054:139;;35781:419;;;:::o;36206:222::-;36299:4;36337:2;36326:9;36322:18;36314:26;;36350:71;36418:1;36407:9;36403:17;36394:6;36350:71;:::i;:::-;36206:222;;;;:::o;36434:129::-;36468:6;36495:20;;:::i;:::-;36485:30;;36524:33;36552:4;36544:6;36524:33;:::i;:::-;36434:129;;;:::o;36569:75::-;36602:6;36635:2;36629:9;36619:19;;36569:75;:::o;36650:307::-;36711:4;36801:18;36793:6;36790:30;36787:56;;;36823:18;;:::i;:::-;36787:56;36861:29;36883:6;36861:29;:::i;:::-;36853:37;;36945:4;36939;36935:15;36927:23;;36650:307;;;:::o;36963:308::-;37025:4;37115:18;37107:6;37104:30;37101:56;;;37137:18;;:::i;:::-;37101:56;37175:29;37197:6;37175:29;:::i;:::-;37167:37;;37259:4;37253;37249:15;37241:23;;36963:308;;;:::o;37277:132::-;37344:4;37367:3;37359:11;;37397:4;37392:3;37388:14;37380:22;;37277:132;;;:::o;37415:114::-;37482:6;37516:5;37510:12;37500:22;;37415:114;;;:::o;37535:98::-;37586:6;37620:5;37614:12;37604:22;;37535:98;;;:::o;37639:99::-;37691:6;37725:5;37719:12;37709:22;;37639:99;;;:::o;37744:113::-;37814:4;37846;37841:3;37837:14;37829:22;;37744:113;;;:::o;37863:184::-;37962:11;37996:6;37991:3;37984:19;38036:4;38031:3;38027:14;38012:29;;37863:184;;;;:::o;38053:168::-;38136:11;38170:6;38165:3;38158:19;38210:4;38205:3;38201:14;38186:29;;38053:168;;;;:::o;38227:169::-;38311:11;38345:6;38340:3;38333:19;38385:4;38380:3;38376:14;38361:29;;38227:169;;;;:::o;38402:148::-;38504:11;38541:3;38526:18;;38402:148;;;;:::o;38556:305::-;38596:3;38615:20;38633:1;38615:20;:::i;:::-;38610:25;;38649:20;38667:1;38649:20;:::i;:::-;38644:25;;38803:1;38735:66;38731:74;38728:1;38725:81;38722:107;;;38809:18;;:::i;:::-;38722:107;38853:1;38850;38846:9;38839:16;;38556:305;;;;:::o;38867:185::-;38907:1;38924:20;38942:1;38924:20;:::i;:::-;38919:25;;38958:20;38976:1;38958:20;:::i;:::-;38953:25;;38997:1;38987:35;;39002:18;;:::i;:::-;38987:35;39044:1;39041;39037:9;39032:14;;38867:185;;;;:::o;39058:348::-;39098:7;39121:20;39139:1;39121:20;:::i;:::-;39116:25;;39155:20;39173:1;39155:20;:::i;:::-;39150:25;;39343:1;39275:66;39271:74;39268:1;39265:81;39260:1;39253:9;39246:17;39242:105;39239:131;;;39350:18;;:::i;:::-;39239:131;39398:1;39395;39391:9;39380:20;;39058:348;;;;:::o;39412:191::-;39452:4;39472:20;39490:1;39472:20;:::i;:::-;39467:25;;39506:20;39524:1;39506:20;:::i;:::-;39501:25;;39545:1;39542;39539:8;39536:34;;;39550:18;;:::i;:::-;39536:34;39595:1;39592;39588:9;39580:17;;39412:191;;;;:::o;39609:96::-;39646:7;39675:24;39693:5;39675:24;:::i;:::-;39664:35;;39609:96;;;:::o;39711:90::-;39745:7;39788:5;39781:13;39774:21;39763:32;;39711:90;;;:::o;39807:149::-;39843:7;39883:66;39876:5;39872:78;39861:89;;39807:149;;;:::o;39962:89::-;39998:7;40038:6;40031:5;40027:18;40016:29;;39962:89;;;:::o;40057:126::-;40094:7;40134:42;40127:5;40123:54;40112:65;;40057:126;;;:::o;40189:77::-;40226:7;40255:5;40244:16;;40189:77;;;:::o;40272:154::-;40356:6;40351:3;40346;40333:30;40418:1;40409:6;40404:3;40400:16;40393:27;40272:154;;;:::o;40432:307::-;40500:1;40510:113;40524:6;40521:1;40518:13;40510:113;;;40609:1;40604:3;40600:11;40594:18;40590:1;40585:3;40581:11;40574:39;40546:2;40543:1;40539:10;40534:15;;40510:113;;;40641:6;40638:1;40635:13;40632:101;;;40721:1;40712:6;40707:3;40703:16;40696:27;40632:101;40481:258;40432:307;;;:::o;40745:320::-;40789:6;40826:1;40820:4;40816:12;40806:22;;40873:1;40867:4;40863:12;40894:18;40884:81;;40950:4;40942:6;40938:17;40928:27;;40884:81;41012:2;41004:6;41001:14;40981:18;40978:38;40975:84;;;41031:18;;:::i;:::-;40975:84;40796:269;40745:320;;;:::o;41071:281::-;41154:27;41176:4;41154:27;:::i;:::-;41146:6;41142:40;41284:6;41272:10;41269:22;41248:18;41236:10;41233:34;41230:62;41227:88;;;41295:18;;:::i;:::-;41227:88;41335:10;41331:2;41324:22;41114:238;41071:281;;:::o;41358:233::-;41397:3;41420:24;41438:5;41420:24;:::i;:::-;41411:33;;41466:66;41459:5;41456:77;41453:103;;;41536:18;;:::i;:::-;41453:103;41583:1;41576:5;41572:13;41565:20;;41358:233;;;:::o;41597:176::-;41629:1;41646:20;41664:1;41646:20;:::i;:::-;41641:25;;41680:20;41698:1;41680:20;:::i;:::-;41675:25;;41719:1;41709:35;;41724:18;;:::i;:::-;41709:35;41765:1;41762;41758:9;41753:14;;41597:176;;;;:::o;41779:180::-;41827:77;41824:1;41817:88;41924:4;41921:1;41914:15;41948:4;41945:1;41938:15;41965:180;42013:77;42010:1;42003:88;42110:4;42107:1;42100:15;42134:4;42131:1;42124:15;42151:180;42199:77;42196:1;42189:88;42296:4;42293:1;42286:15;42320:4;42317:1;42310:15;42337:180;42385:77;42382:1;42375:88;42482:4;42479:1;42472:15;42506:4;42503:1;42496:15;42523:180;42571:77;42568:1;42561:88;42668:4;42665:1;42658:15;42692:4;42689:1;42682:15;42709:180;42757:77;42754:1;42747:88;42854:4;42851:1;42844:15;42878:4;42875:1;42868:15;42895:117;43004:1;43001;42994:12;43018:117;43127:1;43124;43117:12;43141:117;43250:1;43247;43240:12;43264:117;43373:1;43370;43363:12;43387:102;43428:6;43479:2;43475:7;43470:2;43463:5;43459:14;43455:28;43445:38;;43387:102;;;:::o;43495:225::-;43635:34;43631:1;43623:6;43619:14;43612:58;43704:8;43699:2;43691:6;43687:15;43680:33;43495:225;:::o;43726:170::-;43866:22;43862:1;43854:6;43850:14;43843:46;43726:170;:::o;43902:230::-;44042:34;44038:1;44030:6;44026:14;44019:58;44111:13;44106:2;44098:6;44094:15;44087:38;43902:230;:::o;44138:237::-;44278:34;44274:1;44266:6;44262:14;44255:58;44347:20;44342:2;44334:6;44330:15;44323:45;44138:237;:::o;44381:225::-;44521:34;44517:1;44509:6;44505:14;44498:58;44590:8;44585:2;44577:6;44573:15;44566:33;44381:225;:::o;44612:173::-;44752:25;44748:1;44740:6;44736:14;44729:49;44612:173;:::o;44791:178::-;44931:30;44927:1;44919:6;44915:14;44908:54;44791:178;:::o;44975:171::-;45115:23;45111:1;45103:6;45099:14;45092:47;44975:171;:::o;45152:223::-;45292:34;45288:1;45280:6;45276:14;45269:58;45361:6;45356:2;45348:6;45344:15;45337:31;45152:223;:::o;45381:175::-;45521:27;45517:1;45509:6;45505:14;45498:51;45381:175;:::o;45562:231::-;45702:34;45698:1;45690:6;45686:14;45679:58;45771:14;45766:2;45758:6;45754:15;45747:39;45562:231;:::o;45799:166::-;45939:18;45935:1;45927:6;45923:14;45916:42;45799:166;:::o;45971:243::-;46111:34;46107:1;46099:6;46095:14;46088:58;46180:26;46175:2;46167:6;46163:15;46156:51;45971:243;:::o;46220:230::-;46360:34;46356:1;46348:6;46344:14;46337:58;46429:13;46424:2;46416:6;46412:15;46405:38;46220:230;:::o;46456:229::-;46596:34;46592:1;46584:6;46580:14;46573:58;46665:12;46660:2;46652:6;46648:15;46641:37;46456:229;:::o;46691:228::-;46831:34;46827:1;46819:6;46815:14;46808:58;46900:11;46895:2;46887:6;46883:15;46876:36;46691:228;:::o;46925:233::-;47065:34;47061:1;47053:6;47049:14;47042:58;47134:16;47129:2;47121:6;47117:15;47110:41;46925:233;:::o;47164:182::-;47304:34;47300:1;47292:6;47288:14;47281:58;47164:182;:::o;47352:236::-;47492:34;47488:1;47480:6;47476:14;47469:58;47561:19;47556:2;47548:6;47544:15;47537:44;47352:236;:::o;47594:231::-;47734:34;47730:1;47722:6;47718:14;47711:58;47803:14;47798:2;47790:6;47786:15;47779:39;47594:231;:::o;47831:182::-;47971:34;47967:1;47959:6;47955:14;47948:58;47831:182;:::o;48019:228::-;48159:34;48155:1;48147:6;48143:14;48136:58;48228:11;48223:2;48215:6;48211:15;48204:36;48019:228;:::o;48253:234::-;48393:34;48389:1;48381:6;48377:14;48370:58;48462:17;48457:2;48449:6;48445:15;48438:42;48253:234;:::o;48493:220::-;48633:34;48629:1;48621:6;48617:14;48610:58;48702:3;48697:2;48689:6;48685:15;48678:28;48493:220;:::o;48719:232::-;48859:34;48855:1;48847:6;48843:14;48836:58;48928:15;48923:2;48915:6;48911:15;48904:40;48719:232;:::o;48957:236::-;49097:34;49093:1;49085:6;49081:14;49074:58;49166:19;49161:2;49153:6;49149:15;49142:44;48957:236;:::o;49199:231::-;49339:34;49335:1;49327:6;49323:14;49316:58;49408:14;49403:2;49395:6;49391:15;49384:39;49199:231;:::o;49436:235::-;49576:34;49572:1;49564:6;49560:14;49553:58;49645:18;49640:2;49632:6;49628:15;49621:43;49436:235;:::o;49677:122::-;49750:24;49768:5;49750:24;:::i;:::-;49743:5;49740:35;49730:63;;49789:1;49786;49779:12;49730:63;49677:122;:::o;49805:116::-;49875:21;49890:5;49875:21;:::i;:::-;49868:5;49865:32;49855:60;;49911:1;49908;49901:12;49855:60;49805:116;:::o;49927:120::-;49999:23;50016:5;49999:23;:::i;:::-;49992:5;49989:34;49979:62;;50037:1;50034;50027:12;49979:62;49927:120;:::o;50053:::-;50125:23;50142:5;50125:23;:::i;:::-;50118:5;50115:34;50105:62;;50163:1;50160;50153:12;50105:62;50053:120;:::o;50179:122::-;50252:24;50270:5;50252:24;:::i;:::-;50245:5;50242:35;50232:63;;50291:1;50288;50281:12;50232:63;50179:122;:::o

Swarm Source

ipfs://3d5bec5c35415ed3ac07b7f4a32700cbd6ed4e5c8e3393ba0b354354fa913ea5
Loading