FTM Price: $0.31 (-3.45%)
Gas: 29 Gwei

Token

Spiritopoly (SPIRITOPOLY)
 

Overview

Max Total Supply

132 SPIRITOPOLY

Holders

81

Market

Fully Diluted Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Balance
0 SPIRITOPOLY
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Spiritopoly

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 ftmscan.com on 2021-12-17
*/

// 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/I[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/ERC[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);
}

pragma solidity ^0.8.0;

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

    Counters.Counter private _tokenIdCounter;

    uint256 public maxSupply = 500;
    uint256 public maxBuy = 10;
    uint256 public price = 400 ether;
    bool private isRevealed=false;

    string public baseURI="https://gateway.pinata.cloud/ipfs/";
    string private preRevealedURI="Qmba5oAaQA78po6TuH1z6MsQjR6gAf8PRDgpL1tersPbZp";
    address private royaltyAddress;
    address private devAddress=0xB11eacc17bd735854D9d89BEE9EFE1D6b7e0B9Bf;

    mapping(address => uint8) public freeMintBalance;

    uint256 public royalty = 500;

    constructor() ERC721("Spiritopoly", "SPIRITOPOLY") {
        royaltyAddress=devAddress;
        _pause();
    }

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

    function buySpirit(uint256 amount) public payable {
        require(msg.value >= price * amount, "Not enough was paid");
        require(
            amount <= maxBuy,
            "Amount Exceeds max buy per transaction"
        );
        for (uint256 i = 0; i < amount; i++) {
            internalMint(msg.sender);
        }
    }

    function freeMint() public {
        require(freeMintBalance[msg.sender] > 0,"Address does'nt have any free mint");
        require(totalSupply() < maxSupply, "All NFTs have been minted!");
        freeMintBalance[msg.sender]=0;
        internalMint(msg.sender);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        tokenExists(tokenId)
        returns (string memory)
    {
        return isRevealed ?  string(abi.encodePacked(_baseURI(),toString(tokenId),'.json')): string(abi.encodePacked(_baseURI(),preRevealedURI));
    }


    function nftsOwned(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;
        }
    }

    modifier tokenExists(uint256 _id) {
        require(_exists(_id), 'Does not exist.');
        _;
    }

    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 setMaxSupply(uint256 newMaxSupply) public onlyOwner {
        require(newMaxSupply<500, "Cannot Increase Supply!!");
        maxSupply = newMaxSupply;
    }

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

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

    function addFreeMintAddresses(address[] memory _addresses)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < _addresses.length; i++) {
            require(_addresses[i] != address(0), "Address cannot be 0.");
            freeMintBalance[_addresses[i]] = 1;
        }
    }
    
    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 setDevAddress(address _address) external onlyOwner {
        devAddress = _address;
    }
    
    //Overrides
    
     function internalMint(address to) internal {
        require(totalSupply() < maxSupply, "All NFTs have been minted!");
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function safeMint(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 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);
    }
    

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

 /// @dev withdraw native token
    function withdraw() public {
        payable(devAddress).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":"_addresses","type":"address[]"}],"name":"addFreeMintAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"buySpirit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintBalance","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nftsOwned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"reveal","type":"bool"}],"name":"setReveal","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":"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":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Contract Creation Code

60806040526101f4600d55600a600e556815af1d78b58c400000600f556000601060006101000a81548160ff02191690831515021790555060405180606001604052806022815260200162005f8a602291396011908051906020019062000068929190620003c0565b506040518060600160405280602e815260200162005f5c602e9139601290805190602001906200009a929190620003c0565b5073b11eacc17bd735854d9d89bee9efe1d6b7e0b9bf601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101f46016553480156200010357600080fd5b506040518060400160405280600b81526020017f5370697269746f706f6c790000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f5350495249544f504f4c59000000000000000000000000000000000000000000815250816000908051906020019062000188929190620003c0565b508060019080519060200190620001a1929190620003c0565b5050506000600b60006101000a81548160ff0219169083151502179055506000620001d1620002e960201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002e3620002f160201b60201c565b620005ba565b600033905090565b62000301620003a960201b60201c565b1562000344576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033b90620004c5565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862000390620002e960201b60201c565b6040516200039f9190620004a8565b60405180910390a1565b6000600b60009054906101000a900460ff16905090565b828054620003ce906200052c565b90600052602060002090601f016020900481019282620003f257600085556200043e565b82601f106200040d57805160ff19168380011785556200043e565b828001600101855582156200043e579182015b828111156200043d57825182559160200191906001019062000420565b5b5090506200044d919062000451565b5090565b5b808211156200046c57600081600090555060010162000452565b5090565b6200047b81620004f8565b82525050565b600062000490601083620004e7565b91506200049d8262000591565b602082019050919050565b6000602082019050620004bf600083018462000470565b92915050565b60006020820190508181036000830152620004e08162000481565b9050919050565b600082825260208201905092915050565b600062000505826200050c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200054557607f821691505b602082108114156200055c576200055b62000562565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b61599280620005ca6000396000f3fe6080604052600436106102765760003560e01c80636461c2a41161014f57806391b7f5ed116100c1578063d0d41fe11161007a578063d0d41fe114610921578063d1d18f501461094a578063d5abeb0114610987578063e985e9c5146109b2578063f2fde38b146109ef578063f53bc83514610a185761027d565b806391b7f5ed1461081357806395d89b411461083c578063a035b1fe14610867578063a22cb46514610892578063b88d4fde146108bb578063c87b56dd146108e45761027d565b806370db69d61161011357806370db69d614610729578063715018a6146107545780638456cb591461076b578063862440e2146107825780638baafe13146107ab5780638da5cb5b146107e85761027d565b80636461c2a41461065357806364baeee81461067c5780636c0360eb146106985780636f8b44b0146106c357806370a08231146106ec5761027d565b806336e79a5a116101e857806342966c68116101ac57806342966c68146105455780634f6ccce71461056e57806355f804b3146105ab5780635b70ea9f146105d45780635c975abb146105eb5780636352211e146106165761027d565b806336e79a5a1461049c5780633ccfd60b146104c55780633f4ba83a146104dc57806340d097c3146104f357806342842e0e1461051c5761027d565b806318160ddd1161023a57806318160ddd1461037957806323b872dd146103a457806329ee566c146103cd5780632a3f300c146103f85780632a55205a146104215780632f745c591461045f5761027d565b806301ffc9a71461028257806306d254da146102bf57806306fdde03146102e8578063081812fc14610313578063095ea7b3146103505761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613ee4565b610a41565b6040516102b691906147a2565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613cab565b610abb565b005b3480156102f457600080fd5b506102fd610b7b565b60405161030a91906147bd565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190613fb4565b610c0d565b60405161034791906146f0565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190613e2e565b610c92565b005b34801561038557600080fd5b5061038e610daa565b60405161039b9190614b9f565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c69190613d18565b610db7565b005b3480156103d957600080fd5b506103e2610e17565b6040516103ef9190614b9f565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613eb7565b610e1d565b005b34801561042d57600080fd5b506104486004803603810190610443919061403d565b610eb6565b604051610456929190614757565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613e2e565b610f02565b6040516104939190614b9f565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be9190613f87565b610fa7565b005b3480156104d157600080fd5b506104da6110c2565b005b3480156104e857600080fd5b506104f161112d565b005b3480156104ff57600080fd5b5061051a60048036038101906105159190613cab565b6111b3565b005b34801561052857600080fd5b50610543600480360381019061053e9190613d18565b61123b565b005b34801561055157600080fd5b5061056c60048036038101906105679190613fb4565b61125b565b005b34801561057a57600080fd5b5061059560048036038101906105909190613fb4565b6112b7565b6040516105a29190614b9f565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613f3e565b611328565b005b3480156105e057600080fd5b506105e96113be565b005b3480156105f757600080fd5b506106006114ff565b60405161060d91906147a2565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613fb4565b611516565b60405161064a91906146f0565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190613e6e565b6115c8565b005b61069660048036038101906106919190613fb4565b611764565b005b3480156106a457600080fd5b506106ad611824565b6040516106ba91906147bd565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190613fb4565b6118b2565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613cab565b61197c565b6040516107209190614b9f565b60405180910390f35b34801561073557600080fd5b5061073e611a34565b60405161074b9190614b9f565b60405180910390f35b34801561076057600080fd5b50610769611a3a565b005b34801561077757600080fd5b50610780611b77565b005b34801561078e57600080fd5b506107a960048036038101906107a49190613fe1565b611bfd565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613cab565b611c87565b6040516107df9190614780565b60405180910390f35b3480156107f457600080fd5b506107fd611d91565b60405161080a91906146f0565b60405180910390f35b34801561081f57600080fd5b5061083a60048036038101906108359190613fb4565b611dbb565b005b34801561084857600080fd5b50610851611e41565b60405161085e91906147bd565b60405180910390f35b34801561087357600080fd5b5061087c611ed3565b6040516108899190614b9f565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613dee565b611ed9565b005b3480156108c757600080fd5b506108e260048036038101906108dd9190613d6b565b61205a565b005b3480156108f057600080fd5b5061090b60048036038101906109069190613fb4565b6120bc565b60405161091891906147bd565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613cab565b612184565b005b34801561095657600080fd5b50610971600480360381019061096c9190613cab565b612244565b60405161097e9190614bba565b60405180910390f35b34801561099357600080fd5b5061099c612264565b6040516109a99190614b9f565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d49190613cd8565b61226a565b6040516109e691906147a2565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a119190613cab565b6122fe565b005b348015610a2457600080fd5b50610a3f6004803603810190610a3a9190613fb4565b6124aa565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ab45750610ab382612530565b5b9050919050565b610ac36125aa565b73ffffffffffffffffffffffffffffffffffffffff16610ae1611d91565b73ffffffffffffffffffffffffffffffffffffffff1614610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e90614a9f565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610b8a90614eff565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb690614eff565b8015610c035780601f10610bd857610100808354040283529160200191610c03565b820191906000526020600020905b815481529060010190602001808311610be657829003601f168201915b5050505050905090565b6000610c18826125b2565b610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90614a7f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9d82611516565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0590614adf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d2d6125aa565b73ffffffffffffffffffffffffffffffffffffffff161480610d5c5750610d5b81610d566125aa565b61226a565b5b610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d929061497f565b60405180910390fd5b610da5838361261e565b505050565b6000600880549050905090565b610dc8610dc26125aa565b826126d7565b610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90614b1f565b60405180910390fd5b610e128383836127b5565b505050565b60165481565b610e256125aa565b73ffffffffffffffffffffffffffffffffffffffff16610e43611d91565b73ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614a9f565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060165485610eed9190614da0565b610ef79190614d6f565b915091509250929050565b6000610f0d8361197c565b8210610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f459061483f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610faf6125aa565b73ffffffffffffffffffffffffffffffffffffffff16610fcd611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90614a9f565b60405180910390fd5b60008161ffff16101561106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110629061499f565b60405180910390fd5b6102ee8161ffff1611156110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab90614aff565b60405180910390fd5b8061ffff1660168190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561112a573d6000803e3d6000fd5b50565b6111356125aa565b73ffffffffffffffffffffffffffffffffffffffff16611153611d91565b73ffffffffffffffffffffffffffffffffffffffff16146111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090614a9f565b60405180910390fd5b6111b1612a11565b565b6111bb6125aa565b73ffffffffffffffffffffffffffffffffffffffff166111d9611d91565b73ffffffffffffffffffffffffffffffffffffffff161461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690614a9f565b60405180910390fd5b61123881612ab3565b50565b6112568383836040518060200160405280600081525061205a565b505050565b61126c6112666125aa565b826126d7565b6112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614b5f565b60405180910390fd5b6112b481612b1e565b50565b60006112c1610daa565b8210611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f990614b3f565b60405180910390fd5b6008828154811061131657611315615098565b5b90600052602060002001549050919050565b6113306125aa565b73ffffffffffffffffffffffffffffffffffffffff1661134e611d91565b73ffffffffffffffffffffffffffffffffffffffff16146113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90614a9f565b60405180910390fd5b80601190805190602001906113ba9291906139cc565b5050565b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1611611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061481f565b60405180910390fd5b600d5461145b610daa565b1061149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614a1f565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506114fd33612ab3565b565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b6906149df565b60405180910390fd5b80915050919050565b6115d06125aa565b73ffffffffffffffffffffffffffffffffffffffff166115ee611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90614a9f565b60405180910390fd5b60005b815181101561176057600073ffffffffffffffffffffffffffffffffffffffff1682828151811061167b5761167a615098565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190614b7f565b60405180910390fd5b6001601560008484815181106116f3576116f2615098565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061175890614f62565b915050611647565b5050565b80600f546117729190614da0565b3410156117b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ab9061495f565b60405180910390fd5b600e548111156117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f0906147df565b60405180910390fd5b60005b818110156118205761180d33612ab3565b808061181890614f62565b9150506117fc565b5050565b6011805461183190614eff565b80601f016020809104026020016040519081016040528092919081815260200182805461185d90614eff565b80156118aa5780601f1061187f576101008083540402835291602001916118aa565b820191906000526020600020905b81548152906001019060200180831161188d57829003601f168201915b505050505081565b6118ba6125aa565b73ffffffffffffffffffffffffffffffffffffffff166118d8611d91565b73ffffffffffffffffffffffffffffffffffffffff161461192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614a9f565b60405180910390fd5b6101f48110611972576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611969906148bf565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e4906149bf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b611a426125aa565b73ffffffffffffffffffffffffffffffffffffffff16611a60611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614a9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b7f6125aa565b73ffffffffffffffffffffffffffffffffffffffff16611b9d611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea90614a9f565b60405180910390fd5b611bfb612b2a565b565b611c056125aa565b73ffffffffffffffffffffffffffffffffffffffff16611c23611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7090614a9f565b60405180910390fd5b611c838282612bcd565b5050565b60606000611c948361197c565b90506000811415611cf157600067ffffffffffffffff811115611cba57611cb96150c7565b5b604051908082528060200260200182016040528015611ce85781602001602082028036833780820191505090505b50915050611d8c565b60008167ffffffffffffffff811115611d0d57611d0c6150c7565b5b604051908082528060200260200182016040528015611d3b5781602001602082028036833780820191505090505b50905060005b82811015611d8557611d538582610f02565b828281518110611d6657611d65615098565b5b6020026020010181815250508080611d7d90614f62565b915050611d41565b8193505050505b919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611dc36125aa565b73ffffffffffffffffffffffffffffffffffffffff16611de1611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90614a9f565b60405180910390fd5b80600f8190555050565b606060018054611e5090614eff565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7c90614eff565b8015611ec95780601f10611e9e57610100808354040283529160200191611ec9565b820191906000526020600020905b815481529060010190602001808311611eac57829003601f168201915b5050505050905090565b600f5481565b611ee16125aa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906148ff565b60405180910390fd5b8060056000611f5c6125aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120096125aa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161204e91906147a2565b60405180910390a35050565b61206b6120656125aa565b836126d7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614b1f565b60405180910390fd5b6120b684848484612c41565b50505050565b6060816120c8816125b2565b612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90614a5f565b60405180910390fd5b601060009054906101000a900460ff1661214a57612123612c9d565b60126040516020016121369291906146cc565b60405160208183030381529060405261217c565b612152612c9d565b61215b84612d2f565b60405160200161216c92919061469d565b6040516020818303038152906040525b915050919050565b61218c6125aa565b73ffffffffffffffffffffffffffffffffffffffff166121aa611d91565b73ffffffffffffffffffffffffffffffffffffffff1614612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f790614a9f565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60156020528060005260406000206000915054906101000a900460ff1681565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123066125aa565b73ffffffffffffffffffffffffffffffffffffffff16612324611d91565b73ffffffffffffffffffffffffffffffffffffffff161461237a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237190614a9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e19061487f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124b26125aa565b73ffffffffffffffffffffffffffffffffffffffff166124d0611d91565b73ffffffffffffffffffffffffffffffffffffffff1614612526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251d90614a9f565b60405180910390fd5b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a357506125a282612e90565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269183611516565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126e2826125b2565b612721576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127189061491f565b60405180910390fd5b600061272c83611516565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061279b57508373ffffffffffffffffffffffffffffffffffffffff1661278384610c0d565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ac57506127ab818561226a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127d582611516565b73ffffffffffffffffffffffffffffffffffffffff161461282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282290614abf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612892906148df565b60405180910390fd5b6128a6838383612f72565b6128b160008261261e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129019190614dfa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129589190614d19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612a196114ff565b612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906147ff565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a9c6125aa565b604051612aa991906146f0565b60405180910390a1565b600d54612abe610daa565b10612afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af590614a1f565b60405180910390fd5b612b1181612b0c600c612fca565b612fd8565b612b1b600c612ff6565b50565b612b278161300c565b50565b612b326114ff565b15612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b699061493f565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612bb66125aa565b604051612bc391906146f0565b60405180910390a1565b612bd6826125b2565b612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0c906149ff565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190612c3c9291906139cc565b505050565b612c4c8484846127b5565b612c588484848461305f565b612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e9061485f565b60405180910390fd5b50505050565b606060118054612cac90614eff565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd890614eff565b8015612d255780601f10612cfa57610100808354040283529160200191612d25565b820191906000526020600020905b815481529060010190602001808311612d0857829003601f168201915b5050505050905090565b60606000821415612d77576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e8b565b600082905060005b60008214612da9578080612d9290614f62565b915050600a82612da29190614d6f565b9150612d7f565b60008167ffffffffffffffff811115612dc557612dc46150c7565b5b6040519080825280601f01601f191660200182016040528015612df75781602001600182028036833780820191505090505b5090505b60008514612e8457600182612e109190614dfa565b9150600a85612e1f9190614fab565b6030612e2b9190614d19565b60f81b818381518110612e4157612e40615098565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e7d9190614d6f565b9450612dfb565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f6b5750612f6a826131f6565b5b9050919050565b612f7a6114ff565b15612fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb19061493f565b60405180910390fd5b612fc5838383613260565b505050565b600081600001549050919050565b612ff2828260405180602001604052806000815250613374565b5050565b6001816000016000828254019250508190555050565b613015816133cf565b6000600a6000838152602001908152602001600020805461303590614eff565b90501461305c57600a6000828152602001908152602001600020600061305b9190613a52565b5b50565b60006130808473ffffffffffffffffffffffffffffffffffffffff166134e0565b156131e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130a96125aa565b8786866040518563ffffffff1660e01b81526004016130cb949392919061470b565b602060405180830381600087803b1580156130e557600080fd5b505af192505050801561311657506040513d601f19601f820116820180604052508101906131139190613f11565b60015b613199573d8060008114613146576040519150601f19603f3d011682016040523d82523d6000602084013e61314b565b606091505b50600081511415613191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131889061485f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131ee565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61326b8383836134f3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132ae576132a9816134f8565b6132ed565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132ec576132eb8382613541565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133305761332b816136ae565b61336f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461336e5761336d828261377f565b5b5b505050565b61337e83836137fe565b61338b600084848461305f565b6133ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c19061485f565b60405180910390fd5b505050565b60006133da82611516565b90506133e881600084612f72565b6133f360008361261e565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134439190614dfa565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161354e8461197c565b6135589190614dfa565b905060006007600084815260200190815260200160002054905081811461363d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136c29190614dfa565b90506000600960008481526020019081526020016000205490506000600883815481106136f2576136f1615098565b5b90600052602060002001549050806008838154811061371457613713615098565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061376357613762615069565b5b6001900381819060005260206000200160009055905550505050565b600061378a8361197c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561386e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386590614a3f565b60405180910390fd5b613877816125b2565b156138b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ae9061489f565b60405180910390fd5b6138c360008383612f72565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139139190614d19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546139d890614eff565b90600052602060002090601f0160209004810192826139fa5760008555613a41565b82601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613a92565b5090565b508054613a5e90614eff565b6000825580601f10613a705750613a8f565b601f016020900490600052602060002090810190613a8e9190613a92565b5b50565b5b80821115613aab576000816000905550600101613a93565b5090565b6000613ac2613abd84614bfa565b614bd5565b90508083825260208201905082856020860282011115613ae557613ae46150fb565b5b60005b85811015613b155781613afb8882613ba3565b845260208401935060208301925050600181019050613ae8565b5050509392505050565b6000613b32613b2d84614c26565b614bd5565b905082815260208101848484011115613b4e57613b4d615100565b5b613b59848285614ebd565b509392505050565b6000613b74613b6f84614c57565b614bd5565b905082815260208101848484011115613b9057613b8f615100565b5b613b9b848285614ebd565b509392505050565b600081359050613bb2816158e9565b92915050565b600082601f830112613bcd57613bcc6150f6565b5b8135613bdd848260208601613aaf565b91505092915050565b600081359050613bf581615900565b92915050565b600081359050613c0a81615917565b92915050565b600081519050613c1f81615917565b92915050565b600082601f830112613c3a57613c396150f6565b5b8135613c4a848260208601613b1f565b91505092915050565b600082601f830112613c6857613c676150f6565b5b8135613c78848260208601613b61565b91505092915050565b600081359050613c908161592e565b92915050565b600081359050613ca581615945565b92915050565b600060208284031215613cc157613cc061510a565b5b6000613ccf84828501613ba3565b91505092915050565b60008060408385031215613cef57613cee61510a565b5b6000613cfd85828601613ba3565b9250506020613d0e85828601613ba3565b9150509250929050565b600080600060608486031215613d3157613d3061510a565b5b6000613d3f86828701613ba3565b9350506020613d5086828701613ba3565b9250506040613d6186828701613c96565b9150509250925092565b60008060008060808587031215613d8557613d8461510a565b5b6000613d9387828801613ba3565b9450506020613da487828801613ba3565b9350506040613db587828801613c96565b925050606085013567ffffffffffffffff811115613dd657613dd5615105565b5b613de287828801613c25565b91505092959194509250565b60008060408385031215613e0557613e0461510a565b5b6000613e1385828601613ba3565b9250506020613e2485828601613be6565b9150509250929050565b60008060408385031215613e4557613e4461510a565b5b6000613e5385828601613ba3565b9250506020613e6485828601613c96565b9150509250929050565b600060208284031215613e8457613e8361510a565b5b600082013567ffffffffffffffff811115613ea257613ea1615105565b5b613eae84828501613bb8565b91505092915050565b600060208284031215613ecd57613ecc61510a565b5b6000613edb84828501613be6565b91505092915050565b600060208284031215613efa57613ef961510a565b5b6000613f0884828501613bfb565b91505092915050565b600060208284031215613f2757613f2661510a565b5b6000613f3584828501613c10565b91505092915050565b600060208284031215613f5457613f5361510a565b5b600082013567ffffffffffffffff811115613f7257613f71615105565b5b613f7e84828501613c53565b91505092915050565b600060208284031215613f9d57613f9c61510a565b5b6000613fab84828501613c81565b91505092915050565b600060208284031215613fca57613fc961510a565b5b6000613fd884828501613c96565b91505092915050565b60008060408385031215613ff857613ff761510a565b5b600061400685828601613c96565b925050602083013567ffffffffffffffff81111561402757614026615105565b5b61403385828601613c53565b9150509250929050565b600080604083850312156140545761405361510a565b5b600061406285828601613c96565b925050602061407385828601613c96565b9150509250929050565b60006140898383614670565b60208301905092915050565b61409e81614e2e565b82525050565b60006140af82614cad565b6140b98185614cdb565b93506140c483614c88565b8060005b838110156140f55781516140dc888261407d565b97506140e783614cce565b9250506001810190506140c8565b5085935050505092915050565b61410b81614e40565b82525050565b600061411c82614cb8565b6141268185614cec565b9350614136818560208601614ecc565b61413f8161510f565b840191505092915050565b600061415582614cc3565b61415f8185614cfd565b935061416f818560208601614ecc565b6141788161510f565b840191505092915050565b600061418e82614cc3565b6141988185614d0e565b93506141a8818560208601614ecc565b80840191505092915050565b600081546141c181614eff565b6141cb8186614d0e565b945060018216600081146141e657600181146141f75761422a565b60ff1983168652818601935061422a565b61420085614c98565b60005b8381101561422257815481890152600182019150602081019050614203565b838801955050505b50505092915050565b6000614240602683614cfd565b915061424b82615120565b604082019050919050565b6000614263601483614cfd565b915061426e8261516f565b602082019050919050565b6000614286602283614cfd565b915061429182615198565b604082019050919050565b60006142a9602b83614cfd565b91506142b4826151e7565b604082019050919050565b60006142cc603283614cfd565b91506142d782615236565b604082019050919050565b60006142ef602683614cfd565b91506142fa82615285565b604082019050919050565b6000614312601c83614cfd565b915061431d826152d4565b602082019050919050565b6000614335601883614cfd565b9150614340826152fd565b602082019050919050565b6000614358602483614cfd565b915061436382615326565b604082019050919050565b600061437b601983614cfd565b915061438682615375565b602082019050919050565b600061439e602c83614cfd565b91506143a98261539e565b604082019050919050565b60006143c1601083614cfd565b91506143cc826153ed565b602082019050919050565b60006143e4601383614cfd565b91506143ef82615416565b602082019050919050565b6000614407603883614cfd565b91506144128261543f565b604082019050919050565b600061442a602b83614cfd565b91506144358261548e565b604082019050919050565b600061444d602a83614cfd565b9150614458826154dd565b604082019050919050565b6000614470602983614cfd565b915061447b8261552c565b604082019050919050565b6000614493602e83614cfd565b915061449e8261557b565b604082019050919050565b60006144b6601a83614cfd565b91506144c1826155ca565b602082019050919050565b60006144d9602083614cfd565b91506144e4826155f3565b602082019050919050565b60006144fc600f83614cfd565b91506145078261561c565b602082019050919050565b600061451f602c83614cfd565b915061452a82615645565b604082019050919050565b6000614542600583614d0e565b915061454d82615694565b600582019050919050565b6000614565602083614cfd565b9150614570826156bd565b602082019050919050565b6000614588602983614cfd565b9150614593826156e6565b604082019050919050565b60006145ab602183614cfd565b91506145b682615735565b604082019050919050565b60006145ce602d83614cfd565b91506145d982615784565b604082019050919050565b60006145f1603183614cfd565b91506145fc826157d3565b604082019050919050565b6000614614602c83614cfd565b915061461f82615822565b604082019050919050565b6000614637603083614cfd565b915061464282615871565b604082019050919050565b600061465a601483614cfd565b9150614665826158c0565b602082019050919050565b61467981614ea6565b82525050565b61468881614ea6565b82525050565b61469781614eb0565b82525050565b60006146a98285614183565b91506146b58284614183565b91506146c082614535565b91508190509392505050565b60006146d88285614183565b91506146e482846141b4565b91508190509392505050565b60006020820190506147056000830184614095565b92915050565b60006080820190506147206000830187614095565b61472d6020830186614095565b61473a604083018561467f565b818103606083015261474c8184614111565b905095945050505050565b600060408201905061476c6000830185614095565b614779602083018461467f565b9392505050565b6000602082019050818103600083015261479a81846140a4565b905092915050565b60006020820190506147b76000830184614102565b92915050565b600060208201905081810360008301526147d7818461414a565b905092915050565b600060208201905081810360008301526147f881614233565b9050919050565b6000602082019050818103600083015261481881614256565b9050919050565b6000602082019050818103600083015261483881614279565b9050919050565b600060208201905081810360008301526148588161429c565b9050919050565b60006020820190508181036000830152614878816142bf565b9050919050565b60006020820190508181036000830152614898816142e2565b9050919050565b600060208201905081810360008301526148b881614305565b9050919050565b600060208201905081810360008301526148d881614328565b9050919050565b600060208201905081810360008301526148f88161434b565b9050919050565b600060208201905081810360008301526149188161436e565b9050919050565b6000602082019050818103600083015261493881614391565b9050919050565b60006020820190508181036000830152614958816143b4565b9050919050565b60006020820190508181036000830152614978816143d7565b9050919050565b60006020820190508181036000830152614998816143fa565b9050919050565b600060208201905081810360008301526149b88161441d565b9050919050565b600060208201905081810360008301526149d881614440565b9050919050565b600060208201905081810360008301526149f881614463565b9050919050565b60006020820190508181036000830152614a1881614486565b9050919050565b60006020820190508181036000830152614a38816144a9565b9050919050565b60006020820190508181036000830152614a58816144cc565b9050919050565b60006020820190508181036000830152614a78816144ef565b9050919050565b60006020820190508181036000830152614a9881614512565b9050919050565b60006020820190508181036000830152614ab881614558565b9050919050565b60006020820190508181036000830152614ad88161457b565b9050919050565b60006020820190508181036000830152614af88161459e565b9050919050565b60006020820190508181036000830152614b18816145c1565b9050919050565b60006020820190508181036000830152614b38816145e4565b9050919050565b60006020820190508181036000830152614b5881614607565b9050919050565b60006020820190508181036000830152614b788161462a565b9050919050565b60006020820190508181036000830152614b988161464d565b9050919050565b6000602082019050614bb4600083018461467f565b92915050565b6000602082019050614bcf600083018461468e565b92915050565b6000614bdf614bf0565b9050614beb8282614f31565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1557614c146150c7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c4157614c406150c7565b5b614c4a8261510f565b9050602081019050919050565b600067ffffffffffffffff821115614c7257614c716150c7565b5b614c7b8261510f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d2482614ea6565b9150614d2f83614ea6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d6457614d63614fdc565b5b828201905092915050565b6000614d7a82614ea6565b9150614d8583614ea6565b925082614d9557614d9461500b565b5b828204905092915050565b6000614dab82614ea6565b9150614db683614ea6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614def57614dee614fdc565b5b828202905092915050565b6000614e0582614ea6565b9150614e1083614ea6565b925082821015614e2357614e22614fdc565b5b828203905092915050565b6000614e3982614e86565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614eea578082015181840152602081019050614ecf565b83811115614ef9576000848401525b50505050565b60006002820490506001821680614f1757607f821691505b60208210811415614f2b57614f2a61503a565b5b50919050565b614f3a8261510f565b810181811067ffffffffffffffff82111715614f5957614f586150c7565b5b80604052505050565b6000614f6d82614ea6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fa057614f9f614fdc565b5b600182019050919050565b6000614fb682614ea6565b9150614fc183614ea6565b925082614fd157614fd061500b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416d6f756e742045786365656473206d61782062757920706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4164647265737320646f6573276e74206861766520616e792066726565206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f7420496e63726561736520537570706c7921210000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820776173207061696400000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f203025000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f416c6c204e4654732068617665206265656e206d696e74656421000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f446f6573206e6f742065786973742e0000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f20372e352500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f416464726573732063616e6e6f7420626520302e000000000000000000000000600082015250565b6158f281614e2e565b81146158fd57600080fd5b50565b61590981614e40565b811461591457600080fd5b50565b61592081614e4c565b811461592b57600080fd5b50565b61593781614e78565b811461594257600080fd5b50565b61594e81614ea6565b811461595957600080fd5b5056fea26469706673582212203ac981631374f1f7533ff0ff709ad3f2fc4f30164533e955c99991d700cdde1a64736f6c63430008070033516d6261356f416151413738706f36547548317a364d73516a52366741663850524467704c317465727350625a7068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f

Deployed Bytecode

0x6080604052600436106102765760003560e01c80636461c2a41161014f57806391b7f5ed116100c1578063d0d41fe11161007a578063d0d41fe114610921578063d1d18f501461094a578063d5abeb0114610987578063e985e9c5146109b2578063f2fde38b146109ef578063f53bc83514610a185761027d565b806391b7f5ed1461081357806395d89b411461083c578063a035b1fe14610867578063a22cb46514610892578063b88d4fde146108bb578063c87b56dd146108e45761027d565b806370db69d61161011357806370db69d614610729578063715018a6146107545780638456cb591461076b578063862440e2146107825780638baafe13146107ab5780638da5cb5b146107e85761027d565b80636461c2a41461065357806364baeee81461067c5780636c0360eb146106985780636f8b44b0146106c357806370a08231146106ec5761027d565b806336e79a5a116101e857806342966c68116101ac57806342966c68146105455780634f6ccce71461056e57806355f804b3146105ab5780635b70ea9f146105d45780635c975abb146105eb5780636352211e146106165761027d565b806336e79a5a1461049c5780633ccfd60b146104c55780633f4ba83a146104dc57806340d097c3146104f357806342842e0e1461051c5761027d565b806318160ddd1161023a57806318160ddd1461037957806323b872dd146103a457806329ee566c146103cd5780632a3f300c146103f85780632a55205a146104215780632f745c591461045f5761027d565b806301ffc9a71461028257806306d254da146102bf57806306fdde03146102e8578063081812fc14610313578063095ea7b3146103505761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613ee4565b610a41565b6040516102b691906147a2565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613cab565b610abb565b005b3480156102f457600080fd5b506102fd610b7b565b60405161030a91906147bd565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190613fb4565b610c0d565b60405161034791906146f0565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190613e2e565b610c92565b005b34801561038557600080fd5b5061038e610daa565b60405161039b9190614b9f565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c69190613d18565b610db7565b005b3480156103d957600080fd5b506103e2610e17565b6040516103ef9190614b9f565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613eb7565b610e1d565b005b34801561042d57600080fd5b506104486004803603810190610443919061403d565b610eb6565b604051610456929190614757565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613e2e565b610f02565b6040516104939190614b9f565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be9190613f87565b610fa7565b005b3480156104d157600080fd5b506104da6110c2565b005b3480156104e857600080fd5b506104f161112d565b005b3480156104ff57600080fd5b5061051a60048036038101906105159190613cab565b6111b3565b005b34801561052857600080fd5b50610543600480360381019061053e9190613d18565b61123b565b005b34801561055157600080fd5b5061056c60048036038101906105679190613fb4565b61125b565b005b34801561057a57600080fd5b5061059560048036038101906105909190613fb4565b6112b7565b6040516105a29190614b9f565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613f3e565b611328565b005b3480156105e057600080fd5b506105e96113be565b005b3480156105f757600080fd5b506106006114ff565b60405161060d91906147a2565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613fb4565b611516565b60405161064a91906146f0565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190613e6e565b6115c8565b005b61069660048036038101906106919190613fb4565b611764565b005b3480156106a457600080fd5b506106ad611824565b6040516106ba91906147bd565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190613fb4565b6118b2565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613cab565b61197c565b6040516107209190614b9f565b60405180910390f35b34801561073557600080fd5b5061073e611a34565b60405161074b9190614b9f565b60405180910390f35b34801561076057600080fd5b50610769611a3a565b005b34801561077757600080fd5b50610780611b77565b005b34801561078e57600080fd5b506107a960048036038101906107a49190613fe1565b611bfd565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613cab565b611c87565b6040516107df9190614780565b60405180910390f35b3480156107f457600080fd5b506107fd611d91565b60405161080a91906146f0565b60405180910390f35b34801561081f57600080fd5b5061083a60048036038101906108359190613fb4565b611dbb565b005b34801561084857600080fd5b50610851611e41565b60405161085e91906147bd565b60405180910390f35b34801561087357600080fd5b5061087c611ed3565b6040516108899190614b9f565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613dee565b611ed9565b005b3480156108c757600080fd5b506108e260048036038101906108dd9190613d6b565b61205a565b005b3480156108f057600080fd5b5061090b60048036038101906109069190613fb4565b6120bc565b60405161091891906147bd565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613cab565b612184565b005b34801561095657600080fd5b50610971600480360381019061096c9190613cab565b612244565b60405161097e9190614bba565b60405180910390f35b34801561099357600080fd5b5061099c612264565b6040516109a99190614b9f565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d49190613cd8565b61226a565b6040516109e691906147a2565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a119190613cab565b6122fe565b005b348015610a2457600080fd5b50610a3f6004803603810190610a3a9190613fb4565b6124aa565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ab45750610ab382612530565b5b9050919050565b610ac36125aa565b73ffffffffffffffffffffffffffffffffffffffff16610ae1611d91565b73ffffffffffffffffffffffffffffffffffffffff1614610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e90614a9f565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610b8a90614eff565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb690614eff565b8015610c035780601f10610bd857610100808354040283529160200191610c03565b820191906000526020600020905b815481529060010190602001808311610be657829003601f168201915b5050505050905090565b6000610c18826125b2565b610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90614a7f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9d82611516565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0590614adf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d2d6125aa565b73ffffffffffffffffffffffffffffffffffffffff161480610d5c5750610d5b81610d566125aa565b61226a565b5b610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d929061497f565b60405180910390fd5b610da5838361261e565b505050565b6000600880549050905090565b610dc8610dc26125aa565b826126d7565b610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90614b1f565b60405180910390fd5b610e128383836127b5565b505050565b60165481565b610e256125aa565b73ffffffffffffffffffffffffffffffffffffffff16610e43611d91565b73ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614a9f565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060165485610eed9190614da0565b610ef79190614d6f565b915091509250929050565b6000610f0d8361197c565b8210610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f459061483f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610faf6125aa565b73ffffffffffffffffffffffffffffffffffffffff16610fcd611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90614a9f565b60405180910390fd5b60008161ffff16101561106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110629061499f565b60405180910390fd5b6102ee8161ffff1611156110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab90614aff565b60405180910390fd5b8061ffff1660168190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561112a573d6000803e3d6000fd5b50565b6111356125aa565b73ffffffffffffffffffffffffffffffffffffffff16611153611d91565b73ffffffffffffffffffffffffffffffffffffffff16146111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090614a9f565b60405180910390fd5b6111b1612a11565b565b6111bb6125aa565b73ffffffffffffffffffffffffffffffffffffffff166111d9611d91565b73ffffffffffffffffffffffffffffffffffffffff161461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690614a9f565b60405180910390fd5b61123881612ab3565b50565b6112568383836040518060200160405280600081525061205a565b505050565b61126c6112666125aa565b826126d7565b6112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614b5f565b60405180910390fd5b6112b481612b1e565b50565b60006112c1610daa565b8210611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f990614b3f565b60405180910390fd5b6008828154811061131657611315615098565b5b90600052602060002001549050919050565b6113306125aa565b73ffffffffffffffffffffffffffffffffffffffff1661134e611d91565b73ffffffffffffffffffffffffffffffffffffffff16146113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90614a9f565b60405180910390fd5b80601190805190602001906113ba9291906139cc565b5050565b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1611611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061481f565b60405180910390fd5b600d5461145b610daa565b1061149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614a1f565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506114fd33612ab3565b565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b6906149df565b60405180910390fd5b80915050919050565b6115d06125aa565b73ffffffffffffffffffffffffffffffffffffffff166115ee611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90614a9f565b60405180910390fd5b60005b815181101561176057600073ffffffffffffffffffffffffffffffffffffffff1682828151811061167b5761167a615098565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190614b7f565b60405180910390fd5b6001601560008484815181106116f3576116f2615098565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061175890614f62565b915050611647565b5050565b80600f546117729190614da0565b3410156117b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ab9061495f565b60405180910390fd5b600e548111156117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f0906147df565b60405180910390fd5b60005b818110156118205761180d33612ab3565b808061181890614f62565b9150506117fc565b5050565b6011805461183190614eff565b80601f016020809104026020016040519081016040528092919081815260200182805461185d90614eff565b80156118aa5780601f1061187f576101008083540402835291602001916118aa565b820191906000526020600020905b81548152906001019060200180831161188d57829003601f168201915b505050505081565b6118ba6125aa565b73ffffffffffffffffffffffffffffffffffffffff166118d8611d91565b73ffffffffffffffffffffffffffffffffffffffff161461192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614a9f565b60405180910390fd5b6101f48110611972576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611969906148bf565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e4906149bf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b611a426125aa565b73ffffffffffffffffffffffffffffffffffffffff16611a60611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614a9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b7f6125aa565b73ffffffffffffffffffffffffffffffffffffffff16611b9d611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea90614a9f565b60405180910390fd5b611bfb612b2a565b565b611c056125aa565b73ffffffffffffffffffffffffffffffffffffffff16611c23611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7090614a9f565b60405180910390fd5b611c838282612bcd565b5050565b60606000611c948361197c565b90506000811415611cf157600067ffffffffffffffff811115611cba57611cb96150c7565b5b604051908082528060200260200182016040528015611ce85781602001602082028036833780820191505090505b50915050611d8c565b60008167ffffffffffffffff811115611d0d57611d0c6150c7565b5b604051908082528060200260200182016040528015611d3b5781602001602082028036833780820191505090505b50905060005b82811015611d8557611d538582610f02565b828281518110611d6657611d65615098565b5b6020026020010181815250508080611d7d90614f62565b915050611d41565b8193505050505b919050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611dc36125aa565b73ffffffffffffffffffffffffffffffffffffffff16611de1611d91565b73ffffffffffffffffffffffffffffffffffffffff1614611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90614a9f565b60405180910390fd5b80600f8190555050565b606060018054611e5090614eff565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7c90614eff565b8015611ec95780601f10611e9e57610100808354040283529160200191611ec9565b820191906000526020600020905b815481529060010190602001808311611eac57829003601f168201915b5050505050905090565b600f5481565b611ee16125aa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906148ff565b60405180910390fd5b8060056000611f5c6125aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120096125aa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161204e91906147a2565b60405180910390a35050565b61206b6120656125aa565b836126d7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614b1f565b60405180910390fd5b6120b684848484612c41565b50505050565b6060816120c8816125b2565b612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90614a5f565b60405180910390fd5b601060009054906101000a900460ff1661214a57612123612c9d565b60126040516020016121369291906146cc565b60405160208183030381529060405261217c565b612152612c9d565b61215b84612d2f565b60405160200161216c92919061469d565b6040516020818303038152906040525b915050919050565b61218c6125aa565b73ffffffffffffffffffffffffffffffffffffffff166121aa611d91565b73ffffffffffffffffffffffffffffffffffffffff1614612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f790614a9f565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60156020528060005260406000206000915054906101000a900460ff1681565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123066125aa565b73ffffffffffffffffffffffffffffffffffffffff16612324611d91565b73ffffffffffffffffffffffffffffffffffffffff161461237a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237190614a9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e19061487f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124b26125aa565b73ffffffffffffffffffffffffffffffffffffffff166124d0611d91565b73ffffffffffffffffffffffffffffffffffffffff1614612526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251d90614a9f565b60405180910390fd5b80600e8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a357506125a282612e90565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269183611516565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126e2826125b2565b612721576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127189061491f565b60405180910390fd5b600061272c83611516565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061279b57508373ffffffffffffffffffffffffffffffffffffffff1661278384610c0d565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ac57506127ab818561226a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127d582611516565b73ffffffffffffffffffffffffffffffffffffffff161461282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282290614abf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561289b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612892906148df565b60405180910390fd5b6128a6838383612f72565b6128b160008261261e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129019190614dfa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129589190614d19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612a196114ff565b612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906147ff565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a9c6125aa565b604051612aa991906146f0565b60405180910390a1565b600d54612abe610daa565b10612afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af590614a1f565b60405180910390fd5b612b1181612b0c600c612fca565b612fd8565b612b1b600c612ff6565b50565b612b278161300c565b50565b612b326114ff565b15612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b699061493f565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612bb66125aa565b604051612bc391906146f0565b60405180910390a1565b612bd6826125b2565b612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0c906149ff565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190612c3c9291906139cc565b505050565b612c4c8484846127b5565b612c588484848461305f565b612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e9061485f565b60405180910390fd5b50505050565b606060118054612cac90614eff565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd890614eff565b8015612d255780601f10612cfa57610100808354040283529160200191612d25565b820191906000526020600020905b815481529060010190602001808311612d0857829003601f168201915b5050505050905090565b60606000821415612d77576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e8b565b600082905060005b60008214612da9578080612d9290614f62565b915050600a82612da29190614d6f565b9150612d7f565b60008167ffffffffffffffff811115612dc557612dc46150c7565b5b6040519080825280601f01601f191660200182016040528015612df75781602001600182028036833780820191505090505b5090505b60008514612e8457600182612e109190614dfa565b9150600a85612e1f9190614fab565b6030612e2b9190614d19565b60f81b818381518110612e4157612e40615098565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e7d9190614d6f565b9450612dfb565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f6b5750612f6a826131f6565b5b9050919050565b612f7a6114ff565b15612fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb19061493f565b60405180910390fd5b612fc5838383613260565b505050565b600081600001549050919050565b612ff2828260405180602001604052806000815250613374565b5050565b6001816000016000828254019250508190555050565b613015816133cf565b6000600a6000838152602001908152602001600020805461303590614eff565b90501461305c57600a6000828152602001908152602001600020600061305b9190613a52565b5b50565b60006130808473ffffffffffffffffffffffffffffffffffffffff166134e0565b156131e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130a96125aa565b8786866040518563ffffffff1660e01b81526004016130cb949392919061470b565b602060405180830381600087803b1580156130e557600080fd5b505af192505050801561311657506040513d601f19601f820116820180604052508101906131139190613f11565b60015b613199573d8060008114613146576040519150601f19603f3d011682016040523d82523d6000602084013e61314b565b606091505b50600081511415613191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131889061485f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131ee565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61326b8383836134f3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132ae576132a9816134f8565b6132ed565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132ec576132eb8382613541565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133305761332b816136ae565b61336f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461336e5761336d828261377f565b5b5b505050565b61337e83836137fe565b61338b600084848461305f565b6133ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c19061485f565b60405180910390fd5b505050565b60006133da82611516565b90506133e881600084612f72565b6133f360008361261e565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134439190614dfa565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161354e8461197c565b6135589190614dfa565b905060006007600084815260200190815260200160002054905081811461363d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136c29190614dfa565b90506000600960008481526020019081526020016000205490506000600883815481106136f2576136f1615098565b5b90600052602060002001549050806008838154811061371457613713615098565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061376357613762615069565b5b6001900381819060005260206000200160009055905550505050565b600061378a8361197c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561386e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386590614a3f565b60405180910390fd5b613877816125b2565b156138b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ae9061489f565b60405180910390fd5b6138c360008383612f72565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139139190614d19565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546139d890614eff565b90600052602060002090601f0160209004810192826139fa5760008555613a41565b82601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613a92565b5090565b508054613a5e90614eff565b6000825580601f10613a705750613a8f565b601f016020900490600052602060002090810190613a8e9190613a92565b5b50565b5b80821115613aab576000816000905550600101613a93565b5090565b6000613ac2613abd84614bfa565b614bd5565b90508083825260208201905082856020860282011115613ae557613ae46150fb565b5b60005b85811015613b155781613afb8882613ba3565b845260208401935060208301925050600181019050613ae8565b5050509392505050565b6000613b32613b2d84614c26565b614bd5565b905082815260208101848484011115613b4e57613b4d615100565b5b613b59848285614ebd565b509392505050565b6000613b74613b6f84614c57565b614bd5565b905082815260208101848484011115613b9057613b8f615100565b5b613b9b848285614ebd565b509392505050565b600081359050613bb2816158e9565b92915050565b600082601f830112613bcd57613bcc6150f6565b5b8135613bdd848260208601613aaf565b91505092915050565b600081359050613bf581615900565b92915050565b600081359050613c0a81615917565b92915050565b600081519050613c1f81615917565b92915050565b600082601f830112613c3a57613c396150f6565b5b8135613c4a848260208601613b1f565b91505092915050565b600082601f830112613c6857613c676150f6565b5b8135613c78848260208601613b61565b91505092915050565b600081359050613c908161592e565b92915050565b600081359050613ca581615945565b92915050565b600060208284031215613cc157613cc061510a565b5b6000613ccf84828501613ba3565b91505092915050565b60008060408385031215613cef57613cee61510a565b5b6000613cfd85828601613ba3565b9250506020613d0e85828601613ba3565b9150509250929050565b600080600060608486031215613d3157613d3061510a565b5b6000613d3f86828701613ba3565b9350506020613d5086828701613ba3565b9250506040613d6186828701613c96565b9150509250925092565b60008060008060808587031215613d8557613d8461510a565b5b6000613d9387828801613ba3565b9450506020613da487828801613ba3565b9350506040613db587828801613c96565b925050606085013567ffffffffffffffff811115613dd657613dd5615105565b5b613de287828801613c25565b91505092959194509250565b60008060408385031215613e0557613e0461510a565b5b6000613e1385828601613ba3565b9250506020613e2485828601613be6565b9150509250929050565b60008060408385031215613e4557613e4461510a565b5b6000613e5385828601613ba3565b9250506020613e6485828601613c96565b9150509250929050565b600060208284031215613e8457613e8361510a565b5b600082013567ffffffffffffffff811115613ea257613ea1615105565b5b613eae84828501613bb8565b91505092915050565b600060208284031215613ecd57613ecc61510a565b5b6000613edb84828501613be6565b91505092915050565b600060208284031215613efa57613ef961510a565b5b6000613f0884828501613bfb565b91505092915050565b600060208284031215613f2757613f2661510a565b5b6000613f3584828501613c10565b91505092915050565b600060208284031215613f5457613f5361510a565b5b600082013567ffffffffffffffff811115613f7257613f71615105565b5b613f7e84828501613c53565b91505092915050565b600060208284031215613f9d57613f9c61510a565b5b6000613fab84828501613c81565b91505092915050565b600060208284031215613fca57613fc961510a565b5b6000613fd884828501613c96565b91505092915050565b60008060408385031215613ff857613ff761510a565b5b600061400685828601613c96565b925050602083013567ffffffffffffffff81111561402757614026615105565b5b61403385828601613c53565b9150509250929050565b600080604083850312156140545761405361510a565b5b600061406285828601613c96565b925050602061407385828601613c96565b9150509250929050565b60006140898383614670565b60208301905092915050565b61409e81614e2e565b82525050565b60006140af82614cad565b6140b98185614cdb565b93506140c483614c88565b8060005b838110156140f55781516140dc888261407d565b97506140e783614cce565b9250506001810190506140c8565b5085935050505092915050565b61410b81614e40565b82525050565b600061411c82614cb8565b6141268185614cec565b9350614136818560208601614ecc565b61413f8161510f565b840191505092915050565b600061415582614cc3565b61415f8185614cfd565b935061416f818560208601614ecc565b6141788161510f565b840191505092915050565b600061418e82614cc3565b6141988185614d0e565b93506141a8818560208601614ecc565b80840191505092915050565b600081546141c181614eff565b6141cb8186614d0e565b945060018216600081146141e657600181146141f75761422a565b60ff1983168652818601935061422a565b61420085614c98565b60005b8381101561422257815481890152600182019150602081019050614203565b838801955050505b50505092915050565b6000614240602683614cfd565b915061424b82615120565b604082019050919050565b6000614263601483614cfd565b915061426e8261516f565b602082019050919050565b6000614286602283614cfd565b915061429182615198565b604082019050919050565b60006142a9602b83614cfd565b91506142b4826151e7565b604082019050919050565b60006142cc603283614cfd565b91506142d782615236565b604082019050919050565b60006142ef602683614cfd565b91506142fa82615285565b604082019050919050565b6000614312601c83614cfd565b915061431d826152d4565b602082019050919050565b6000614335601883614cfd565b9150614340826152fd565b602082019050919050565b6000614358602483614cfd565b915061436382615326565b604082019050919050565b600061437b601983614cfd565b915061438682615375565b602082019050919050565b600061439e602c83614cfd565b91506143a98261539e565b604082019050919050565b60006143c1601083614cfd565b91506143cc826153ed565b602082019050919050565b60006143e4601383614cfd565b91506143ef82615416565b602082019050919050565b6000614407603883614cfd565b91506144128261543f565b604082019050919050565b600061442a602b83614cfd565b91506144358261548e565b604082019050919050565b600061444d602a83614cfd565b9150614458826154dd565b604082019050919050565b6000614470602983614cfd565b915061447b8261552c565b604082019050919050565b6000614493602e83614cfd565b915061449e8261557b565b604082019050919050565b60006144b6601a83614cfd565b91506144c1826155ca565b602082019050919050565b60006144d9602083614cfd565b91506144e4826155f3565b602082019050919050565b60006144fc600f83614cfd565b91506145078261561c565b602082019050919050565b600061451f602c83614cfd565b915061452a82615645565b604082019050919050565b6000614542600583614d0e565b915061454d82615694565b600582019050919050565b6000614565602083614cfd565b9150614570826156bd565b602082019050919050565b6000614588602983614cfd565b9150614593826156e6565b604082019050919050565b60006145ab602183614cfd565b91506145b682615735565b604082019050919050565b60006145ce602d83614cfd565b91506145d982615784565b604082019050919050565b60006145f1603183614cfd565b91506145fc826157d3565b604082019050919050565b6000614614602c83614cfd565b915061461f82615822565b604082019050919050565b6000614637603083614cfd565b915061464282615871565b604082019050919050565b600061465a601483614cfd565b9150614665826158c0565b602082019050919050565b61467981614ea6565b82525050565b61468881614ea6565b82525050565b61469781614eb0565b82525050565b60006146a98285614183565b91506146b58284614183565b91506146c082614535565b91508190509392505050565b60006146d88285614183565b91506146e482846141b4565b91508190509392505050565b60006020820190506147056000830184614095565b92915050565b60006080820190506147206000830187614095565b61472d6020830186614095565b61473a604083018561467f565b818103606083015261474c8184614111565b905095945050505050565b600060408201905061476c6000830185614095565b614779602083018461467f565b9392505050565b6000602082019050818103600083015261479a81846140a4565b905092915050565b60006020820190506147b76000830184614102565b92915050565b600060208201905081810360008301526147d7818461414a565b905092915050565b600060208201905081810360008301526147f881614233565b9050919050565b6000602082019050818103600083015261481881614256565b9050919050565b6000602082019050818103600083015261483881614279565b9050919050565b600060208201905081810360008301526148588161429c565b9050919050565b60006020820190508181036000830152614878816142bf565b9050919050565b60006020820190508181036000830152614898816142e2565b9050919050565b600060208201905081810360008301526148b881614305565b9050919050565b600060208201905081810360008301526148d881614328565b9050919050565b600060208201905081810360008301526148f88161434b565b9050919050565b600060208201905081810360008301526149188161436e565b9050919050565b6000602082019050818103600083015261493881614391565b9050919050565b60006020820190508181036000830152614958816143b4565b9050919050565b60006020820190508181036000830152614978816143d7565b9050919050565b60006020820190508181036000830152614998816143fa565b9050919050565b600060208201905081810360008301526149b88161441d565b9050919050565b600060208201905081810360008301526149d881614440565b9050919050565b600060208201905081810360008301526149f881614463565b9050919050565b60006020820190508181036000830152614a1881614486565b9050919050565b60006020820190508181036000830152614a38816144a9565b9050919050565b60006020820190508181036000830152614a58816144cc565b9050919050565b60006020820190508181036000830152614a78816144ef565b9050919050565b60006020820190508181036000830152614a9881614512565b9050919050565b60006020820190508181036000830152614ab881614558565b9050919050565b60006020820190508181036000830152614ad88161457b565b9050919050565b60006020820190508181036000830152614af88161459e565b9050919050565b60006020820190508181036000830152614b18816145c1565b9050919050565b60006020820190508181036000830152614b38816145e4565b9050919050565b60006020820190508181036000830152614b5881614607565b9050919050565b60006020820190508181036000830152614b788161462a565b9050919050565b60006020820190508181036000830152614b988161464d565b9050919050565b6000602082019050614bb4600083018461467f565b92915050565b6000602082019050614bcf600083018461468e565b92915050565b6000614bdf614bf0565b9050614beb8282614f31565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1557614c146150c7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c4157614c406150c7565b5b614c4a8261510f565b9050602081019050919050565b600067ffffffffffffffff821115614c7257614c716150c7565b5b614c7b8261510f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d2482614ea6565b9150614d2f83614ea6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d6457614d63614fdc565b5b828201905092915050565b6000614d7a82614ea6565b9150614d8583614ea6565b925082614d9557614d9461500b565b5b828204905092915050565b6000614dab82614ea6565b9150614db683614ea6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614def57614dee614fdc565b5b828202905092915050565b6000614e0582614ea6565b9150614e1083614ea6565b925082821015614e2357614e22614fdc565b5b828203905092915050565b6000614e3982614e86565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614eea578082015181840152602081019050614ecf565b83811115614ef9576000848401525b50505050565b60006002820490506001821680614f1757607f821691505b60208210811415614f2b57614f2a61503a565b5b50919050565b614f3a8261510f565b810181811067ffffffffffffffff82111715614f5957614f586150c7565b5b80604052505050565b6000614f6d82614ea6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fa057614f9f614fdc565b5b600182019050919050565b6000614fb682614ea6565b9150614fc183614ea6565b925082614fd157614fd061500b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416d6f756e742045786365656473206d61782062757920706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4164647265737320646f6573276e74206861766520616e792066726565206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f7420496e63726561736520537570706c7921210000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820776173207061696400000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f203025000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f416c6c204e4654732068617665206265656e206d696e74656421000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f446f6573206e6f742065786973742e0000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f20372e352500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f416464726573732063616e6e6f7420626520302e000000000000000000000000600082015250565b6158f281614e2e565b81146158fd57600080fd5b50565b61590981614e40565b811461591457600080fd5b50565b61592081614e4c565b811461592b57600080fd5b50565b61593781614e78565b811461594257600080fd5b50565b61594e81614ea6565b811461595957600080fd5b5056fea26469706673582212203ac981631374f1f7533ff0ff709ad3f2fc4f30164533e955c99991d700cdde1a64736f6c63430008070033

Deployed Bytecode Sourcemap

52877:6550:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57827:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57234:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22843:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24425:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23948:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37509:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25484:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53594:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56382:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55484:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37090:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56926:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59284:97;;;;;;;;;;;;;:::i;:::-;;55829:65;;;;;;;;;;;;;:::i;:::-;;57727:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25931:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50266:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37699:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56178:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54210:273;;;;;;;;;;;;;:::i;:::-;;46263:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22450:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56611:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53861:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53272:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56002:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22093:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53162:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49220:148;;;;;;;;;;;;;:::i;:::-;;55760:61;;;;;;;;;;;;;:::i;:::-;;56487:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54833:530;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48569:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56288:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23012:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53195:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24805:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26187:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54491:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57368:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53537:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53125:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25203:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49523:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55902:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57827:292;57975:4;58032:26;58017:41;;;:11;:41;;;;:94;;;;58075:36;58099:11;58075:23;:36::i;:::-;58017:94;57997:114;;57827:292;;;:::o;57234:122::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57333:15:::1;57316:14;;:32;;;;;;;;;;;;;;;;;;57234:122:::0;:::o;22843:100::-;22897:13;22930:5;22923:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22843:100;:::o;24425:308::-;24546:7;24593:16;24601:7;24593;:16::i;:::-;24571:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24701:15;:24;24717:7;24701:24;;;;;;;;;;;;;;;;;;;;;24694:31;;24425:308;;;:::o;23948:411::-;24029:13;24045:23;24060:7;24045:14;:23::i;:::-;24029:39;;24093:5;24087:11;;:2;:11;;;;24079:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24187:5;24171:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24196:37;24213:5;24220:12;:10;:12::i;:::-;24196:16;:37::i;:::-;24171:62;24149:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24330:21;24339:2;24343:7;24330:8;:21::i;:::-;24018:341;23948:411;;:::o;37509:113::-;37570:7;37597:10;:17;;;;37590:24;;37509:113;:::o;25484:376::-;25693:41;25712:12;:10;:12::i;:::-;25726:7;25693:18;:41::i;:::-;25671:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25824:28;25834:4;25840:2;25844:7;25824:9;:28::i;:::-;25484:376;;;:::o;53594:28::-;;;;:::o;56382:87::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56455:6:::1;56442:10;;:19;;;;;;;;;;;;;;;;;;56382:87:::0;:::o;55484:238::-;55602:16;55620:21;55667:14;;;;;;;;;;;55708:5;55697:7;;55684:10;:20;;;;:::i;:::-;55683:30;;;;:::i;:::-;55659:55;;;;55484:238;;;;;:::o;37090:343::-;37232:7;37287:23;37304:5;37287:16;:23::i;:::-;37279:5;:31;37257:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37399:12;:19;37412:5;37399:19;;;;;;;;;;;;;;;:26;37419:5;37399:26;;;;;;;;;;;;37392:33;;37090:343;;;;:::o;56926:296::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57013:1:::1;57001:8;:13;;;;56993:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;57107:3;57095:8;:15;;;;57073:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;57206:8;57196:18;;:7;:18;;;;56926:296:::0;:::o;59284:97::-;59330:10;;;;;;;;;;;59322:28;;:51;59351:21;59322:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59284:97::o;55829:65::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55876:10:::1;:8;:10::i;:::-;55829:65::o:0;57727:82::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57785:16:::1;57798:2;57785:12;:16::i;:::-;57727:82:::0;:::o;25931:185::-;26069:39;26086:4;26092:2;26096:7;26069:39;;;;;;;;;;;;:16;:39::i;:::-;25931:185;;;:::o;50266:282::-;50398:41;50417:12;:10;:12::i;:::-;50431:7;50398:18;:41::i;:::-;50376:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;50526:14;50532:7;50526:5;:14::i;:::-;50266:282;:::o;37699:320::-;37819:7;37874:30;:28;:30::i;:::-;37866:5;:38;37844:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;37994:10;38005:5;37994:17;;;;;;;;:::i;:::-;;;;;;;;;;37987:24;;37699:320;;;:::o;56178:102::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56262:10:::1;56252:7;:20;;;;;;;;;;;;:::i;:::-;;56178:102:::0;:::o;54210:273::-;54286:1;54256:15;:27;54272:10;54256:27;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;54248:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54360:9;;54344:13;:11;:13::i;:::-;:25;54336:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54439:1;54411:15;:27;54427:10;54411:27;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54451:24;54464:10;54451:12;:24::i;:::-;54210:273::o;46263:86::-;46310:4;46334:7;;;;;;;;;;;46327:14;;46263:86;:::o;22450:326::-;22567:7;22592:13;22608:7;:16;22616:7;22608:16;;;;;;;;;;;;;;;;;;;;;22592:32;;22674:1;22657:19;;:5;:19;;;;22635:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22763:5;22756:12;;;22450:326;;;:::o;56611:303::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56728:9:::1;56723:184;56747:10;:17;56743:1;:21;56723:184;;;56819:1;56794:27;;:10;56805:1;56794:13;;;;;;;;:::i;:::-;;;;;;;;:27;;;;56786:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56894:1;56861:15;:30;56877:10;56888:1;56877:13;;;;;;;;:::i;:::-;;;;;;;;56861:30;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;56766:3;;;;;:::i;:::-;;;;56723:184;;;;56611:303:::0;:::o;53861:341::-;53951:6;53943:5;;:14;;;;:::i;:::-;53930:9;:27;;53922:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54024:6;;54014;:16;;53992:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;54112:9;54107:88;54131:6;54127:1;:10;54107:88;;;54159:24;54172:10;54159:12;:24::i;:::-;54139:3;;;;;:::i;:::-;;;;54107:88;;;;53861:341;:::o;53272:58::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56002:168::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56095:3:::1;56082:12;:16;56074:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56150:12;56138:9;:24;;;;56002:168:::0;:::o;22093:295::-;22210:7;22274:1;22257:19;;:5;:19;;;;22235:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22364:9;:16;22374:5;22364:16;;;;;;;;;;;;;;;;22357:23;;22093:295;;;:::o;53162:26::-;;;;:::o;49220:148::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49327:1:::1;49290:40;;49311:6;;;;;;;;;;;49290:40;;;;;;;;;;;;49358:1;49341:6;;:19;;;;;;;;;;;;;;;;;;49220:148::o:0;55760:61::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55805:8:::1;:6;:8::i;:::-;55760:61::o:0;56487:116::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56569:26:::1;56582:7;56591:3;56569:12;:26::i;:::-;56487:116:::0;;:::o;54833:530::-;54918:16;54952:18;54973:17;54983:6;54973:9;:17::i;:::-;54952:38;;55019:1;55005:10;:15;55001:355;;;55058:1;55044:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55037:23;;;;;55001:355;55093:23;55133:10;55119:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55093:51;;55159:13;55187:130;55211:10;55203:5;:18;55187:130;;;55267:34;55287:6;55295:5;55267:19;:34::i;:::-;55251:6;55258:5;55251:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;55223:7;;;;;:::i;:::-;;;;55187:130;;;55338:6;55331:13;;;;;54833:530;;;;:::o;48569:87::-;48615:7;48642:6;;;;;;;;;;;48635:13;;48569:87;:::o;56288:88::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56360:8:::1;56352:5;:16;;;;56288:88:::0;:::o;23012:104::-;23068:13;23101:7;23094:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23012:104;:::o;53195:32::-;;;;:::o;24805:327::-;24952:12;:10;:12::i;:::-;24940:24;;:8;:24;;;;24932:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25052:8;25007:18;:32;25026:12;:10;:12::i;:::-;25007:32;;;;;;;;;;;;;;;:42;25040:8;25007:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25105:8;25076:48;;25091:12;:10;:12::i;:::-;25076:48;;;25115:8;25076:48;;;;;;:::i;:::-;;;;;;;;24805:327;;:::o;26187:365::-;26376:41;26395:12;:10;:12::i;:::-;26409:7;26376:18;:41::i;:::-;26354:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26505:39;26519:4;26525:2;26529:7;26538:5;26505:13;:39::i;:::-;26187:365;;;;:::o;54491:332::-;54648:13;54621:7;55424:12;55432:3;55424:7;:12::i;:::-;55416:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;54686:10:::1;;;;;;;;;;;:129;;54788:10;:8;:10::i;:::-;54799:14;54771:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54686:129;;;54724:10;:8;:10::i;:::-;54735:17;54744:7;54735:8;:17::i;:::-;54707:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54686:129;54679:136;;54491:332:::0;;;;:::o;57368:100::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57452:8:::1;57439:10;;:21;;;;;;;;;;;;;;;;;;57368:100:::0;:::o;53537:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;53125:30::-;;;;:::o;25203:214::-;25345:4;25374:18;:25;25393:5;25374:25;;;;;;;;;;;;;;;:35;25400:8;25374:35;;;;;;;;;;;;;;;;;;;;;;;;;25367:42;;25203:214;;;;:::o;49523:281::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49646:1:::1;49626:22;;:8;:22;;;;49604:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49759:8;49730:38;;49751:6;;;;;;;;;;;49730:38;;;;;;;;;;;;49788:8;49779:6;;:17;;;;;;;;;;;;;;;;;;49523:281:::0;:::o;55902:92::-;48800:12;:10;:12::i;:::-;48789:23;;:7;:5;:7::i;:::-;:23;;;48781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55977:9:::1;55968:6;:18;;;;55902:92:::0;:::o;36706:300::-;36853:4;36910:35;36895:50;;;:11;:50;;;;:103;;;;36962:36;36986:11;36962:23;:36::i;:::-;36895:103;36875:123;;36706:300;;;:::o;16898:98::-;16951:7;16978:10;16971:17;;16898:98;:::o;28099:127::-;28164:4;28216:1;28188:30;;:7;:16;28196:7;28188:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28181:37;;28099:127;;;:::o;32222:174::-;32324:2;32297:15;:24;32313:7;32297:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32380:7;32376:2;32342:46;;32351:23;32366:7;32351:14;:23::i;:::-;32342:46;;;;;;;;;;;;32222:174;;:::o;28393:452::-;28522:4;28566:16;28574:7;28566;:16::i;:::-;28544:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28665:13;28681:23;28696:7;28681:14;:23::i;:::-;28665:39;;28734:5;28723:16;;:7;:16;;;:64;;;;28780:7;28756:31;;:20;28768:7;28756:11;:20::i;:::-;:31;;;28723:64;:113;;;;28804:32;28821:5;28828:7;28804:16;:32::i;:::-;28723:113;28715:122;;;28393:452;;;;:::o;31489:615::-;31662:4;31635:31;;:23;31650:7;31635:14;:23::i;:::-;:31;;;31613:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;31768:1;31754:16;;:2;:16;;;;31746:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31824:39;31845:4;31851:2;31855:7;31824:20;:39::i;:::-;31928:29;31945:1;31949:7;31928:8;:29::i;:::-;31989:1;31970:9;:15;31980:4;31970:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32018:1;32001:9;:13;32011:2;32001:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32049:2;32030:7;:16;32038:7;32030:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32088:7;32084:2;32069:27;;32078:4;32069:27;;;;;;;;;;;;31489:615;;;:::o;47322:120::-;46866:8;:6;:8::i;:::-;46858:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;47391:5:::1;47381:7;;:15;;;;;;;;;;;;;;;;;;47412:22;47421:12;:10;:12::i;:::-;47412:22;;;;;;:::i;:::-;;;;;;;;47322:120::o:0;57504:215::-;57582:9;;57566:13;:11;:13::i;:::-;:25;57558:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57633:40;57643:2;57647:25;:15;:23;:25::i;:::-;57633:9;:40::i;:::-;57684:27;:15;:25;:27::i;:::-;57504:215;:::o;59105:138::-;59215:20;59227:7;59215:11;:20::i;:::-;59105:138;:::o;47063:118::-;46589:8;:6;:8::i;:::-;46588:9;46580:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;47133:4:::1;47123:7;;:14;;;;;;;;;;;;;;;;;;47153:20;47160:12;:10;:12::i;:::-;47153:20;;;;;;:::i;:::-;;;;;;;;47063:118::o:0;44470:277::-;44607:16;44615:7;44607;:16::i;:::-;44585:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44730:9;44708:10;:19;44719:7;44708:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;44470:277;;:::o;27434:352::-;27591:28;27601:4;27607:2;27611:7;27591:9;:28::i;:::-;27652:48;27675:4;27681:2;27685:7;27694:5;27652:22;:48::i;:::-;27630:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27434:352;;;;:::o;53753:100::-;53805:13;53838:7;53831:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53753:100;:::o;58368:723::-;58424:13;58654:1;58645:5;:10;58641:53;;;58672:10;;;;;;;;;;;;;;;;;;;;;58641:53;58704:12;58719:5;58704:20;;58735:14;58760:78;58775:1;58767:4;:9;58760:78;;58793:8;;;;;:::i;:::-;;;;58824:2;58816:10;;;;;:::i;:::-;;;58760:78;;;58848:19;58880:6;58870:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58848:39;;58898:154;58914:1;58905:5;:10;58898:154;;58942:1;58932:11;;;;;:::i;:::-;;;59009:2;59001:5;:10;;;;:::i;:::-;58988:2;:24;;;;:::i;:::-;58975:39;;58958:6;58965;58958:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;59038:2;59029:11;;;;;:::i;:::-;;;58898:154;;;59076:6;59062:21;;;;;58368:723;;;;:::o;21674:355::-;21821:4;21878:25;21863:40;;;:11;:40;;;;:105;;;;21935:33;21920:48;;;:11;:48;;;;21863:105;:158;;;;21985:36;22009:11;21985:23;:36::i;:::-;21863:158;21843:178;;21674:355;;;:::o;58131:229::-;46589:8;:6;:8::i;:::-;46588:9;46580:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;58307:45:::1;58334:4;58340:2;58344:7;58307:26;:45::i;:::-;58131:229:::0;;;:::o;51374:114::-;51439:7;51466;:14;;;51459:21;;51374:114;;;:::o;29187:110::-;29263:26;29273:2;29277:7;29263:26;;;;;;;;;;;;:9;:26::i;:::-;29187:110;;:::o;51496:127::-;51603:1;51585:7;:14;;;:19;;;;;;;;;;;51496:127;:::o;44976:206::-;45045:20;45057:7;45045:11;:20::i;:::-;45119:1;45088:10;:19;45099:7;45088:19;;;;;;;;;;;45082:33;;;;;:::i;:::-;;;:38;45078:97;;45144:10;:19;45155:7;45144:19;;;;;;;;;;;;45137:26;;;;:::i;:::-;45078:97;44976:206;:::o;32961:1053::-;33116:4;33137:15;:2;:13;;;:15::i;:::-;33133:874;;;33206:2;33190:36;;;33249:12;:10;:12::i;:::-;33284:4;33311:7;33341:5;33190:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33169:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33569:1;33552:6;:13;:18;33548:389;;;33595:108;;;;;;;;;;:::i;:::-;;;;;;;;33548:389;33887:6;33881:13;33872:6;33868:2;33864:15;33857:38;33169:783;33439:45;;;33429:55;;;:6;:55;;;;33422:62;;;;;33133:874;33991:4;33984:11;;32961:1053;;;;;;;:::o;20140:207::-;20270:4;20314:25;20299:40;;;:11;:40;;;;20292:47;;20140:207;;;:::o;38632:589::-;38776:45;38803:4;38809:2;38813:7;38776:26;:45::i;:::-;38854:1;38838:18;;:4;:18;;;38834:187;;;38873:40;38905:7;38873:31;:40::i;:::-;38834:187;;;38943:2;38935:10;;:4;:10;;;38931:90;;38962:47;38995:4;39001:7;38962:32;:47::i;:::-;38931:90;38834:187;39049:1;39035:16;;:2;:16;;;39031:183;;;39068:45;39105:7;39068:36;:45::i;:::-;39031:183;;;39141:4;39135:10;;:2;:10;;;39131:83;;39162:40;39190:2;39194:7;39162:27;:40::i;:::-;39131:83;39031:183;38632:589;;;:::o;29524:321::-;29654:18;29660:2;29664:7;29654:5;:18::i;:::-;29705:54;29736:1;29740:2;29744:7;29753:5;29705:22;:54::i;:::-;29683:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29524:321;;;:::o;30792:360::-;30852:13;30868:23;30883:7;30868:14;:23::i;:::-;30852:39;;30904:48;30925:5;30940:1;30944:7;30904:20;:48::i;:::-;30993:29;31010:1;31014:7;30993:8;:29::i;:::-;31055:1;31035:9;:16;31045:5;31035:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31074:7;:16;31082:7;31074:16;;;;;;;;;;;;31067:23;;;;;;;;;;;31136:7;31132:1;31108:36;;31117:5;31108:36;;;;;;;;;;;;30841:311;30792:360;:::o;8312:444::-;8372:4;8580:12;8704:7;8692:20;8684:28;;8747:1;8740:4;:8;8733:15;;;8312:444;;;:::o;34627:126::-;;;;:::o;39944:164::-;40048:10;:17;;;;40021:15;:24;40037:7;40021:24;;;;;;;;;;;:44;;;;40076:10;40092:7;40076:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39944:164;:::o;40735:1002::-;41015:22;41065:1;41040:22;41057:4;41040:16;:22::i;:::-;:26;;;;:::i;:::-;41015:51;;41077:18;41098:17;:26;41116:7;41098:26;;;;;;;;;;;;41077:47;;41245:14;41231:10;:28;41227:328;;41276:19;41298:12;:18;41311:4;41298:18;;;;;;;;;;;;;;;:34;41317:14;41298:34;;;;;;;;;;;;41276:56;;41382:11;41349:12;:18;41362:4;41349:18;;;;;;;;;;;;;;;:30;41368:10;41349:30;;;;;;;;;;;:44;;;;41499:10;41466:17;:30;41484:11;41466:30;;;;;;;;;;;:43;;;;41261:294;41227:328;41651:17;:26;41669:7;41651:26;;;;;;;;;;;41644:33;;;41695:12;:18;41708:4;41695:18;;;;;;;;;;;;;;;:34;41714:14;41695:34;;;;;;;;;;;41688:41;;;40830:907;;40735:1002;;:::o;42032:1079::-;42285:22;42330:1;42310:10;:17;;;;:21;;;;:::i;:::-;42285:46;;42342:18;42363:15;:24;42379:7;42363:24;;;;;;;;;;;;42342:45;;42714:19;42736:10;42747:14;42736:26;;;;;;;;:::i;:::-;;;;;;;;;;42714:48;;42800:11;42775:10;42786;42775:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42911:10;42880:15;:28;42896:11;42880:28;;;;;;;;;;;:41;;;;43052:15;:24;43068:7;43052:24;;;;;;;;;;;43045:31;;;43087:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42103:1008;;;42032:1079;:::o;39522:221::-;39607:14;39624:20;39641:2;39624:16;:20::i;:::-;39607:37;;39682:7;39655:12;:16;39668:2;39655:16;;;;;;;;;;;;;;;:24;39672:6;39655:24;;;;;;;;;;;:34;;;;39729:6;39700:17;:26;39718:7;39700:26;;;;;;;;;;;:35;;;;39596:147;39522:221;;:::o;30181:382::-;30275:1;30261:16;;:2;:16;;;;30253:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30334:16;30342:7;30334;:16::i;:::-;30333:17;30325:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30396:45;30425:1;30429:2;30433:7;30396:20;:45::i;:::-;30471:1;30454:9;:13;30464:2;30454:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30502:2;30483:7;:16;30491:7;30483:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30547:7;30543:2;30522:33;;30539:1;30522:33;;;;;;;;;;;;30181:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:137::-;3315:5;3353:6;3340:20;3331:29;;3369:32;3395:5;3369:32;:::i;:::-;3270:137;;;;:::o;3413:139::-;3459:5;3497:6;3484:20;3475:29;;3513:33;3540:5;3513:33;:::i;:::-;3413:139;;;;:::o;3558:329::-;3617:6;3666:2;3654:9;3645:7;3641:23;3637:32;3634:119;;;3672:79;;:::i;:::-;3634:119;3792:1;3817:53;3862:7;3853:6;3842:9;3838:22;3817:53;:::i;:::-;3807:63;;3763:117;3558:329;;;;:::o;3893:474::-;3961:6;3969;4018:2;4006:9;3997:7;3993:23;3989:32;3986:119;;;4024:79;;:::i;:::-;3986:119;4144:1;4169:53;4214:7;4205:6;4194:9;4190:22;4169:53;:::i;:::-;4159:63;;4115:117;4271:2;4297:53;4342:7;4333:6;4322:9;4318:22;4297:53;:::i;:::-;4287:63;;4242:118;3893:474;;;;;:::o;4373:619::-;4450:6;4458;4466;4515:2;4503:9;4494:7;4490:23;4486:32;4483:119;;;4521:79;;:::i;:::-;4483:119;4641:1;4666:53;4711:7;4702:6;4691:9;4687:22;4666:53;:::i;:::-;4656:63;;4612:117;4768:2;4794:53;4839:7;4830:6;4819:9;4815:22;4794:53;:::i;:::-;4784:63;;4739:118;4896:2;4922:53;4967:7;4958:6;4947:9;4943:22;4922:53;:::i;:::-;4912:63;;4867:118;4373:619;;;;;:::o;4998:943::-;5093:6;5101;5109;5117;5166:3;5154:9;5145:7;5141:23;5137:33;5134:120;;;5173:79;;:::i;:::-;5134:120;5293:1;5318:53;5363:7;5354:6;5343:9;5339:22;5318:53;:::i;:::-;5308:63;;5264:117;5420:2;5446:53;5491:7;5482:6;5471:9;5467:22;5446:53;:::i;:::-;5436:63;;5391:118;5548:2;5574:53;5619:7;5610:6;5599:9;5595:22;5574:53;:::i;:::-;5564:63;;5519:118;5704:2;5693:9;5689:18;5676:32;5735:18;5727:6;5724:30;5721:117;;;5757:79;;:::i;:::-;5721:117;5862:62;5916:7;5907:6;5896:9;5892:22;5862:62;:::i;:::-;5852:72;;5647:287;4998:943;;;;;;;:::o;5947:468::-;6012:6;6020;6069:2;6057:9;6048:7;6044:23;6040:32;6037:119;;;6075:79;;:::i;:::-;6037:119;6195:1;6220:53;6265:7;6256:6;6245:9;6241:22;6220:53;:::i;:::-;6210:63;;6166:117;6322:2;6348:50;6390:7;6381:6;6370:9;6366:22;6348:50;:::i;:::-;6338:60;;6293:115;5947:468;;;;;:::o;6421:474::-;6489:6;6497;6546:2;6534:9;6525:7;6521:23;6517:32;6514:119;;;6552:79;;:::i;:::-;6514:119;6672:1;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6643:117;6799:2;6825:53;6870:7;6861:6;6850:9;6846:22;6825:53;:::i;:::-;6815:63;;6770:118;6421:474;;;;;:::o;6901:539::-;6985:6;7034:2;7022:9;7013:7;7009:23;7005:32;7002:119;;;7040:79;;:::i;:::-;7002:119;7188:1;7177:9;7173:17;7160:31;7218:18;7210:6;7207:30;7204:117;;;7240:79;;:::i;:::-;7204:117;7345:78;7415:7;7406:6;7395:9;7391:22;7345:78;:::i;:::-;7335:88;;7131:302;6901:539;;;;:::o;7446:323::-;7502:6;7551:2;7539:9;7530:7;7526:23;7522:32;7519:119;;;7557:79;;:::i;:::-;7519:119;7677:1;7702:50;7744:7;7735:6;7724:9;7720:22;7702:50;:::i;:::-;7692:60;;7648:114;7446:323;;;;:::o;7775:327::-;7833:6;7882:2;7870:9;7861:7;7857:23;7853:32;7850:119;;;7888:79;;:::i;:::-;7850:119;8008:1;8033:52;8077:7;8068:6;8057:9;8053:22;8033:52;:::i;:::-;8023:62;;7979:116;7775:327;;;;:::o;8108:349::-;8177:6;8226:2;8214:9;8205:7;8201:23;8197:32;8194:119;;;8232:79;;:::i;:::-;8194:119;8352:1;8377:63;8432:7;8423:6;8412:9;8408:22;8377:63;:::i;:::-;8367:73;;8323:127;8108:349;;;;:::o;8463:509::-;8532:6;8581:2;8569:9;8560:7;8556:23;8552:32;8549:119;;;8587:79;;:::i;:::-;8549:119;8735:1;8724:9;8720:17;8707:31;8765:18;8757:6;8754:30;8751:117;;;8787:79;;:::i;:::-;8751:117;8892:63;8947:7;8938:6;8927:9;8923:22;8892:63;:::i;:::-;8882:73;;8678:287;8463:509;;;;:::o;8978:327::-;9036:6;9085:2;9073:9;9064:7;9060:23;9056:32;9053:119;;;9091:79;;:::i;:::-;9053:119;9211:1;9236:52;9280:7;9271:6;9260:9;9256:22;9236:52;:::i;:::-;9226:62;;9182:116;8978:327;;;;:::o;9311:329::-;9370:6;9419:2;9407:9;9398:7;9394:23;9390:32;9387:119;;;9425:79;;:::i;:::-;9387:119;9545:1;9570:53;9615:7;9606:6;9595:9;9591:22;9570:53;:::i;:::-;9560:63;;9516:117;9311:329;;;;:::o;9646:654::-;9724:6;9732;9781:2;9769:9;9760:7;9756:23;9752:32;9749:119;;;9787:79;;:::i;:::-;9749:119;9907:1;9932:53;9977:7;9968:6;9957:9;9953:22;9932:53;:::i;:::-;9922:63;;9878:117;10062:2;10051:9;10047:18;10034:32;10093:18;10085:6;10082:30;10079:117;;;10115:79;;:::i;:::-;10079:117;10220:63;10275:7;10266:6;10255:9;10251:22;10220:63;:::i;:::-;10210:73;;10005:288;9646:654;;;;;:::o;10306:474::-;10374:6;10382;10431:2;10419:9;10410:7;10406:23;10402:32;10399:119;;;10437:79;;:::i;:::-;10399:119;10557:1;10582:53;10627:7;10618:6;10607:9;10603:22;10582:53;:::i;:::-;10572:63;;10528:117;10684:2;10710:53;10755:7;10746:6;10735:9;10731:22;10710:53;:::i;:::-;10700:63;;10655:118;10306:474;;;;;:::o;10786:179::-;10855:10;10876:46;10918:3;10910:6;10876:46;:::i;:::-;10954:4;10949:3;10945:14;10931:28;;10786:179;;;;:::o;10971:118::-;11058:24;11076:5;11058:24;:::i;:::-;11053:3;11046:37;10971:118;;:::o;11125:732::-;11244:3;11273:54;11321:5;11273:54;:::i;:::-;11343:86;11422:6;11417:3;11343:86;:::i;:::-;11336:93;;11453:56;11503:5;11453:56;:::i;:::-;11532:7;11563:1;11548:284;11573:6;11570:1;11567:13;11548:284;;;11649:6;11643:13;11676:63;11735:3;11720:13;11676:63;:::i;:::-;11669:70;;11762:60;11815:6;11762:60;:::i;:::-;11752:70;;11608:224;11595:1;11592;11588:9;11583:14;;11548:284;;;11552:14;11848:3;11841:10;;11249:608;;;11125:732;;;;:::o;11863:109::-;11944:21;11959:5;11944:21;:::i;:::-;11939:3;11932:34;11863:109;;:::o;11978:360::-;12064:3;12092:38;12124:5;12092:38;:::i;:::-;12146:70;12209:6;12204:3;12146:70;:::i;:::-;12139:77;;12225:52;12270:6;12265:3;12258:4;12251:5;12247:16;12225:52;:::i;:::-;12302:29;12324:6;12302:29;:::i;:::-;12297:3;12293:39;12286:46;;12068:270;11978:360;;;;:::o;12344:364::-;12432:3;12460:39;12493:5;12460:39;:::i;:::-;12515:71;12579:6;12574:3;12515:71;:::i;:::-;12508:78;;12595:52;12640:6;12635:3;12628:4;12621:5;12617:16;12595:52;:::i;:::-;12672:29;12694:6;12672:29;:::i;:::-;12667:3;12663:39;12656:46;;12436:272;12344:364;;;;:::o;12714:377::-;12820:3;12848:39;12881:5;12848:39;:::i;:::-;12903:89;12985:6;12980:3;12903:89;:::i;:::-;12896:96;;13001:52;13046:6;13041:3;13034:4;13027:5;13023:16;13001:52;:::i;:::-;13078:6;13073:3;13069:16;13062:23;;12824:267;12714:377;;;;:::o;13121:845::-;13224:3;13261:5;13255:12;13290:36;13316:9;13290:36;:::i;:::-;13342:89;13424:6;13419:3;13342:89;:::i;:::-;13335:96;;13462:1;13451:9;13447:17;13478:1;13473:137;;;;13624:1;13619:341;;;;13440:520;;13473:137;13557:4;13553:9;13542;13538:25;13533:3;13526:38;13593:6;13588:3;13584:16;13577:23;;13473:137;;13619:341;13686:38;13718:5;13686:38;:::i;:::-;13746:1;13760:154;13774:6;13771:1;13768:13;13760:154;;;13848:7;13842:14;13838:1;13833:3;13829:11;13822:35;13898:1;13889:7;13885:15;13874:26;;13796:4;13793:1;13789:12;13784:17;;13760:154;;;13943:6;13938:3;13934:16;13927:23;;13626:334;;13440:520;;13228:738;;13121:845;;;;:::o;13972:366::-;14114:3;14135:67;14199:2;14194:3;14135:67;:::i;:::-;14128:74;;14211:93;14300:3;14211:93;:::i;:::-;14329:2;14324:3;14320:12;14313:19;;13972:366;;;:::o;14344:::-;14486:3;14507:67;14571:2;14566:3;14507:67;:::i;:::-;14500:74;;14583:93;14672:3;14583:93;:::i;:::-;14701:2;14696:3;14692:12;14685:19;;14344:366;;;:::o;14716:::-;14858:3;14879:67;14943:2;14938:3;14879:67;:::i;:::-;14872:74;;14955:93;15044:3;14955:93;:::i;:::-;15073:2;15068:3;15064:12;15057:19;;14716:366;;;:::o;15088:::-;15230:3;15251:67;15315:2;15310:3;15251:67;:::i;:::-;15244:74;;15327:93;15416:3;15327:93;:::i;:::-;15445:2;15440:3;15436:12;15429:19;;15088:366;;;:::o;15460:::-;15602:3;15623:67;15687:2;15682:3;15623:67;:::i;:::-;15616:74;;15699:93;15788:3;15699:93;:::i;:::-;15817:2;15812:3;15808:12;15801:19;;15460:366;;;:::o;15832:::-;15974:3;15995:67;16059:2;16054:3;15995:67;:::i;:::-;15988:74;;16071:93;16160:3;16071:93;:::i;:::-;16189:2;16184:3;16180:12;16173:19;;15832:366;;;:::o;16204:::-;16346:3;16367:67;16431:2;16426:3;16367:67;:::i;:::-;16360:74;;16443:93;16532:3;16443:93;:::i;:::-;16561:2;16556:3;16552:12;16545:19;;16204:366;;;:::o;16576:::-;16718:3;16739:67;16803:2;16798:3;16739:67;:::i;:::-;16732:74;;16815:93;16904:3;16815:93;:::i;:::-;16933:2;16928:3;16924:12;16917:19;;16576:366;;;:::o;16948:::-;17090:3;17111:67;17175:2;17170:3;17111:67;:::i;:::-;17104:74;;17187:93;17276:3;17187:93;:::i;:::-;17305:2;17300:3;17296:12;17289:19;;16948:366;;;:::o;17320:::-;17462:3;17483:67;17547:2;17542:3;17483:67;:::i;:::-;17476:74;;17559:93;17648:3;17559:93;:::i;:::-;17677:2;17672:3;17668:12;17661:19;;17320:366;;;:::o;17692:::-;17834:3;17855:67;17919:2;17914:3;17855:67;:::i;:::-;17848:74;;17931:93;18020:3;17931:93;:::i;:::-;18049:2;18044:3;18040:12;18033:19;;17692:366;;;:::o;18064:::-;18206:3;18227:67;18291:2;18286:3;18227:67;:::i;:::-;18220:74;;18303:93;18392:3;18303:93;:::i;:::-;18421:2;18416:3;18412:12;18405:19;;18064:366;;;:::o;18436:::-;18578:3;18599:67;18663:2;18658:3;18599:67;:::i;:::-;18592:74;;18675:93;18764:3;18675:93;:::i;:::-;18793:2;18788:3;18784:12;18777:19;;18436:366;;;:::o;18808:::-;18950:3;18971:67;19035:2;19030:3;18971:67;:::i;:::-;18964:74;;19047:93;19136:3;19047:93;:::i;:::-;19165:2;19160:3;19156:12;19149:19;;18808:366;;;:::o;19180:::-;19322:3;19343:67;19407:2;19402:3;19343:67;:::i;:::-;19336:74;;19419:93;19508:3;19419:93;:::i;:::-;19537:2;19532:3;19528:12;19521:19;;19180:366;;;:::o;19552:::-;19694:3;19715:67;19779:2;19774:3;19715:67;:::i;:::-;19708:74;;19791:93;19880:3;19791:93;:::i;:::-;19909:2;19904:3;19900:12;19893:19;;19552:366;;;:::o;19924:::-;20066:3;20087:67;20151:2;20146:3;20087:67;:::i;:::-;20080:74;;20163:93;20252:3;20163:93;:::i;:::-;20281:2;20276:3;20272:12;20265:19;;19924:366;;;:::o;20296:::-;20438:3;20459:67;20523:2;20518:3;20459:67;:::i;:::-;20452:74;;20535:93;20624:3;20535:93;:::i;:::-;20653:2;20648:3;20644:12;20637:19;;20296:366;;;:::o;20668:::-;20810:3;20831:67;20895:2;20890:3;20831:67;:::i;:::-;20824:74;;20907:93;20996:3;20907:93;:::i;:::-;21025:2;21020:3;21016:12;21009:19;;20668:366;;;:::o;21040:::-;21182:3;21203:67;21267:2;21262:3;21203:67;:::i;:::-;21196:74;;21279:93;21368:3;21279:93;:::i;:::-;21397:2;21392:3;21388:12;21381:19;;21040:366;;;:::o;21412:::-;21554:3;21575:67;21639:2;21634:3;21575:67;:::i;:::-;21568:74;;21651:93;21740:3;21651:93;:::i;:::-;21769:2;21764:3;21760:12;21753:19;;21412:366;;;:::o;21784:::-;21926:3;21947:67;22011:2;22006:3;21947:67;:::i;:::-;21940:74;;22023:93;22112:3;22023:93;:::i;:::-;22141:2;22136:3;22132:12;22125:19;;21784:366;;;:::o;22156:400::-;22316:3;22337:84;22419:1;22414:3;22337:84;:::i;:::-;22330:91;;22430:93;22519:3;22430:93;:::i;:::-;22548:1;22543:3;22539:11;22532:18;;22156:400;;;:::o;22562:366::-;22704:3;22725:67;22789:2;22784:3;22725:67;:::i;:::-;22718:74;;22801:93;22890:3;22801:93;:::i;:::-;22919:2;22914:3;22910:12;22903:19;;22562:366;;;:::o;22934:::-;23076:3;23097:67;23161:2;23156:3;23097:67;:::i;:::-;23090:74;;23173:93;23262:3;23173:93;:::i;:::-;23291:2;23286:3;23282:12;23275:19;;22934:366;;;:::o;23306:::-;23448:3;23469:67;23533:2;23528:3;23469:67;:::i;:::-;23462:74;;23545:93;23634:3;23545:93;:::i;:::-;23663:2;23658:3;23654:12;23647:19;;23306:366;;;:::o;23678:::-;23820:3;23841:67;23905:2;23900:3;23841:67;:::i;:::-;23834:74;;23917:93;24006:3;23917:93;:::i;:::-;24035:2;24030:3;24026:12;24019:19;;23678:366;;;:::o;24050:::-;24192:3;24213:67;24277:2;24272:3;24213:67;:::i;:::-;24206:74;;24289:93;24378:3;24289:93;:::i;:::-;24407:2;24402:3;24398:12;24391:19;;24050:366;;;:::o;24422:::-;24564:3;24585:67;24649:2;24644:3;24585:67;:::i;:::-;24578:74;;24661:93;24750:3;24661:93;:::i;:::-;24779:2;24774:3;24770:12;24763:19;;24422:366;;;:::o;24794:::-;24936:3;24957:67;25021:2;25016:3;24957:67;:::i;:::-;24950:74;;25033:93;25122:3;25033:93;:::i;:::-;25151:2;25146:3;25142:12;25135:19;;24794:366;;;:::o;25166:::-;25308:3;25329:67;25393:2;25388:3;25329:67;:::i;:::-;25322:74;;25405:93;25494:3;25405:93;:::i;:::-;25523:2;25518:3;25514:12;25507:19;;25166:366;;;:::o;25538:108::-;25615:24;25633:5;25615:24;:::i;:::-;25610:3;25603:37;25538:108;;:::o;25652:118::-;25739:24;25757:5;25739:24;:::i;:::-;25734:3;25727:37;25652:118;;:::o;25776:112::-;25859:22;25875:5;25859:22;:::i;:::-;25854:3;25847:35;25776:112;;:::o;25894:701::-;26175:3;26197:95;26288:3;26279:6;26197:95;:::i;:::-;26190:102;;26309:95;26400:3;26391:6;26309:95;:::i;:::-;26302:102;;26421:148;26565:3;26421:148;:::i;:::-;26414:155;;26586:3;26579:10;;25894:701;;;;;:::o;26601:429::-;26778:3;26800:95;26891:3;26882:6;26800:95;:::i;:::-;26793:102;;26912:92;27000:3;26991:6;26912:92;:::i;:::-;26905:99;;27021:3;27014:10;;26601:429;;;;;:::o;27036:222::-;27129:4;27167:2;27156:9;27152:18;27144:26;;27180:71;27248:1;27237:9;27233:17;27224:6;27180:71;:::i;:::-;27036:222;;;;:::o;27264:640::-;27459:4;27497:3;27486:9;27482:19;27474:27;;27511:71;27579:1;27568:9;27564:17;27555:6;27511:71;:::i;:::-;27592:72;27660:2;27649:9;27645:18;27636:6;27592:72;:::i;:::-;27674;27742:2;27731:9;27727:18;27718:6;27674:72;:::i;:::-;27793:9;27787:4;27783:20;27778:2;27767:9;27763:18;27756:48;27821:76;27892:4;27883:6;27821:76;:::i;:::-;27813:84;;27264:640;;;;;;;:::o;27910:332::-;28031:4;28069:2;28058:9;28054:18;28046:26;;28082:71;28150:1;28139:9;28135:17;28126:6;28082:71;:::i;:::-;28163:72;28231:2;28220:9;28216:18;28207:6;28163:72;:::i;:::-;27910:332;;;;;:::o;28248:373::-;28391:4;28429:2;28418:9;28414:18;28406:26;;28478:9;28472:4;28468:20;28464:1;28453:9;28449:17;28442:47;28506:108;28609:4;28600:6;28506:108;:::i;:::-;28498:116;;28248:373;;;;:::o;28627:210::-;28714:4;28752:2;28741:9;28737:18;28729:26;;28765:65;28827:1;28816:9;28812:17;28803:6;28765:65;:::i;:::-;28627:210;;;;:::o;28843:313::-;28956:4;28994:2;28983:9;28979:18;28971:26;;29043:9;29037:4;29033:20;29029:1;29018:9;29014:17;29007:47;29071:78;29144:4;29135:6;29071:78;:::i;:::-;29063:86;;28843:313;;;;:::o;29162:419::-;29328:4;29366:2;29355:9;29351:18;29343:26;;29415:9;29409:4;29405:20;29401:1;29390:9;29386:17;29379:47;29443:131;29569:4;29443:131;:::i;:::-;29435:139;;29162:419;;;:::o;29587:::-;29753:4;29791:2;29780:9;29776:18;29768:26;;29840:9;29834:4;29830:20;29826:1;29815:9;29811:17;29804:47;29868:131;29994:4;29868:131;:::i;:::-;29860:139;;29587:419;;;:::o;30012:::-;30178:4;30216:2;30205:9;30201:18;30193:26;;30265:9;30259:4;30255:20;30251:1;30240:9;30236:17;30229:47;30293:131;30419:4;30293:131;:::i;:::-;30285:139;;30012:419;;;:::o;30437:::-;30603:4;30641:2;30630:9;30626:18;30618:26;;30690:9;30684:4;30680:20;30676:1;30665:9;30661:17;30654:47;30718:131;30844:4;30718:131;:::i;:::-;30710:139;;30437:419;;;:::o;30862:::-;31028:4;31066:2;31055:9;31051:18;31043:26;;31115:9;31109:4;31105:20;31101:1;31090:9;31086:17;31079:47;31143:131;31269:4;31143:131;:::i;:::-;31135:139;;30862:419;;;:::o;31287:::-;31453:4;31491:2;31480:9;31476:18;31468:26;;31540:9;31534:4;31530:20;31526:1;31515:9;31511:17;31504:47;31568:131;31694:4;31568:131;:::i;:::-;31560:139;;31287:419;;;:::o;31712:::-;31878:4;31916:2;31905:9;31901:18;31893:26;;31965:9;31959:4;31955:20;31951:1;31940:9;31936:17;31929:47;31993:131;32119:4;31993:131;:::i;:::-;31985:139;;31712:419;;;:::o;32137:::-;32303:4;32341:2;32330:9;32326:18;32318:26;;32390:9;32384:4;32380:20;32376:1;32365:9;32361:17;32354:47;32418:131;32544:4;32418:131;:::i;:::-;32410:139;;32137:419;;;:::o;32562:::-;32728:4;32766:2;32755:9;32751:18;32743:26;;32815:9;32809:4;32805:20;32801:1;32790:9;32786:17;32779:47;32843:131;32969:4;32843:131;:::i;:::-;32835:139;;32562:419;;;:::o;32987:::-;33153:4;33191:2;33180:9;33176:18;33168:26;;33240:9;33234:4;33230:20;33226:1;33215:9;33211:17;33204:47;33268:131;33394:4;33268:131;:::i;:::-;33260:139;;32987:419;;;:::o;33412:::-;33578:4;33616:2;33605:9;33601:18;33593:26;;33665:9;33659:4;33655:20;33651:1;33640:9;33636:17;33629:47;33693:131;33819:4;33693:131;:::i;:::-;33685:139;;33412:419;;;:::o;33837:::-;34003:4;34041:2;34030:9;34026:18;34018:26;;34090:9;34084:4;34080:20;34076:1;34065:9;34061:17;34054:47;34118:131;34244:4;34118:131;:::i;:::-;34110:139;;33837:419;;;:::o;34262:::-;34428:4;34466:2;34455:9;34451:18;34443:26;;34515:9;34509:4;34505:20;34501:1;34490:9;34486:17;34479:47;34543:131;34669:4;34543:131;:::i;:::-;34535:139;;34262:419;;;:::o;34687:::-;34853:4;34891:2;34880:9;34876:18;34868:26;;34940:9;34934:4;34930:20;34926:1;34915:9;34911:17;34904:47;34968:131;35094:4;34968:131;:::i;:::-;34960:139;;34687:419;;;:::o;35112:::-;35278:4;35316:2;35305:9;35301:18;35293:26;;35365:9;35359:4;35355:20;35351:1;35340:9;35336:17;35329:47;35393:131;35519:4;35393:131;:::i;:::-;35385:139;;35112:419;;;:::o;35537:::-;35703:4;35741:2;35730:9;35726:18;35718:26;;35790:9;35784:4;35780:20;35776:1;35765:9;35761:17;35754:47;35818:131;35944:4;35818:131;:::i;:::-;35810:139;;35537:419;;;:::o;35962:::-;36128:4;36166:2;36155:9;36151:18;36143:26;;36215:9;36209:4;36205:20;36201:1;36190:9;36186:17;36179:47;36243:131;36369:4;36243:131;:::i;:::-;36235:139;;35962:419;;;:::o;36387:::-;36553:4;36591:2;36580:9;36576:18;36568:26;;36640:9;36634:4;36630:20;36626:1;36615:9;36611:17;36604:47;36668:131;36794:4;36668:131;:::i;:::-;36660:139;;36387:419;;;:::o;36812:::-;36978:4;37016:2;37005:9;37001:18;36993:26;;37065:9;37059:4;37055:20;37051:1;37040:9;37036:17;37029:47;37093:131;37219:4;37093:131;:::i;:::-;37085:139;;36812:419;;;:::o;37237:::-;37403:4;37441:2;37430:9;37426:18;37418:26;;37490:9;37484:4;37480:20;37476:1;37465:9;37461:17;37454:47;37518:131;37644:4;37518:131;:::i;:::-;37510:139;;37237:419;;;:::o;37662:::-;37828:4;37866:2;37855:9;37851:18;37843:26;;37915:9;37909:4;37905:20;37901:1;37890:9;37886:17;37879:47;37943:131;38069:4;37943:131;:::i;:::-;37935:139;;37662:419;;;:::o;38087:::-;38253:4;38291:2;38280:9;38276:18;38268:26;;38340:9;38334:4;38330:20;38326:1;38315:9;38311:17;38304:47;38368:131;38494:4;38368:131;:::i;:::-;38360:139;;38087:419;;;:::o;38512:::-;38678:4;38716:2;38705:9;38701:18;38693:26;;38765:9;38759:4;38755:20;38751:1;38740:9;38736:17;38729:47;38793:131;38919:4;38793:131;:::i;:::-;38785:139;;38512:419;;;:::o;38937:::-;39103:4;39141:2;39130:9;39126:18;39118:26;;39190:9;39184:4;39180:20;39176:1;39165:9;39161:17;39154:47;39218:131;39344:4;39218:131;:::i;:::-;39210:139;;38937:419;;;:::o;39362:::-;39528:4;39566:2;39555:9;39551:18;39543:26;;39615:9;39609:4;39605:20;39601:1;39590:9;39586:17;39579:47;39643:131;39769:4;39643:131;:::i;:::-;39635:139;;39362:419;;;:::o;39787:::-;39953:4;39991:2;39980:9;39976:18;39968:26;;40040:9;40034:4;40030:20;40026:1;40015:9;40011:17;40004:47;40068:131;40194:4;40068:131;:::i;:::-;40060:139;;39787:419;;;:::o;40212:::-;40378:4;40416:2;40405:9;40401:18;40393:26;;40465:9;40459:4;40455:20;40451:1;40440:9;40436:17;40429:47;40493:131;40619:4;40493:131;:::i;:::-;40485:139;;40212:419;;;:::o;40637:::-;40803:4;40841:2;40830:9;40826:18;40818:26;;40890:9;40884:4;40880:20;40876:1;40865:9;40861:17;40854:47;40918:131;41044:4;40918:131;:::i;:::-;40910:139;;40637:419;;;:::o;41062:::-;41228:4;41266:2;41255:9;41251:18;41243:26;;41315:9;41309:4;41305:20;41301:1;41290:9;41286:17;41279:47;41343:131;41469:4;41343:131;:::i;:::-;41335:139;;41062:419;;;:::o;41487:::-;41653:4;41691:2;41680:9;41676:18;41668:26;;41740:9;41734:4;41730:20;41726:1;41715:9;41711:17;41704:47;41768:131;41894:4;41768:131;:::i;:::-;41760:139;;41487:419;;;:::o;41912:222::-;42005:4;42043:2;42032:9;42028:18;42020:26;;42056:71;42124:1;42113:9;42109:17;42100:6;42056:71;:::i;:::-;41912:222;;;;:::o;42140:214::-;42229:4;42267:2;42256:9;42252:18;42244:26;;42280:67;42344:1;42333:9;42329:17;42320:6;42280:67;:::i;:::-;42140:214;;;;:::o;42360:129::-;42394:6;42421:20;;:::i;:::-;42411:30;;42450:33;42478:4;42470:6;42450:33;:::i;:::-;42360:129;;;:::o;42495:75::-;42528:6;42561:2;42555:9;42545:19;;42495:75;:::o;42576:311::-;42653:4;42743:18;42735:6;42732:30;42729:56;;;42765:18;;:::i;:::-;42729:56;42815:4;42807:6;42803:17;42795:25;;42875:4;42869;42865:15;42857:23;;42576:311;;;:::o;42893:307::-;42954:4;43044:18;43036:6;43033:30;43030:56;;;43066:18;;:::i;:::-;43030:56;43104:29;43126:6;43104:29;:::i;:::-;43096:37;;43188:4;43182;43178:15;43170:23;;42893:307;;;:::o;43206:308::-;43268:4;43358:18;43350:6;43347:30;43344:56;;;43380:18;;:::i;:::-;43344:56;43418:29;43440:6;43418:29;:::i;:::-;43410:37;;43502:4;43496;43492:15;43484:23;;43206:308;;;:::o;43520:132::-;43587:4;43610:3;43602:11;;43640:4;43635:3;43631:14;43623:22;;43520:132;;;:::o;43658:141::-;43707:4;43730:3;43722:11;;43753:3;43750:1;43743:14;43787:4;43784:1;43774:18;43766:26;;43658:141;;;:::o;43805:114::-;43872:6;43906:5;43900:12;43890:22;;43805:114;;;:::o;43925:98::-;43976:6;44010:5;44004:12;43994:22;;43925:98;;;:::o;44029:99::-;44081:6;44115:5;44109:12;44099:22;;44029:99;;;:::o;44134:113::-;44204:4;44236;44231:3;44227:14;44219:22;;44134:113;;;:::o;44253:184::-;44352:11;44386:6;44381:3;44374:19;44426:4;44421:3;44417:14;44402:29;;44253:184;;;;:::o;44443:168::-;44526:11;44560:6;44555:3;44548:19;44600:4;44595:3;44591:14;44576:29;;44443:168;;;;:::o;44617:169::-;44701:11;44735:6;44730:3;44723:19;44775:4;44770:3;44766:14;44751:29;;44617:169;;;;:::o;44792:148::-;44894:11;44931:3;44916:18;;44792:148;;;;:::o;44946:305::-;44986:3;45005:20;45023:1;45005:20;:::i;:::-;45000:25;;45039:20;45057:1;45039:20;:::i;:::-;45034:25;;45193:1;45125:66;45121:74;45118:1;45115:81;45112:107;;;45199:18;;:::i;:::-;45112:107;45243:1;45240;45236:9;45229:16;;44946:305;;;;:::o;45257:185::-;45297:1;45314:20;45332:1;45314:20;:::i;:::-;45309:25;;45348:20;45366:1;45348:20;:::i;:::-;45343:25;;45387:1;45377:35;;45392:18;;:::i;:::-;45377:35;45434:1;45431;45427:9;45422:14;;45257:185;;;;:::o;45448:348::-;45488:7;45511:20;45529:1;45511:20;:::i;:::-;45506:25;;45545:20;45563:1;45545:20;:::i;:::-;45540:25;;45733:1;45665:66;45661:74;45658:1;45655:81;45650:1;45643:9;45636:17;45632:105;45629:131;;;45740:18;;:::i;:::-;45629:131;45788:1;45785;45781:9;45770:20;;45448:348;;;;:::o;45802:191::-;45842:4;45862:20;45880:1;45862:20;:::i;:::-;45857:25;;45896:20;45914:1;45896:20;:::i;:::-;45891:25;;45935:1;45932;45929:8;45926:34;;;45940:18;;:::i;:::-;45926:34;45985:1;45982;45978:9;45970:17;;45802:191;;;;:::o;45999:96::-;46036:7;46065:24;46083:5;46065:24;:::i;:::-;46054:35;;45999:96;;;:::o;46101:90::-;46135:7;46178:5;46171:13;46164:21;46153:32;;46101:90;;;:::o;46197:149::-;46233:7;46273:66;46266:5;46262:78;46251:89;;46197:149;;;:::o;46352:89::-;46388:7;46428:6;46421:5;46417:18;46406:29;;46352:89;;;:::o;46447:126::-;46484:7;46524:42;46517:5;46513:54;46502:65;;46447:126;;;:::o;46579:77::-;46616:7;46645:5;46634:16;;46579:77;;;:::o;46662:86::-;46697:7;46737:4;46730:5;46726:16;46715:27;;46662:86;;;:::o;46754:154::-;46838:6;46833:3;46828;46815:30;46900:1;46891:6;46886:3;46882:16;46875:27;46754:154;;;:::o;46914:307::-;46982:1;46992:113;47006:6;47003:1;47000:13;46992:113;;;47091:1;47086:3;47082:11;47076:18;47072:1;47067:3;47063:11;47056:39;47028:2;47025:1;47021:10;47016:15;;46992:113;;;47123:6;47120:1;47117:13;47114:101;;;47203:1;47194:6;47189:3;47185:16;47178:27;47114:101;46963:258;46914:307;;;:::o;47227:320::-;47271:6;47308:1;47302:4;47298:12;47288:22;;47355:1;47349:4;47345:12;47376:18;47366:81;;47432:4;47424:6;47420:17;47410:27;;47366:81;47494:2;47486:6;47483:14;47463:18;47460:38;47457:84;;;47513:18;;:::i;:::-;47457:84;47278:269;47227:320;;;:::o;47553:281::-;47636:27;47658:4;47636:27;:::i;:::-;47628:6;47624:40;47766:6;47754:10;47751:22;47730:18;47718:10;47715:34;47712:62;47709:88;;;47777:18;;:::i;:::-;47709:88;47817:10;47813:2;47806:22;47596:238;47553:281;;:::o;47840:233::-;47879:3;47902:24;47920:5;47902:24;:::i;:::-;47893:33;;47948:66;47941:5;47938:77;47935:103;;;48018:18;;:::i;:::-;47935:103;48065:1;48058:5;48054:13;48047:20;;47840:233;;;:::o;48079:176::-;48111:1;48128:20;48146:1;48128:20;:::i;:::-;48123:25;;48162:20;48180:1;48162:20;:::i;:::-;48157:25;;48201:1;48191:35;;48206:18;;:::i;:::-;48191:35;48247:1;48244;48240:9;48235:14;;48079:176;;;;:::o;48261:180::-;48309:77;48306:1;48299:88;48406:4;48403:1;48396:15;48430:4;48427:1;48420:15;48447:180;48495:77;48492:1;48485:88;48592:4;48589:1;48582:15;48616:4;48613:1;48606:15;48633:180;48681:77;48678:1;48671:88;48778:4;48775:1;48768:15;48802:4;48799:1;48792:15;48819:180;48867:77;48864:1;48857:88;48964:4;48961:1;48954:15;48988:4;48985:1;48978:15;49005:180;49053:77;49050:1;49043:88;49150:4;49147:1;49140:15;49174:4;49171:1;49164:15;49191:180;49239:77;49236:1;49229:88;49336:4;49333:1;49326:15;49360:4;49357:1;49350:15;49377:117;49486:1;49483;49476:12;49500:117;49609:1;49606;49599:12;49623:117;49732:1;49729;49722:12;49746:117;49855:1;49852;49845:12;49869:117;49978:1;49975;49968:12;49992:102;50033:6;50084:2;50080:7;50075:2;50068:5;50064:14;50060:28;50050:38;;49992:102;;;:::o;50100:225::-;50240:34;50236:1;50228:6;50224:14;50217:58;50309:8;50304:2;50296:6;50292:15;50285:33;50100:225;:::o;50331:170::-;50471:22;50467:1;50459:6;50455:14;50448:46;50331:170;:::o;50507:221::-;50647:34;50643:1;50635:6;50631:14;50624:58;50716:4;50711:2;50703:6;50699:15;50692:29;50507:221;:::o;50734:230::-;50874:34;50870:1;50862:6;50858:14;50851:58;50943:13;50938:2;50930:6;50926:15;50919:38;50734:230;:::o;50970:237::-;51110:34;51106:1;51098:6;51094:14;51087:58;51179:20;51174:2;51166:6;51162:15;51155:45;50970:237;:::o;51213:225::-;51353:34;51349:1;51341:6;51337:14;51330:58;51422:8;51417:2;51409:6;51405:15;51398:33;51213:225;:::o;51444:178::-;51584:30;51580:1;51572:6;51568:14;51561:54;51444:178;:::o;51628:174::-;51768:26;51764:1;51756:6;51752:14;51745:50;51628:174;:::o;51808:223::-;51948:34;51944:1;51936:6;51932:14;51925:58;52017:6;52012:2;52004:6;52000:15;51993:31;51808:223;:::o;52037:175::-;52177:27;52173:1;52165:6;52161:14;52154:51;52037:175;:::o;52218:231::-;52358:34;52354:1;52346:6;52342:14;52335:58;52427:14;52422:2;52414:6;52410:15;52403:39;52218:231;:::o;52455:166::-;52595:18;52591:1;52583:6;52579:14;52572:42;52455:166;:::o;52627:169::-;52767:21;52763:1;52755:6;52751:14;52744:45;52627:169;:::o;52802:243::-;52942:34;52938:1;52930:6;52926:14;52919:58;53011:26;53006:2;52998:6;52994:15;52987:51;52802:243;:::o;53051:230::-;53191:34;53187:1;53179:6;53175:14;53168:58;53260:13;53255:2;53247:6;53243:15;53236:38;53051:230;:::o;53287:229::-;53427:34;53423:1;53415:6;53411:14;53404:58;53496:12;53491:2;53483:6;53479:15;53472:37;53287:229;:::o;53522:228::-;53662:34;53658:1;53650:6;53646:14;53639:58;53731:11;53726:2;53718:6;53714:15;53707:36;53522:228;:::o;53756:233::-;53896:34;53892:1;53884:6;53880:14;53873:58;53965:16;53960:2;53952:6;53948:15;53941:41;53756:233;:::o;53995:176::-;54135:28;54131:1;54123:6;54119:14;54112:52;53995:176;:::o;54177:182::-;54317:34;54313:1;54305:6;54301:14;54294:58;54177:182;:::o;54365:165::-;54505:17;54501:1;54493:6;54489:14;54482:41;54365:165;:::o;54536:231::-;54676:34;54672:1;54664:6;54660:14;54653:58;54745:14;54740:2;54732:6;54728:15;54721:39;54536:231;:::o;54773:155::-;54913:7;54909:1;54901:6;54897:14;54890:31;54773:155;:::o;54934:182::-;55074:34;55070:1;55062:6;55058:14;55051:58;54934:182;:::o;55122:228::-;55262:34;55258:1;55250:6;55246:14;55239:58;55331:11;55326:2;55318:6;55314:15;55307:36;55122:228;:::o;55356:220::-;55496:34;55492:1;55484:6;55480:14;55473:58;55565:3;55560:2;55552:6;55548:15;55541:28;55356:220;:::o;55582:232::-;55722:34;55718:1;55710:6;55706:14;55699:58;55791:15;55786:2;55778:6;55774:15;55767:40;55582:232;:::o;55820:236::-;55960:34;55956:1;55948:6;55944:14;55937:58;56029:19;56024:2;56016:6;56012:15;56005:44;55820:236;:::o;56062:231::-;56202:34;56198:1;56190:6;56186:14;56179:58;56271:14;56266:2;56258:6;56254:15;56247:39;56062:231;:::o;56299:235::-;56439:34;56435:1;56427:6;56423:14;56416:58;56508:18;56503:2;56495:6;56491:15;56484:43;56299:235;:::o;56540:170::-;56680:22;56676:1;56668:6;56664:14;56657:46;56540:170;:::o;56716:122::-;56789:24;56807:5;56789:24;:::i;:::-;56782:5;56779:35;56769:63;;56828:1;56825;56818:12;56769:63;56716:122;:::o;56844:116::-;56914:21;56929:5;56914:21;:::i;:::-;56907:5;56904:32;56894:60;;56950:1;56947;56940:12;56894:60;56844:116;:::o;56966:120::-;57038:23;57055:5;57038:23;:::i;:::-;57031:5;57028:34;57018:62;;57076:1;57073;57066:12;57018:62;56966:120;:::o;57092:::-;57164:23;57181:5;57164:23;:::i;:::-;57157:5;57154:34;57144:62;;57202:1;57199;57192:12;57144:62;57092:120;:::o;57218:122::-;57291:24;57309:5;57291:24;:::i;:::-;57284:5;57281:35;57271:63;;57330:1;57327;57320:12;57271:63;57218:122;:::o

Swarm Source

ipfs://3ac981631374f1f7533ff0ff709ad3f2fc4f30164533e955c99991d700cdde1a
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.