ETH Price: $2,710.61 (+1.00%)

Token

Empty Bunnies NFT (BUNS)
 

Overview

Max Total Supply

58 BUNS

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BUNS
0x6ad8a820383ad84cac37e01319db17d51916b981
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EmptyBunnies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-12
*/

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

////// SPDX-License-Identifier: MIT

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);
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "../../utils/introspection/IERC165.sol";

/**
 * @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;
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "./IERC165.sol";

/**
 * @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;
    }
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

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

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

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

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

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

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

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

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

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "../IERC721.sol";

/**
 * @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);
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

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

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "./IERC721.sol";
////import "./IERC721Receiver.sol";
////import "./extensions/IERC721Metadata.sol";
////import "../../utils/Address.sol";
////import "../../utils/Context.sol";
////import "../../utils/Strings.sol";
////import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "../IERC721.sol";

/**
 * @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);
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "../ERC721.sol";
////import "../../../utils/Context.sol";

/**
 * @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);
    }
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "../utils/Address.sol";
////import "../utils/Context.sol";
////import "../utils/math/SafeMath.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) /
            _totalShares -
            _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "../utils/Context.sol";

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

pragma solidity ^0.8.0;

////import "../ERC721.sol";
////import "./IERC721Enumerable.sol";

/**
 * @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();
    }
}

/**
 *  SourceUnit: d:\repos\NFTurbo\contracts\emptybunnies\emptybunnies.sol
 */

//
//                               *     (               )                   )     )  (         (
//                             (  `    )\ )  *   )  ( /(     (          ( /(  ( /(  )\ )      )\ )
//                        (    )\))(  (()/(` )  /(  )\())  ( )\     (   )\()) )\())(()/( (   (()/(
//                        )\  ((_)()\  /(_))( )(_))((_)\   )((_)    )\ ((_)\ ((_)\  /(_)))\   /(_))
//                       ((_) (_()((_)(_)) (_(_())__ ((_) ((_)_  _ ((_) _((_) _((_)(_)) ((_) (_))
//                       | __||  \/  || _ \|_   _|\ \ / /  | _ )| | | || \| || \| ||_ _|| __|/ __|
//                       | _| | |\/| ||  _/  | |   \ V /   | _ \| |_| || .` || .` | | | | _| \__ \
//                      |___)|_(  |_||_|    |_|    |_|    |___/ \___/ |_|\_||_|\_||___||___||___/
//
//                                                   ( /(  )\ )   *   )
//                                                   )\())(()/( ` )  /(
//                                                  ((_)\  /(_)) ( )(_))
//                                                   _((_)(_))_|(_(_())
//                                                  | \| || |_  |_   _|
//                                                  | .` || __|   | |
//                                                  |_|\_||_|     |_|
//
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkOOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxk0KXNWWXOkO00KKKXKOxxxxxxxxxxxxxxxxxxxxoc;cdxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkOKXNNXOdxXWXKK0Okkxx0Kkxxxxxxxxxxxxxxxdoc;,'.,oxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOKNNKOdc:;oOkdocc:;:lxKX0kxxxxxxxxxxxxdc;,''',''lxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkOOOOOOKNNOlc:cc;;cc:ccccokKXXK0XKkxxxxxxxxxdc,'''..''''lxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkOKKXK0Okxddxxko:ccccc::cccc;,:odolc:cOXkxxxxxxxxo;.'.....''''lxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkOKXXKOxoc;;,'....';:::::ccc::::;;;::cc:ckNXOkxxxxxxd:......''''.,oxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxO00Odc;,''','..',;:cllccc:::clooddooolc:',oOXNX0kxxxxd;......''''':dxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdl:,,,;,'..................'''''''',;::;,,;;;,'...;oOOOxdddd;.....''..'cdxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxxxdl;'...............'''''''''''''''';:c::;;:,...........',,,,;;'.......':oxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxxdl;..'''''......'..''''''''''',,,,,;cc:cc::,;:::,''''''''''''''... .....'cdxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxxd:'.'''''''''''''''''''''''''''clc::cc;,;:::::;;c:,,,,,,,''''''''....'''..';lxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxxd;...'''''''''...''''....''''''',cc;;::::''';l:;:c;'''',,,,,''''......'''','.;dxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxxd:................................';;:c:;:::,;ll:;,'''''',,,,,,,''......'''''.;dxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxxxkl..........''.';::cc:'........,clcccccclllllcc:,'........'''''''''...........'lxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxxx00c..'',,'';::;;okOOOko;,''.....,oOOOOOOOOOOOkkkxd;................'''.........:xxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxxk0NXc';:cc;;ccc:;lllxOkl;,'........,dOOOOOOOOOOOOOOl.........''';:,.............;oxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxxkKWNx::ccc;;cccc;cl;:xkl,,,..........ckOOOOOOOOOOOOx,.........',,:dkl,.'.......':oxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxxkKWNx:cccc;;:lcc::oodkOo;,,...........,xOOOOOOOOOOOOl...........';,:xOxoo;. ...'cdxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxxk0NNd:cccc;;:cccc;cdxOOx;,;'...........'oOOOOOOOOOOOk:............,;,lkOkd:......':oxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxxx0NNx:cccc;,:cccc:;okOOOl,;,.............lOOOOOOOOOOOk;.............;,;dOOko........;oxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxx0NWk::ccc;';ccccc,:xOOOx;,;'.............lOOOOOOOOOOOx;.............';,cOOOkc.......'cxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxxOXWOc:ccc;',ccccc:':kOOOo,;,.............'lOOOOOOOOOOOk:.............';,:xOOOd'......'lxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxxkKWKl:ccc;',:ccccc;.:kOOkc,;'.............'oOOOOOOOOOOOk:..............,;;dOOOdcc:..'.,oxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxx0NNd:ccc:,,;cccccc;.ckOOk:,;'.............,xOOOOOOOOOOOOl..............,;;lOOOdo0Ko,'.,oxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxxOXWOc:cc:,,;:cccccc;':kOOx:;;..............:kOOOOOOOOOOOOd,.............';;lOOOddXXOdl;:oxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxk0NXo:ccc;;;;ccccccc;,:xOOx:;,.............'oOOOOOOOOOOOOOk:.............';;lOOOoxXKkxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxxOXWk::cc;;;;:ccccccc;,;oOOx:,,.............;xOOOOOOOOOOOOOOo'............';;lOOkoOXOxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxx0NXo:cc:;;;;cccccccc;;;ckOk:,,............'oOOOOOOOOOOOOOOOk:............',,lOOdd00kxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxkKW0c:cc:;:;;cccccccc;;:;oOkc,,'...........ckOOOOOxcoxllkOOOOd,...........',;dOkokKkxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxOXWx:ccc;;:;;cccccccc;:c::xOd;,'..........:xOOOOxo:,ox:,lkOOOOo,..........,,ckOdd0Oxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxx0NNo:cc:;::;:ccccccc:;:cc;ckkl,'.........:xOOOOkc,,;oxc,;oOOOOOo,........',;dOddOOxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxk0WKl:cc:;::;:ccccccc:;:ccc;lkxc''......'ckOOOOOkxdlcdkocokOOOOOOd;.......',okxdkOkxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxkKWO::cc:;c:;:ccccccc:;ccccc:lkxc,....':dOOOOOOOOOOOOOOOOOOOOOOOOOkl,....';okxdOOkxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxkXWk::cc::c:;:ccccccc::c:;:cc:lxkxolloxkOkxxkOOOOOOOOOOOOOOOOOOkxkOOkdlcldkkxdOOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxkXWk:ccc::c:;:ccccccc:::,',:cc;cddodxxkkkkxxkOOOOOOOOOOOOOOOOOOkxxkkkxxdddxddkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxkXWk::cc:cc:;:ccccc:;::,.',;::lOOdc,,:ccc:cdkkOkxkkdxkkkdxkxkkkko:ccc;,;okOkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxkXWO::cccccc;;ccc:,;:;;'.,;;;l0KkkOxl:;::;;cc:lc;cl::loc;c::lc:l:,,;;cd0XKOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxkKWXl:cccccc:;:c:;,',;,';:c:l0XOxxxkOkdl:,,:::::::::::c:::::;::c;,:dOKK0kxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxx0NNx:cccccc:,;:::,'''',:c:l0XOxxxxxxkO0klccc:cl;:loloxool;cl::cloOXKOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxOXW0c:cccc::c::c::;;,,:c:dKXOxxxxxxxxxxdldxo:ldl:clddddoc:odccdxloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dxxxxxxxxxxkKWNd:ccc:lOXx:cc::cc;;ckKKkxxxxxxxxxxxk0KOxolc:,,;:::;'',coxO0Okxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxOXWKl;coOXNWXd:cccc::d0KOxxxxxxxxxxxk0NW0oc:::;'',:c:,''.,:coKWN0kxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxOXWKOKNXKO0NXxc:clxO0OkxxxxxxxxxxxOXWNOc:cccc:;;;;;,,'',:cc:cOWWKkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxk0KK0Okxxk0XNKO000Oxxxxxxxxxxxxk0NMNxc:c::cc,;llc;;'.'::::c:ckNWXOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxkO00OkxxxxxxxxxxxxxkKWMXd:cc:,,;,':olc;;;,,;:,,:cc:dXWNOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0WWKl:ccc;';;,;,..,:lc;,:c;':ccc:oKWXkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdx0WW0l:ccc;,::,;;'..,cccllc:,;ccc:l0WNOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkKWWKo;;:;;ccc:;,,;:cclccc:;;:;;oKWN0kxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkKWMNd;:;,;cccccccccccccccc;,;::xNWXkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxONWNOc:c;,;:::::::::::::::::,:c:cON0kxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOKKOxooolcllllllllllllllllllccllcdkxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//
//                         ╔═╗╔╦╗╔═╗╦═╗╔╦╗  ╔═╗╔═╗╔╗╔╔╦╗╦═╗╔═╗╔═╗╔╦╗  ╔═╗╦═╗╔═╗╦  ╦╦╔╦╗╔═╗╔╦╗  ╔╗ ╦ ╦
//                         ╚═╗║║║╠═╣╠╦╝ ║   ║  ║ ║║║║ ║ ╠╦╝╠═╣║   ║   ╠═╝╠╦╝║ ║╚╗╔╝║ ║║║╣  ║║  ╠╩╗╚╦╝
//                         ╚═╝╩ ╩╩ ╩╩╚═ ╩   ╚═╝╚═╝╝╚╝ ╩ ╩╚═╩ ╩╚═╝ ╩   ╩  ╩╚═╚═╝ ╚╝ ╩═╩╝╚═╝═╩╝  ╚═╝ ╩ooo
//
//                      ╔╗╔╔═╗╔╦╗╦ ╦╦═╗╔╗ ╔═╗  ╔═╗╦═╗╦ ╦╔═╗╔╦╗╔═╗  ╔═╗╦═╗╔╦╗╦╔═╗╔╦╗╔═╗  ╔═╗╔═╗╔═╗╔╗╔╔═╗╦ ╦
//                      ║║║╠╣  ║ ║ ║╠╦╝╠╩╗║ ║  ║  ╠╦╝╚╦╝╠═╝ ║ ║ ║  ╠═╣╠╦╝ ║ ║╚═╗ ║ ╚═╗  ╠═╣║ ╦║╣ ║║║║  ╚╦╝
//                      ╝╚╝╚   ╩ ╚═╝╩╚═╚═╝╚═╝  ╚═╝╩╚═ ╩ ╩   ╩ ╚═╝  ╩ ╩╩╚═ ╩ ╩╚═╝ ╩ ╚═╝  ╩ ╩╚═╝╚═╝╝╚╝╚═╝ ╩
//
//                                                ╔╗╔╔═╗╔╦╗╦ ╦╦═╗╔╗ ╔═╗   ╦╔═╗
//                                            ─── ║║║╠╣  ║ ║ ║╠╦╝╠╩╗║ ║   ║║ ║ ───
//                                                ╝╚╝╚   ╩ ╚═╝╩╚═╚═╝╚═╝ o ╩╚═╝

pragma solidity 0.8.7;

////import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
////import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
////import "@openzeppelin/contracts/access/Ownable.sol";
////import "@openzeppelin/contracts/finance/PaymentSplitter.sol";
////import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";

contract EmptyBunnies is
    ERC721Enumerable,
    ERC721Burnable,
    ReentrancyGuard,
    Ownable,
    PaymentSplitter
{
    // Sale begins:
    // GMT: Tuesday, October 19, 2021 1:30:00 AM
    //      Monday, October 18, 2021 6:30:00 PM GMT-07:00
    uint256 public saleTime = 1634607000;
    uint256 public price = 40000000000000000;
    uint256 public supplyCap = 6000;
    uint256 public perTxLimit = 20;
    uint256 public reservedMints = 35;
    uint256 private tokenCounter = 0;
    uint256[] private _teamShares = [36, 50, 13, 1];

    string public provenanceHash = "";
    string private baseTokenURI = "";
    
     address[] private _team = [
         0xa0260d525e841D5FbA772D69860dF59713992E95,
         0x23D4AA98cb89166D8d5043CA6E8d0aE0B7f70495,
         0x3097617CbA85A26AdC214A1F87B680bE4b275cD0,
         0x14679b51D4043B5C2BD16E83b26bFC4F662d8Bfa
     ];

    constructor(string memory _baseTokenURI)
        payable
        PaymentSplitter(_team, _teamShares)
        ERC721("Empty Bunnies NFT", "BUNS")
    {
        baseTokenURI = _baseTokenURI;
    }

    // Method which is used to mint during the standard minting window
    function mint(uint256 _amountMinted, address _recipient)
        public
        payable
        nonReentrant
    {
        if (owner() != _msgSender()) {
            require(
                saleTime != 0 && saleTime <= block.timestamp,
                "ERC721: Sale is paused..."
            );
        }
        require(totalSupply() < supplyCap, "ERC721: Sale is finished.");
        require(
            _amountMinted > 0 && _amountMinted <= perTxLimit,
            "ERC721: You may only mint up to 20 Empty Buns."
        );
        require(
            totalSupply() + _amountMinted < supplyCap,
            "ERC721: Transaction would exceed supply cap."
        );
        require(
            msg.value >= getTokenPrice(true) * _amountMinted,
            "ERC721: Incorrect value sent."
        );

        // Prevent nefarious contracts from bypassing limits
        require(
            tx.origin == _msgSender(),
            "ERC721: The caller is another contract."
        );

        for (uint256 i = 0; i < _amountMinted; i++) {
            _safeMint(_recipient, tokenCounter);
            tokenCounter++;
        }
    }

    // Setters-----------------------------

    // Owner only method which sets token price
    function setSaleTime(uint256 _saleTime) external onlyOwner {
        saleTime = _saleTime;
    }

    // Owner only method which sets provenance hash
    function setProvenanceHash(string memory _provenanceHash) public onlyOwner {
        provenanceHash = _provenanceHash;
    }

    // Owner only method which sets token price
    function setTokenPrice(uint256 _price) public onlyOwner {
        price = _price;
    }

    // Owner only method which sets baseUri
    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

    // Owner only method which sets baseUri
    function setReservedMints(uint256 _reservedMints) public onlyOwner {
        reservedMints = _reservedMints;
    }

    // Public method which retrieves token price
    function getTokenPrice(bool showFree) public view returns (uint256) {
        if (!showFree) {
            return price;
        }
        if (totalSupply() < reservedMints) {
            return 0;
        }
        return price;
    }

    // Public method which retrieves holders inventory of tokens
    function getHoldersTokens(address _holder)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_holder);

        uint256[] memory tokensId = new uint256[](tokenCount);

        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_holder, i);
        }

        return tokensId;
    }

    // ----------- Overrides to satisfy openzeppelin ERC721 dependencies:
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"stateMutability":"payable","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"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getHoldersTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"showFree","type":"bool"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountMinted","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perTxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMints","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reservedMints","type":"uint256"}],"name":"setReservedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleTime","type":"uint256"}],"name":"setSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"stateMutability":"payable","type":"receive"}]

608060405263616e1f98601155668e1bc9bf04000060125561177060135560148055602360155560006016556040518060800160405280602460ff168152602001603260ff168152602001600d60ff168152602001600160ff1681525060179060046200006e929190620007e4565b506040518060200160405280600081525060189080519060200190620000969291906200083b565b506040518060200160405280600081525060199080519060200190620000be9291906200083b565b50604051806080016040528073a0260d525e841d5fba772d69860df59713992e9573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017323d4aa98cb89166d8d5043ca6e8d0ae0b7f7049573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733097617cba85a26adc214a1f87b680be4b275cd073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017314679b51d4043b5c2bd16e83b26bfc4f662d8bfa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601a906004620001f2929190620008cc565b50604051620060f0380380620060f08339818101604052810190620002189190620009f8565b601a8054806020026020016040519081016040528092919081815260200182805480156200029c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000251575b50505050506017805480602002602001604051908101604052809291908181526020018280548015620002ef57602002820191906000526020600020905b815481526020019060010190808311620002da575b50505050506040518060400160405280601181526020017f456d7074792042756e6e696573204e46540000000000000000000000000000008152506040518060400160405280600481526020017f42554e53000000000000000000000000000000000000000000000000000000008152508160009080519060200190620003789291906200083b565b508060019080519060200190620003919291906200083b565b5050506001600a81905550620003bc620003b0620004dc60201b60201c565b620004e460201b60201c565b805182511462000403576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fa9062000b7d565b60405180910390fd5b60008251116200044a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004419062000bc1565b60405180910390fd5b60005b8251811015620004b957620004a383828151811062000471576200047062000e5e565b5b60200260200101518383815181106200048f576200048e62000e5e565b5b6020026020010151620005aa60201b60201c565b8080620004b09062000db2565b9150506200044d565b5050508060199080519060200190620004d49291906200083b565b505062001020565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200061d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006149062000b5b565b60405180910390fd5b6000811162000663576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200065a9062000be3565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620006e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006df9062000b9f565b60405180910390fd5b6010829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546200079f919062000c75565b600c819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620007d892919062000b2e565b60405180910390a15050565b82805482825590600052602060002090810192821562000828579160200282015b8281111562000827578251829060ff1690559160200191906001019062000805565b5b5090506200083791906200095b565b5090565b828054620008499062000d46565b90600052602060002090601f0160209004810192826200086d5760008555620008b9565b82601f106200088857805160ff1916838001178555620008b9565b82800160010185558215620008b9579182015b82811115620008b85782518255916020019190600101906200089b565b5b509050620008c891906200095b565b5090565b82805482825590600052602060002090810192821562000948579160200282015b82811115620009475782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620008ed565b5b5090506200095791906200095b565b5090565b5b80821115620009765760008160009055506001016200095c565b5090565b6000620009916200098b8462000c2e565b62000c05565b905082815260208101848484011115620009b057620009af62000ec1565b5b620009bd84828562000d10565b509392505050565b600082601f830112620009dd57620009dc62000ebc565b5b8151620009ef8482602086016200097a565b91505092915050565b60006020828403121562000a115762000a1062000ecb565b5b600082015167ffffffffffffffff81111562000a325762000a3162000ec6565b5b62000a4084828501620009c5565b91505092915050565b62000a548162000cd2565b82525050565b600062000a69602c8362000c64565b915062000a768262000ee1565b604082019050919050565b600062000a9060328362000c64565b915062000a9d8262000f30565b604082019050919050565b600062000ab7602b8362000c64565b915062000ac48262000f7f565b604082019050919050565b600062000ade601a8362000c64565b915062000aeb8262000fce565b602082019050919050565b600062000b05601d8362000c64565b915062000b128262000ff7565b602082019050919050565b62000b288162000d06565b82525050565b600060408201905062000b45600083018562000a49565b62000b54602083018462000b1d565b9392505050565b6000602082019050818103600083015262000b768162000a5a565b9050919050565b6000602082019050818103600083015262000b988162000a81565b9050919050565b6000602082019050818103600083015262000bba8162000aa8565b9050919050565b6000602082019050818103600083015262000bdc8162000acf565b9050919050565b6000602082019050818103600083015262000bfe8162000af6565b9050919050565b600062000c1162000c24565b905062000c1f828262000d7c565b919050565b6000604051905090565b600067ffffffffffffffff82111562000c4c5762000c4b62000e8d565b5b62000c578262000ed0565b9050602081019050919050565b600082825260208201905092915050565b600062000c828262000d06565b915062000c8f8362000d06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000cc75762000cc662000e00565b5b828201905092915050565b600062000cdf8262000ce6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000d3057808201518184015260208101905062000d13565b8381111562000d40576000848401525b50505050565b6000600282049050600182168062000d5f57607f821691505b6020821081141562000d765762000d7562000e2f565b5b50919050565b62000d878262000ed0565b810181811067ffffffffffffffff8211171562000da95762000da862000e8d565b5b80604052505050565b600062000dbf8262000d06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000df55762000df462000e00565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b6150c080620010306000396000f3fe60806040526004361061023f5760003560e01c80636a61e5fc1161012e578063a035b1fe116100ab578063ce7c2ac21161006f578063ce7c2ac2146108f7578063df77294114610934578063e33b7de31461095f578063e985e9c51461098a578063f2fde38b146109c757610286565b8063a035b1fe14610812578063a22cb4651461083d578063b88d4fde14610866578063c6ab67a31461088f578063c87b56dd146108ba57610286565b80638da5cb5b116100f25780638da5cb5b146107385780638f770ad01461076357806394bf804d1461078e57806395d89b41146107aa5780639852595c146107d557610286565b80636a61e5fc1461064157806370a082311461066a578063715018a6146106a75780638b74b9ab146106be5780638b83209b146106fb57610286565b80632cb9b2ac116101bc57806342966c681161018057806342966c681461054c5780634f6ccce71461057557806350033dc2146105b257806355f804b3146105db5780636352211e1461060457610286565b80632cb9b2ac146104675780632f745c59146104925780633a98ef39146104cf5780633bd2b67d146104fa57806342842e0e1461052357610286565b80631596facb116102035780631596facb1461038257806318160ddd146103ad57806319165587146103d85780632166a25a1461040157806323b872dd1461043e57610286565b806301ffc9a71461028b57806306fdde03146102c8578063081812fc146102f3578063095ea7b314610330578063109695231461035957610286565b36610286577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061026d6109f0565b3460405161027c929190613e88565b60405180910390a1005b600080fd5b34801561029757600080fd5b506102b260048036038101906102ad919061370e565b6109f8565b6040516102bf9190613ed3565b60405180910390f35b3480156102d457600080fd5b506102dd610a0a565b6040516102ea9190613eee565b60405180910390f35b3480156102ff57600080fd5b5061031a600480360381019061031591906137b1565b610a9c565b6040516103279190613df8565b60405180910390f35b34801561033c57600080fd5b50610357600480360381019061035291906136a1565b610b21565b005b34801561036557600080fd5b50610380600480360381019061037b9190613768565b610c39565b005b34801561038e57600080fd5b50610397610ccf565b6040516103a491906142d0565b60405180910390f35b3480156103b957600080fd5b506103c2610cd5565b6040516103cf91906142d0565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061351e565b610ce2565b005b34801561040d57600080fd5b50610428600480360381019061042391906134f1565b610f4a565b6040516104359190613eb1565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061358b565b610ff8565b005b34801561047357600080fd5b5061047c611058565b60405161048991906142d0565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906136a1565b61105e565b6040516104c691906142d0565b60405180910390f35b3480156104db57600080fd5b506104e4611103565b6040516104f191906142d0565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c91906137b1565b61110d565b005b34801561052f57600080fd5b5061054a6004803603810190610545919061358b565b611193565b005b34801561055857600080fd5b50610573600480360381019061056e91906137b1565b6111b3565b005b34801561058157600080fd5b5061059c600480360381019061059791906137b1565b61120f565b6040516105a991906142d0565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d491906137b1565b611280565b005b3480156105e757600080fd5b5061060260048036038101906105fd9190613768565b611306565b005b34801561061057600080fd5b5061062b600480360381019061062691906137b1565b61139c565b6040516106389190613df8565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906137b1565b61144e565b005b34801561067657600080fd5b50610691600480360381019061068c91906134f1565b6114d4565b60405161069e91906142d0565b60405180910390f35b3480156106b357600080fd5b506106bc61158c565b005b3480156106ca57600080fd5b506106e560048036038101906106e091906136e1565b611614565b6040516106f291906142d0565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d91906137b1565b61164a565b60405161072f9190613df8565b60405180910390f35b34801561074457600080fd5b5061074d611692565b60405161075a9190613df8565b60405180910390f35b34801561076f57600080fd5b506107786116bc565b60405161078591906142d0565b60405180910390f35b6107a860048036038101906107a391906137de565b6116c2565b005b3480156107b657600080fd5b506107bf6119b3565b6040516107cc9190613eee565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f791906134f1565b611a45565b60405161080991906142d0565b60405180910390f35b34801561081e57600080fd5b50610827611a8e565b60405161083491906142d0565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190613661565b611a94565b005b34801561087257600080fd5b5061088d600480360381019061088891906135de565b611c15565b005b34801561089b57600080fd5b506108a4611c77565b6040516108b19190613eee565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc91906137b1565b611d05565b6040516108ee9190613eee565b60405180910390f35b34801561090357600080fd5b5061091e600480360381019061091991906134f1565b611dac565b60405161092b91906142d0565b60405180910390f35b34801561094057600080fd5b50610949611df5565b60405161095691906142d0565b60405180910390f35b34801561096b57600080fd5b50610974611dfb565b60405161098191906142d0565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac919061354b565b611e05565b6040516109be9190613ed3565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e991906134f1565b611e99565b005b600033905090565b6000610a0382611f91565b9050919050565b606060008054610a199061460c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a459061460c565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b5050505050905090565b6000610aa78261200b565b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90614190565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2c8261139c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490614210565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbc6109f0565b73ffffffffffffffffffffffffffffffffffffffff161480610beb5750610bea81610be56109f0565b611e05565b5b610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190614110565b60405180910390fd5b610c348383612077565b505050565b610c416109f0565b73ffffffffffffffffffffffffffffffffffffffff16610c5f611692565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac906141b0565b60405180910390fd5b8060189080519060200190610ccb9291906132f0565b5050565b60115481565b6000600880549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613ff0565b60405180910390fd5b6000600d5447610d7491906143f9565b90506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c54600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610e069190614480565b610e10919061444f565b610e1a91906144da565b90506000811415610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e57906140b0565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eab91906143f9565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610efc91906143f9565b600d81905550610f0c8382612130565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610f3d929190613e13565b60405180910390a1505050565b60606000610f57836114d4565b905060008167ffffffffffffffff811115610f7557610f746147d4565b5b604051908082528060200260200182016040528015610fa35781602001602082028036833780820191505090505b50905060005b82811015610fed57610fbb858261105e565b828281518110610fce57610fcd6147a5565b5b6020026020010181815250508080610fe59061466f565b915050610fa9565b508092505050919050565b6110096110036109f0565b82612224565b611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90614230565b60405180910390fd5b611053838383612302565b505050565b60155481565b6000611069836114d4565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190613f30565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600c54905090565b6111156109f0565b73ffffffffffffffffffffffffffffffffffffffff16611133611692565b73ffffffffffffffffffffffffffffffffffffffff1614611189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611180906141b0565b60405180910390fd5b8060118190555050565b6111ae83838360405180602001604052806000815250611c15565b505050565b6111c46111be6109f0565b82612224565b611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614290565b60405180910390fd5b61120c8161255e565b50565b6000611219610cd5565b821061125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190614250565b60405180910390fd5b6008828154811061126e5761126d6147a5565b5b90600052602060002001549050919050565b6112886109f0565b73ffffffffffffffffffffffffffffffffffffffff166112a6611692565b73ffffffffffffffffffffffffffffffffffffffff16146112fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f3906141b0565b60405180910390fd5b8060158190555050565b61130e6109f0565b73ffffffffffffffffffffffffffffffffffffffff1661132c611692565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611379906141b0565b60405180910390fd5b80601990805190602001906113989291906132f0565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614150565b60405180910390fd5b80915050919050565b6114566109f0565b73ffffffffffffffffffffffffffffffffffffffff16611474611692565b73ffffffffffffffffffffffffffffffffffffffff16146114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c1906141b0565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614130565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115946109f0565b73ffffffffffffffffffffffffffffffffffffffff166115b2611692565b73ffffffffffffffffffffffffffffffffffffffff1614611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff906141b0565b60405180910390fd5b611612600061266f565b565b600081611625576012549050611645565b601554611630610cd5565b101561163f5760009050611645565b60125490505b919050565b6000601082815481106116605761165f6147a5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6002600a541415611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90614270565b60405180910390fd5b6002600a819055506117186109f0565b73ffffffffffffffffffffffffffffffffffffffff16611736611692565b73ffffffffffffffffffffffffffffffffffffffff16146117a65760006011541415801561176657504260115411155b6117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613f10565b60405180910390fd5b5b6013546117b1610cd5565b106117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e8906140d0565b60405180910390fd5b60008211801561180357506014548211155b611842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611839906140f0565b60405180910390fd5b6013548261184e610cd5565b61185891906143f9565b10611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906142b0565b60405180910390fd5b816118a36001611614565b6118ad9190614480565b3410156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690613f70565b60405180910390fd5b6118f76109f0565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90613fd0565b60405180910390fd5b60005b828110156119a65761197b82601654612735565b6016600081548092919061198e9061466f565b9190505550808061199e9061466f565b915050611967565b506001600a819055505050565b6060600180546119c29061460c565b80601f01602080910402602001604051908101604052809291908181526020018280546119ee9061460c565b8015611a3b5780601f10611a1057610100808354040283529160200191611a3b565b820191906000526020600020905b815481529060010190602001808311611a1e57829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b611a9c6109f0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614030565b60405180910390fd5b8060056000611b176109f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bc46109f0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c099190613ed3565b60405180910390a35050565b611c26611c206109f0565b83612224565b611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c90614230565b60405180910390fd5b611c7184848484612753565b50505050565b60188054611c849061460c565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb09061460c565b8015611cfd5780601f10611cd257610100808354040283529160200191611cfd565b820191906000526020600020905b815481529060010190602001808311611ce057829003601f168201915b505050505081565b6060611d108261200b565b611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d46906141f0565b60405180910390fd5b6000611d596127af565b90506000815111611d795760405180602001604052806000815250611da4565b80611d8384612841565b604051602001611d94929190613dbf565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60145481565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ea16109f0565b73ffffffffffffffffffffffffffffffffffffffff16611ebf611692565b73ffffffffffffffffffffffffffffffffffffffff1614611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c906141b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c90613f90565b60405180910390fd5b611f8e8161266f565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120045750612003826129a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120ea8361139c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a90614070565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161219990613de3565b60006040518083038185875af1925050503d80600081146121d6576040519150601f19603f3d011682016040523d82523d6000602084013e6121db565b606091505b505090508061221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614050565b60405180910390fd5b505050565b600061222f8261200b565b61226e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226590614090565b60405180910390fd5b60006122798361139c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122e857508373ffffffffffffffffffffffffffffffffffffffff166122d084610a9c565b73ffffffffffffffffffffffffffffffffffffffff16145b806122f957506122f88185611e05565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123228261139c565b73ffffffffffffffffffffffffffffffffffffffff1614612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f906141d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90614010565b60405180910390fd5b6123f3838383612a84565b6123fe600082612077565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461244e91906144da565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a591906143f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006125698261139c565b905061257781600084612a84565b612582600083612077565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d291906144da565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61274f828260405180602001604052806000815250612a94565b5050565b61275e848484612302565b61276a84848484612aef565b6127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a090613f50565b60405180910390fd5b50505050565b6060601980546127be9061460c565b80601f01602080910402602001604051908101604052809291908181526020018280546127ea9061460c565b80156128375780601f1061280c57610100808354040283529160200191612837565b820191906000526020600020905b81548152906001019060200180831161281a57829003601f168201915b5050505050905090565b60606000821415612889576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061299d565b600082905060005b600082146128bb5780806128a49061466f565b915050600a826128b4919061444f565b9150612891565b60008167ffffffffffffffff8111156128d7576128d66147d4565b5b6040519080825280601f01601f1916602001820160405280156129095781602001600182028036833780820191505090505b5090505b600085146129965760018261292291906144da565b9150600a8561293191906146b8565b603061293d91906143f9565b60f81b818381518110612953576129526147a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298f919061444f565b945061290d565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a6d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a7d5750612a7c82612c86565b5b9050919050565b612a8f838383612cf0565b505050565b612a9e8383612e04565b612aab6000848484612aef565b612aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae190613f50565b60405180910390fd5b505050565b6000612b108473ffffffffffffffffffffffffffffffffffffffff16612fd2565b15612c79578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b396109f0565b8786866040518563ffffffff1660e01b8152600401612b5b9493929190613e3c565b602060405180830381600087803b158015612b7557600080fd5b505af1925050508015612ba657506040513d601f19601f82011682018060405250810190612ba3919061373b565b60015b612c29573d8060008114612bd6576040519150601f19603f3d011682016040523d82523d6000602084013e612bdb565b606091505b50600081511415612c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1890613f50565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c7e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cfb838383612fe5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d3e57612d3981612fea565b612d7d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d7c57612d7b8382613033565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dc057612dbb816131a0565b612dff565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dfe57612dfd8282613271565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6b90614170565b60405180910390fd5b612e7d8161200b565b15612ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb490613fb0565b60405180910390fd5b612ec960008383612a84565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f1991906143f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613040846114d4565b61304a91906144da565b905060006007600084815260200190815260200160002054905081811461312f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131b491906144da565b90506000600960008481526020019081526020016000205490506000600883815481106131e4576131e36147a5565b5b906000526020600020015490508060088381548110613206576132056147a5565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061325557613254614776565b5b6001900381819060005260206000200160009055905550505050565b600061327c836114d4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546132fc9061460c565b90600052602060002090601f01602090048101928261331e5760008555613365565b82601f1061333757805160ff1916838001178555613365565b82800160010185558215613365579182015b82811115613364578251825591602001919060010190613349565b5b5090506133729190613376565b5090565b5b8082111561338f576000816000905550600101613377565b5090565b60006133a66133a184614310565b6142eb565b9050828152602081018484840111156133c2576133c1614808565b5b6133cd8482856145ca565b509392505050565b60006133e86133e384614341565b6142eb565b90508281526020810184848401111561340457613403614808565b5b61340f8482856145ca565b509392505050565b60008135905061342681615017565b92915050565b60008135905061343b8161502e565b92915050565b60008135905061345081615045565b92915050565b6000813590506134658161505c565b92915050565b60008151905061347a8161505c565b92915050565b600082601f83011261349557613494614803565b5b81356134a5848260208601613393565b91505092915050565b600082601f8301126134c3576134c2614803565b5b81356134d38482602086016133d5565b91505092915050565b6000813590506134eb81615073565b92915050565b60006020828403121561350757613506614812565b5b600061351584828501613417565b91505092915050565b60006020828403121561353457613533614812565b5b60006135428482850161342c565b91505092915050565b6000806040838503121561356257613561614812565b5b600061357085828601613417565b925050602061358185828601613417565b9150509250929050565b6000806000606084860312156135a4576135a3614812565b5b60006135b286828701613417565b93505060206135c386828701613417565b92505060406135d4868287016134dc565b9150509250925092565b600080600080608085870312156135f8576135f7614812565b5b600061360687828801613417565b945050602061361787828801613417565b9350506040613628878288016134dc565b925050606085013567ffffffffffffffff8111156136495761364861480d565b5b61365587828801613480565b91505092959194509250565b6000806040838503121561367857613677614812565b5b600061368685828601613417565b925050602061369785828601613441565b9150509250929050565b600080604083850312156136b8576136b7614812565b5b60006136c685828601613417565b92505060206136d7858286016134dc565b9150509250929050565b6000602082840312156136f7576136f6614812565b5b600061370584828501613441565b91505092915050565b60006020828403121561372457613723614812565b5b600061373284828501613456565b91505092915050565b60006020828403121561375157613750614812565b5b600061375f8482850161346b565b91505092915050565b60006020828403121561377e5761377d614812565b5b600082013567ffffffffffffffff81111561379c5761379b61480d565b5b6137a8848285016134ae565b91505092915050565b6000602082840312156137c7576137c6614812565b5b60006137d5848285016134dc565b91505092915050565b600080604083850312156137f5576137f4614812565b5b6000613803858286016134dc565b925050602061381485828601613417565b9150509250929050565b600061382a8383613da1565b60208301905092915050565b61383f81614594565b82525050565b61384e8161450e565b82525050565b600061385f82614382565b61386981856143b0565b935061387483614372565b8060005b838110156138a557815161388c888261381e565b9750613897836143a3565b925050600181019050613878565b5085935050505092915050565b6138bb81614532565b82525050565b60006138cc8261438d565b6138d681856143c1565b93506138e68185602086016145d9565b6138ef81614817565b840191505092915050565b600061390582614398565b61390f81856143dd565b935061391f8185602086016145d9565b61392881614817565b840191505092915050565b600061393e82614398565b61394881856143ee565b93506139588185602086016145d9565b80840191505092915050565b60006139716019836143dd565b915061397c82614828565b602082019050919050565b6000613994602b836143dd565b915061399f82614851565b604082019050919050565b60006139b76032836143dd565b91506139c2826148a0565b604082019050919050565b60006139da601d836143dd565b91506139e5826148ef565b602082019050919050565b60006139fd6026836143dd565b9150613a0882614918565b604082019050919050565b6000613a20601c836143dd565b9150613a2b82614967565b602082019050919050565b6000613a436027836143dd565b9150613a4e82614990565b604082019050919050565b6000613a666026836143dd565b9150613a71826149df565b604082019050919050565b6000613a896024836143dd565b9150613a9482614a2e565b604082019050919050565b6000613aac6019836143dd565b9150613ab782614a7d565b602082019050919050565b6000613acf603a836143dd565b9150613ada82614aa6565b604082019050919050565b6000613af2601d836143dd565b9150613afd82614af5565b602082019050919050565b6000613b15602c836143dd565b9150613b2082614b1e565b604082019050919050565b6000613b38602b836143dd565b9150613b4382614b6d565b604082019050919050565b6000613b5b6019836143dd565b9150613b6682614bbc565b602082019050919050565b6000613b7e602e836143dd565b9150613b8982614be5565b604082019050919050565b6000613ba16038836143dd565b9150613bac82614c34565b604082019050919050565b6000613bc4602a836143dd565b9150613bcf82614c83565b604082019050919050565b6000613be76029836143dd565b9150613bf282614cd2565b604082019050919050565b6000613c0a6020836143dd565b9150613c1582614d21565b602082019050919050565b6000613c2d602c836143dd565b9150613c3882614d4a565b604082019050919050565b6000613c506020836143dd565b9150613c5b82614d99565b602082019050919050565b6000613c736029836143dd565b9150613c7e82614dc2565b604082019050919050565b6000613c96602f836143dd565b9150613ca182614e11565b604082019050919050565b6000613cb96021836143dd565b9150613cc482614e60565b604082019050919050565b6000613cdc6000836143d2565b9150613ce782614eaf565b600082019050919050565b6000613cff6031836143dd565b9150613d0a82614eb2565b604082019050919050565b6000613d22602c836143dd565b9150613d2d82614f01565b604082019050919050565b6000613d45601f836143dd565b9150613d5082614f50565b602082019050919050565b6000613d686030836143dd565b9150613d7382614f79565b604082019050919050565b6000613d8b602c836143dd565b9150613d9682614fc8565b604082019050919050565b613daa8161458a565b82525050565b613db98161458a565b82525050565b6000613dcb8285613933565b9150613dd78284613933565b91508190509392505050565b6000613dee82613ccf565b9150819050919050565b6000602082019050613e0d6000830184613845565b92915050565b6000604082019050613e286000830185613836565b613e356020830184613db0565b9392505050565b6000608082019050613e516000830187613845565b613e5e6020830186613845565b613e6b6040830185613db0565b8181036060830152613e7d81846138c1565b905095945050505050565b6000604082019050613e9d6000830185613845565b613eaa6020830184613db0565b9392505050565b60006020820190508181036000830152613ecb8184613854565b905092915050565b6000602082019050613ee860008301846138b2565b92915050565b60006020820190508181036000830152613f0881846138fa565b905092915050565b60006020820190508181036000830152613f2981613964565b9050919050565b60006020820190508181036000830152613f4981613987565b9050919050565b60006020820190508181036000830152613f69816139aa565b9050919050565b60006020820190508181036000830152613f89816139cd565b9050919050565b60006020820190508181036000830152613fa9816139f0565b9050919050565b60006020820190508181036000830152613fc981613a13565b9050919050565b60006020820190508181036000830152613fe981613a36565b9050919050565b6000602082019050818103600083015261400981613a59565b9050919050565b6000602082019050818103600083015261402981613a7c565b9050919050565b6000602082019050818103600083015261404981613a9f565b9050919050565b6000602082019050818103600083015261406981613ac2565b9050919050565b6000602082019050818103600083015261408981613ae5565b9050919050565b600060208201905081810360008301526140a981613b08565b9050919050565b600060208201905081810360008301526140c981613b2b565b9050919050565b600060208201905081810360008301526140e981613b4e565b9050919050565b6000602082019050818103600083015261410981613b71565b9050919050565b6000602082019050818103600083015261412981613b94565b9050919050565b6000602082019050818103600083015261414981613bb7565b9050919050565b6000602082019050818103600083015261416981613bda565b9050919050565b6000602082019050818103600083015261418981613bfd565b9050919050565b600060208201905081810360008301526141a981613c20565b9050919050565b600060208201905081810360008301526141c981613c43565b9050919050565b600060208201905081810360008301526141e981613c66565b9050919050565b6000602082019050818103600083015261420981613c89565b9050919050565b6000602082019050818103600083015261422981613cac565b9050919050565b6000602082019050818103600083015261424981613cf2565b9050919050565b6000602082019050818103600083015261426981613d15565b9050919050565b6000602082019050818103600083015261428981613d38565b9050919050565b600060208201905081810360008301526142a981613d5b565b9050919050565b600060208201905081810360008301526142c981613d7e565b9050919050565b60006020820190506142e56000830184613db0565b92915050565b60006142f5614306565b9050614301828261463e565b919050565b6000604051905090565b600067ffffffffffffffff82111561432b5761432a6147d4565b5b61433482614817565b9050602081019050919050565b600067ffffffffffffffff82111561435c5761435b6147d4565b5b61436582614817565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144048261458a565b915061440f8361458a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614444576144436146e9565b5b828201905092915050565b600061445a8261458a565b91506144658361458a565b92508261447557614474614718565b5b828204905092915050565b600061448b8261458a565b91506144968361458a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144cf576144ce6146e9565b5b828202905092915050565b60006144e58261458a565b91506144f08361458a565b925082821015614503576145026146e9565b5b828203905092915050565b60006145198261456a565b9050919050565b600061452b8261456a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061459f826145a6565b9050919050565b60006145b1826145b8565b9050919050565b60006145c38261456a565b9050919050565b82818337600083830152505050565b60005b838110156145f75780820151818401526020810190506145dc565b83811115614606576000848401525b50505050565b6000600282049050600182168061462457607f821691505b6020821081141561463857614637614747565b5b50919050565b61464782614817565b810181811067ffffffffffffffff82111715614666576146656147d4565b5b80604052505050565b600061467a8261458a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146ad576146ac6146e9565b5b600182019050919050565b60006146c38261458a565b91506146ce8361458a565b9250826146de576146dd614718565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2053616c65206973207061757365642e2e2e00000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20496e636f72726563742076616c75652073656e742e000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a205468652063616c6c657220697320616e6f7468657220636f60008201527f6e74726163742e00000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a2053616c652069732066696e69736865642e00000000000000600082015250565b7f4552433732313a20596f75206d6179206f6e6c79206d696e7420757020746f2060008201527f323020456d7074792042756e732e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4552433732313a205472616e73616374696f6e20776f756c642065786365656460008201527f20737570706c79206361702e0000000000000000000000000000000000000000602082015250565b6150208161450e565b811461502b57600080fd5b50565b61503781614520565b811461504257600080fd5b50565b61504e81614532565b811461505957600080fd5b50565b6150658161453e565b811461507057600080fd5b50565b61507c8161458a565b811461508757600080fd5b5056fea2646970667358221220a303d60646143edf233363165d8336096c6ed10153a760e899d4b7338d67fbdc64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023f5760003560e01c80636a61e5fc1161012e578063a035b1fe116100ab578063ce7c2ac21161006f578063ce7c2ac2146108f7578063df77294114610934578063e33b7de31461095f578063e985e9c51461098a578063f2fde38b146109c757610286565b8063a035b1fe14610812578063a22cb4651461083d578063b88d4fde14610866578063c6ab67a31461088f578063c87b56dd146108ba57610286565b80638da5cb5b116100f25780638da5cb5b146107385780638f770ad01461076357806394bf804d1461078e57806395d89b41146107aa5780639852595c146107d557610286565b80636a61e5fc1461064157806370a082311461066a578063715018a6146106a75780638b74b9ab146106be5780638b83209b146106fb57610286565b80632cb9b2ac116101bc57806342966c681161018057806342966c681461054c5780634f6ccce71461057557806350033dc2146105b257806355f804b3146105db5780636352211e1461060457610286565b80632cb9b2ac146104675780632f745c59146104925780633a98ef39146104cf5780633bd2b67d146104fa57806342842e0e1461052357610286565b80631596facb116102035780631596facb1461038257806318160ddd146103ad57806319165587146103d85780632166a25a1461040157806323b872dd1461043e57610286565b806301ffc9a71461028b57806306fdde03146102c8578063081812fc146102f3578063095ea7b314610330578063109695231461035957610286565b36610286577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061026d6109f0565b3460405161027c929190613e88565b60405180910390a1005b600080fd5b34801561029757600080fd5b506102b260048036038101906102ad919061370e565b6109f8565b6040516102bf9190613ed3565b60405180910390f35b3480156102d457600080fd5b506102dd610a0a565b6040516102ea9190613eee565b60405180910390f35b3480156102ff57600080fd5b5061031a600480360381019061031591906137b1565b610a9c565b6040516103279190613df8565b60405180910390f35b34801561033c57600080fd5b50610357600480360381019061035291906136a1565b610b21565b005b34801561036557600080fd5b50610380600480360381019061037b9190613768565b610c39565b005b34801561038e57600080fd5b50610397610ccf565b6040516103a491906142d0565b60405180910390f35b3480156103b957600080fd5b506103c2610cd5565b6040516103cf91906142d0565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061351e565b610ce2565b005b34801561040d57600080fd5b50610428600480360381019061042391906134f1565b610f4a565b6040516104359190613eb1565b60405180910390f35b34801561044a57600080fd5b506104656004803603810190610460919061358b565b610ff8565b005b34801561047357600080fd5b5061047c611058565b60405161048991906142d0565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b491906136a1565b61105e565b6040516104c691906142d0565b60405180910390f35b3480156104db57600080fd5b506104e4611103565b6040516104f191906142d0565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c91906137b1565b61110d565b005b34801561052f57600080fd5b5061054a6004803603810190610545919061358b565b611193565b005b34801561055857600080fd5b50610573600480360381019061056e91906137b1565b6111b3565b005b34801561058157600080fd5b5061059c600480360381019061059791906137b1565b61120f565b6040516105a991906142d0565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d491906137b1565b611280565b005b3480156105e757600080fd5b5061060260048036038101906105fd9190613768565b611306565b005b34801561061057600080fd5b5061062b600480360381019061062691906137b1565b61139c565b6040516106389190613df8565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906137b1565b61144e565b005b34801561067657600080fd5b50610691600480360381019061068c91906134f1565b6114d4565b60405161069e91906142d0565b60405180910390f35b3480156106b357600080fd5b506106bc61158c565b005b3480156106ca57600080fd5b506106e560048036038101906106e091906136e1565b611614565b6040516106f291906142d0565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d91906137b1565b61164a565b60405161072f9190613df8565b60405180910390f35b34801561074457600080fd5b5061074d611692565b60405161075a9190613df8565b60405180910390f35b34801561076f57600080fd5b506107786116bc565b60405161078591906142d0565b60405180910390f35b6107a860048036038101906107a391906137de565b6116c2565b005b3480156107b657600080fd5b506107bf6119b3565b6040516107cc9190613eee565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f791906134f1565b611a45565b60405161080991906142d0565b60405180910390f35b34801561081e57600080fd5b50610827611a8e565b60405161083491906142d0565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190613661565b611a94565b005b34801561087257600080fd5b5061088d600480360381019061088891906135de565b611c15565b005b34801561089b57600080fd5b506108a4611c77565b6040516108b19190613eee565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc91906137b1565b611d05565b6040516108ee9190613eee565b60405180910390f35b34801561090357600080fd5b5061091e600480360381019061091991906134f1565b611dac565b60405161092b91906142d0565b60405180910390f35b34801561094057600080fd5b50610949611df5565b60405161095691906142d0565b60405180910390f35b34801561096b57600080fd5b50610974611dfb565b60405161098191906142d0565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac919061354b565b611e05565b6040516109be9190613ed3565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e991906134f1565b611e99565b005b600033905090565b6000610a0382611f91565b9050919050565b606060008054610a199061460c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a459061460c565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b5050505050905090565b6000610aa78261200b565b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90614190565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2c8261139c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490614210565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbc6109f0565b73ffffffffffffffffffffffffffffffffffffffff161480610beb5750610bea81610be56109f0565b611e05565b5b610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190614110565b60405180910390fd5b610c348383612077565b505050565b610c416109f0565b73ffffffffffffffffffffffffffffffffffffffff16610c5f611692565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac906141b0565b60405180910390fd5b8060189080519060200190610ccb9291906132f0565b5050565b60115481565b6000600880549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613ff0565b60405180910390fd5b6000600d5447610d7491906143f9565b90506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c54600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610e069190614480565b610e10919061444f565b610e1a91906144da565b90506000811415610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e57906140b0565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eab91906143f9565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610efc91906143f9565b600d81905550610f0c8382612130565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610f3d929190613e13565b60405180910390a1505050565b60606000610f57836114d4565b905060008167ffffffffffffffff811115610f7557610f746147d4565b5b604051908082528060200260200182016040528015610fa35781602001602082028036833780820191505090505b50905060005b82811015610fed57610fbb858261105e565b828281518110610fce57610fcd6147a5565b5b6020026020010181815250508080610fe59061466f565b915050610fa9565b508092505050919050565b6110096110036109f0565b82612224565b611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90614230565b60405180910390fd5b611053838383612302565b505050565b60155481565b6000611069836114d4565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190613f30565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600c54905090565b6111156109f0565b73ffffffffffffffffffffffffffffffffffffffff16611133611692565b73ffffffffffffffffffffffffffffffffffffffff1614611189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611180906141b0565b60405180910390fd5b8060118190555050565b6111ae83838360405180602001604052806000815250611c15565b505050565b6111c46111be6109f0565b82612224565b611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614290565b60405180910390fd5b61120c8161255e565b50565b6000611219610cd5565b821061125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190614250565b60405180910390fd5b6008828154811061126e5761126d6147a5565b5b90600052602060002001549050919050565b6112886109f0565b73ffffffffffffffffffffffffffffffffffffffff166112a6611692565b73ffffffffffffffffffffffffffffffffffffffff16146112fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f3906141b0565b60405180910390fd5b8060158190555050565b61130e6109f0565b73ffffffffffffffffffffffffffffffffffffffff1661132c611692565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611379906141b0565b60405180910390fd5b80601990805190602001906113989291906132f0565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614150565b60405180910390fd5b80915050919050565b6114566109f0565b73ffffffffffffffffffffffffffffffffffffffff16611474611692565b73ffffffffffffffffffffffffffffffffffffffff16146114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c1906141b0565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614130565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115946109f0565b73ffffffffffffffffffffffffffffffffffffffff166115b2611692565b73ffffffffffffffffffffffffffffffffffffffff1614611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff906141b0565b60405180910390fd5b611612600061266f565b565b600081611625576012549050611645565b601554611630610cd5565b101561163f5760009050611645565b60125490505b919050565b6000601082815481106116605761165f6147a5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6002600a541415611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90614270565b60405180910390fd5b6002600a819055506117186109f0565b73ffffffffffffffffffffffffffffffffffffffff16611736611692565b73ffffffffffffffffffffffffffffffffffffffff16146117a65760006011541415801561176657504260115411155b6117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613f10565b60405180910390fd5b5b6013546117b1610cd5565b106117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e8906140d0565b60405180910390fd5b60008211801561180357506014548211155b611842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611839906140f0565b60405180910390fd5b6013548261184e610cd5565b61185891906143f9565b10611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906142b0565b60405180910390fd5b816118a36001611614565b6118ad9190614480565b3410156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690613f70565b60405180910390fd5b6118f76109f0565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90613fd0565b60405180910390fd5b60005b828110156119a65761197b82601654612735565b6016600081548092919061198e9061466f565b9190505550808061199e9061466f565b915050611967565b506001600a819055505050565b6060600180546119c29061460c565b80601f01602080910402602001604051908101604052809291908181526020018280546119ee9061460c565b8015611a3b5780601f10611a1057610100808354040283529160200191611a3b565b820191906000526020600020905b815481529060010190602001808311611a1e57829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b611a9c6109f0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614030565b60405180910390fd5b8060056000611b176109f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bc46109f0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c099190613ed3565b60405180910390a35050565b611c26611c206109f0565b83612224565b611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c90614230565b60405180910390fd5b611c7184848484612753565b50505050565b60188054611c849061460c565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb09061460c565b8015611cfd5780601f10611cd257610100808354040283529160200191611cfd565b820191906000526020600020905b815481529060010190602001808311611ce057829003601f168201915b505050505081565b6060611d108261200b565b611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d46906141f0565b60405180910390fd5b6000611d596127af565b90506000815111611d795760405180602001604052806000815250611da4565b80611d8384612841565b604051602001611d94929190613dbf565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60145481565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ea16109f0565b73ffffffffffffffffffffffffffffffffffffffff16611ebf611692565b73ffffffffffffffffffffffffffffffffffffffff1614611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c906141b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c90613f90565b60405180910390fd5b611f8e8161266f565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120045750612003826129a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120ea8361139c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a90614070565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161219990613de3565b60006040518083038185875af1925050503d80600081146121d6576040519150601f19603f3d011682016040523d82523d6000602084013e6121db565b606091505b505090508061221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614050565b60405180910390fd5b505050565b600061222f8261200b565b61226e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226590614090565b60405180910390fd5b60006122798361139c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122e857508373ffffffffffffffffffffffffffffffffffffffff166122d084610a9c565b73ffffffffffffffffffffffffffffffffffffffff16145b806122f957506122f88185611e05565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123228261139c565b73ffffffffffffffffffffffffffffffffffffffff1614612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f906141d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90614010565b60405180910390fd5b6123f3838383612a84565b6123fe600082612077565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461244e91906144da565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a591906143f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006125698261139c565b905061257781600084612a84565b612582600083612077565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d291906144da565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61274f828260405180602001604052806000815250612a94565b5050565b61275e848484612302565b61276a84848484612aef565b6127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a090613f50565b60405180910390fd5b50505050565b6060601980546127be9061460c565b80601f01602080910402602001604051908101604052809291908181526020018280546127ea9061460c565b80156128375780601f1061280c57610100808354040283529160200191612837565b820191906000526020600020905b81548152906001019060200180831161281a57829003601f168201915b5050505050905090565b60606000821415612889576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061299d565b600082905060005b600082146128bb5780806128a49061466f565b915050600a826128b4919061444f565b9150612891565b60008167ffffffffffffffff8111156128d7576128d66147d4565b5b6040519080825280601f01601f1916602001820160405280156129095781602001600182028036833780820191505090505b5090505b600085146129965760018261292291906144da565b9150600a8561293191906146b8565b603061293d91906143f9565b60f81b818381518110612953576129526147a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298f919061444f565b945061290d565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a6d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a7d5750612a7c82612c86565b5b9050919050565b612a8f838383612cf0565b505050565b612a9e8383612e04565b612aab6000848484612aef565b612aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae190613f50565b60405180910390fd5b505050565b6000612b108473ffffffffffffffffffffffffffffffffffffffff16612fd2565b15612c79578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b396109f0565b8786866040518563ffffffff1660e01b8152600401612b5b9493929190613e3c565b602060405180830381600087803b158015612b7557600080fd5b505af1925050508015612ba657506040513d601f19601f82011682018060405250810190612ba3919061373b565b60015b612c29573d8060008114612bd6576040519150601f19603f3d011682016040523d82523d6000602084013e612bdb565b606091505b50600081511415612c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1890613f50565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c7e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cfb838383612fe5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d3e57612d3981612fea565b612d7d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d7c57612d7b8382613033565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dc057612dbb816131a0565b612dff565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dfe57612dfd8282613271565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6b90614170565b60405180910390fd5b612e7d8161200b565b15612ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb490613fb0565b60405180910390fd5b612ec960008383612a84565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f1991906143f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613040846114d4565b61304a91906144da565b905060006007600084815260200190815260200160002054905081811461312f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131b491906144da565b90506000600960008481526020019081526020016000205490506000600883815481106131e4576131e36147a5565b5b906000526020600020015490508060088381548110613206576132056147a5565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061325557613254614776565b5b6001900381819060005260206000200160009055905550505050565b600061327c836114d4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546132fc9061460c565b90600052602060002090601f01602090048101928261331e5760008555613365565b82601f1061333757805160ff1916838001178555613365565b82800160010185558215613365579182015b82811115613364578251825591602001919060010190613349565b5b5090506133729190613376565b5090565b5b8082111561338f576000816000905550600101613377565b5090565b60006133a66133a184614310565b6142eb565b9050828152602081018484840111156133c2576133c1614808565b5b6133cd8482856145ca565b509392505050565b60006133e86133e384614341565b6142eb565b90508281526020810184848401111561340457613403614808565b5b61340f8482856145ca565b509392505050565b60008135905061342681615017565b92915050565b60008135905061343b8161502e565b92915050565b60008135905061345081615045565b92915050565b6000813590506134658161505c565b92915050565b60008151905061347a8161505c565b92915050565b600082601f83011261349557613494614803565b5b81356134a5848260208601613393565b91505092915050565b600082601f8301126134c3576134c2614803565b5b81356134d38482602086016133d5565b91505092915050565b6000813590506134eb81615073565b92915050565b60006020828403121561350757613506614812565b5b600061351584828501613417565b91505092915050565b60006020828403121561353457613533614812565b5b60006135428482850161342c565b91505092915050565b6000806040838503121561356257613561614812565b5b600061357085828601613417565b925050602061358185828601613417565b9150509250929050565b6000806000606084860312156135a4576135a3614812565b5b60006135b286828701613417565b93505060206135c386828701613417565b92505060406135d4868287016134dc565b9150509250925092565b600080600080608085870312156135f8576135f7614812565b5b600061360687828801613417565b945050602061361787828801613417565b9350506040613628878288016134dc565b925050606085013567ffffffffffffffff8111156136495761364861480d565b5b61365587828801613480565b91505092959194509250565b6000806040838503121561367857613677614812565b5b600061368685828601613417565b925050602061369785828601613441565b9150509250929050565b600080604083850312156136b8576136b7614812565b5b60006136c685828601613417565b92505060206136d7858286016134dc565b9150509250929050565b6000602082840312156136f7576136f6614812565b5b600061370584828501613441565b91505092915050565b60006020828403121561372457613723614812565b5b600061373284828501613456565b91505092915050565b60006020828403121561375157613750614812565b5b600061375f8482850161346b565b91505092915050565b60006020828403121561377e5761377d614812565b5b600082013567ffffffffffffffff81111561379c5761379b61480d565b5b6137a8848285016134ae565b91505092915050565b6000602082840312156137c7576137c6614812565b5b60006137d5848285016134dc565b91505092915050565b600080604083850312156137f5576137f4614812565b5b6000613803858286016134dc565b925050602061381485828601613417565b9150509250929050565b600061382a8383613da1565b60208301905092915050565b61383f81614594565b82525050565b61384e8161450e565b82525050565b600061385f82614382565b61386981856143b0565b935061387483614372565b8060005b838110156138a557815161388c888261381e565b9750613897836143a3565b925050600181019050613878565b5085935050505092915050565b6138bb81614532565b82525050565b60006138cc8261438d565b6138d681856143c1565b93506138e68185602086016145d9565b6138ef81614817565b840191505092915050565b600061390582614398565b61390f81856143dd565b935061391f8185602086016145d9565b61392881614817565b840191505092915050565b600061393e82614398565b61394881856143ee565b93506139588185602086016145d9565b80840191505092915050565b60006139716019836143dd565b915061397c82614828565b602082019050919050565b6000613994602b836143dd565b915061399f82614851565b604082019050919050565b60006139b76032836143dd565b91506139c2826148a0565b604082019050919050565b60006139da601d836143dd565b91506139e5826148ef565b602082019050919050565b60006139fd6026836143dd565b9150613a0882614918565b604082019050919050565b6000613a20601c836143dd565b9150613a2b82614967565b602082019050919050565b6000613a436027836143dd565b9150613a4e82614990565b604082019050919050565b6000613a666026836143dd565b9150613a71826149df565b604082019050919050565b6000613a896024836143dd565b9150613a9482614a2e565b604082019050919050565b6000613aac6019836143dd565b9150613ab782614a7d565b602082019050919050565b6000613acf603a836143dd565b9150613ada82614aa6565b604082019050919050565b6000613af2601d836143dd565b9150613afd82614af5565b602082019050919050565b6000613b15602c836143dd565b9150613b2082614b1e565b604082019050919050565b6000613b38602b836143dd565b9150613b4382614b6d565b604082019050919050565b6000613b5b6019836143dd565b9150613b6682614bbc565b602082019050919050565b6000613b7e602e836143dd565b9150613b8982614be5565b604082019050919050565b6000613ba16038836143dd565b9150613bac82614c34565b604082019050919050565b6000613bc4602a836143dd565b9150613bcf82614c83565b604082019050919050565b6000613be76029836143dd565b9150613bf282614cd2565b604082019050919050565b6000613c0a6020836143dd565b9150613c1582614d21565b602082019050919050565b6000613c2d602c836143dd565b9150613c3882614d4a565b604082019050919050565b6000613c506020836143dd565b9150613c5b82614d99565b602082019050919050565b6000613c736029836143dd565b9150613c7e82614dc2565b604082019050919050565b6000613c96602f836143dd565b9150613ca182614e11565b604082019050919050565b6000613cb96021836143dd565b9150613cc482614e60565b604082019050919050565b6000613cdc6000836143d2565b9150613ce782614eaf565b600082019050919050565b6000613cff6031836143dd565b9150613d0a82614eb2565b604082019050919050565b6000613d22602c836143dd565b9150613d2d82614f01565b604082019050919050565b6000613d45601f836143dd565b9150613d5082614f50565b602082019050919050565b6000613d686030836143dd565b9150613d7382614f79565b604082019050919050565b6000613d8b602c836143dd565b9150613d9682614fc8565b604082019050919050565b613daa8161458a565b82525050565b613db98161458a565b82525050565b6000613dcb8285613933565b9150613dd78284613933565b91508190509392505050565b6000613dee82613ccf565b9150819050919050565b6000602082019050613e0d6000830184613845565b92915050565b6000604082019050613e286000830185613836565b613e356020830184613db0565b9392505050565b6000608082019050613e516000830187613845565b613e5e6020830186613845565b613e6b6040830185613db0565b8181036060830152613e7d81846138c1565b905095945050505050565b6000604082019050613e9d6000830185613845565b613eaa6020830184613db0565b9392505050565b60006020820190508181036000830152613ecb8184613854565b905092915050565b6000602082019050613ee860008301846138b2565b92915050565b60006020820190508181036000830152613f0881846138fa565b905092915050565b60006020820190508181036000830152613f2981613964565b9050919050565b60006020820190508181036000830152613f4981613987565b9050919050565b60006020820190508181036000830152613f69816139aa565b9050919050565b60006020820190508181036000830152613f89816139cd565b9050919050565b60006020820190508181036000830152613fa9816139f0565b9050919050565b60006020820190508181036000830152613fc981613a13565b9050919050565b60006020820190508181036000830152613fe981613a36565b9050919050565b6000602082019050818103600083015261400981613a59565b9050919050565b6000602082019050818103600083015261402981613a7c565b9050919050565b6000602082019050818103600083015261404981613a9f565b9050919050565b6000602082019050818103600083015261406981613ac2565b9050919050565b6000602082019050818103600083015261408981613ae5565b9050919050565b600060208201905081810360008301526140a981613b08565b9050919050565b600060208201905081810360008301526140c981613b2b565b9050919050565b600060208201905081810360008301526140e981613b4e565b9050919050565b6000602082019050818103600083015261410981613b71565b9050919050565b6000602082019050818103600083015261412981613b94565b9050919050565b6000602082019050818103600083015261414981613bb7565b9050919050565b6000602082019050818103600083015261416981613bda565b9050919050565b6000602082019050818103600083015261418981613bfd565b9050919050565b600060208201905081810360008301526141a981613c20565b9050919050565b600060208201905081810360008301526141c981613c43565b9050919050565b600060208201905081810360008301526141e981613c66565b9050919050565b6000602082019050818103600083015261420981613c89565b9050919050565b6000602082019050818103600083015261422981613cac565b9050919050565b6000602082019050818103600083015261424981613cf2565b9050919050565b6000602082019050818103600083015261426981613d15565b9050919050565b6000602082019050818103600083015261428981613d38565b9050919050565b600060208201905081810360008301526142a981613d5b565b9050919050565b600060208201905081810360008301526142c981613d7e565b9050919050565b60006020820190506142e56000830184613db0565b92915050565b60006142f5614306565b9050614301828261463e565b919050565b6000604051905090565b600067ffffffffffffffff82111561432b5761432a6147d4565b5b61433482614817565b9050602081019050919050565b600067ffffffffffffffff82111561435c5761435b6147d4565b5b61436582614817565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144048261458a565b915061440f8361458a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614444576144436146e9565b5b828201905092915050565b600061445a8261458a565b91506144658361458a565b92508261447557614474614718565b5b828204905092915050565b600061448b8261458a565b91506144968361458a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144cf576144ce6146e9565b5b828202905092915050565b60006144e58261458a565b91506144f08361458a565b925082821015614503576145026146e9565b5b828203905092915050565b60006145198261456a565b9050919050565b600061452b8261456a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061459f826145a6565b9050919050565b60006145b1826145b8565b9050919050565b60006145c38261456a565b9050919050565b82818337600083830152505050565b60005b838110156145f75780820151818401526020810190506145dc565b83811115614606576000848401525b50505050565b6000600282049050600182168061462457607f821691505b6020821081141561463857614637614747565b5b50919050565b61464782614817565b810181811067ffffffffffffffff82111715614666576146656147d4565b5b80604052505050565b600061467a8261458a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146ad576146ac6146e9565b5b600182019050919050565b60006146c38261458a565b91506146ce8361458a565b9250826146de576146dd614718565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2053616c65206973207061757365642e2e2e00000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20496e636f72726563742076616c75652073656e742e000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a205468652063616c6c657220697320616e6f7468657220636f60008201527f6e74726163742e00000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a2053616c652069732066696e69736865642e00000000000000600082015250565b7f4552433732313a20596f75206d6179206f6e6c79206d696e7420757020746f2060008201527f323020456d7074792042756e732e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4552433732313a205472616e73616374696f6e20776f756c642065786365656460008201527f20737570706c79206361702e0000000000000000000000000000000000000000602082015250565b6150208161450e565b811461502b57600080fd5b50565b61503781614520565b811461504257600080fd5b50565b61504e81614532565b811461505957600080fd5b50565b6150658161453e565b811461507057600080fd5b50565b61507c8161458a565b811461508757600080fd5b5056fea2646970667358221220a303d60646143edf233363165d8336096c6ed10153a760e899d4b7338d67fbdc64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

72131:4639:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46859:40;46875:12;:10;:12::i;:::-;46889:9;46859:40;;;;;;;:::i;:::-;;;;;;;;72131:4639;;;;;76538:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23120:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24813:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24336:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74754:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72395:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56362:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48065:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75724:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25872:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72560:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55943:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46990:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74595:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26319:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43750:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56552:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75233:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75079:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22727:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74937:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22370:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51187:94;;;;;;;;;;;;;:::i;:::-;;75407:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47765:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50536:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72485:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73320:1171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23289:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47565:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72438:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25193:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26575:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72695:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23464:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47361:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72523:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47175:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25591:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51436:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9772:98;9825:7;9852:10;9845:17;;9772:98;:::o;76538:229::-;76694:4;76723:36;76747:11;76723:23;:36::i;:::-;76716:43;;76538:229;;;:::o;23120:100::-;23174:13;23207:5;23200:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23120:100;:::o;24813:308::-;24934:7;24981:16;24989:7;24981;:16::i;:::-;24959:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25089:15;:24;25105:7;25089:24;;;;;;;;;;;;;;;;;;;;;25082:31;;24813:308;;;:::o;24336:411::-;24417:13;24433:23;24448:7;24433:14;:23::i;:::-;24417:39;;24481:5;24475:11;;:2;:11;;;;24467:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24575:5;24559:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24584:37;24601:5;24608:12;:10;:12::i;:::-;24584:16;:37::i;:::-;24559:62;24537:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24718:21;24727:2;24731:7;24718:8;:21::i;:::-;24406:341;24336:411;;:::o;74754:126::-;50767:12;:10;:12::i;:::-;50756:23;;:7;:5;:7::i;:::-;:23;;;50748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74857:15:::1;74840:14;:32;;;;;;;;;;;;:::i;:::-;;74754:126:::0;:::o;72395:36::-;;;;:::o;56362:113::-;56423:7;56450:10;:17;;;;56443:24;;56362:113;:::o;48065:639::-;48160:1;48141:7;:16;48149:7;48141:16;;;;;;;;;;;;;;;;:20;48133:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48217:21;48265:14;;48241:21;:38;;;;:::i;:::-;48217:62;;48290:15;48386:9;:18;48396:7;48386:18;;;;;;;;;;;;;;;;48358:12;;48325:7;:16;48333:7;48325:16;;;;;;;;;;;;;;;;48309:13;:32;;;;:::i;:::-;48308:62;;;;:::i;:::-;:96;;;;:::i;:::-;48290:114;;48436:1;48425:7;:12;;48417:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48540:7;48519:9;:18;48529:7;48519:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;48498:9;:18;48508:7;48498:18;;;;;;;;;;;;;;;:49;;;;48592:7;48575:14;;:24;;;;:::i;:::-;48558:14;:41;;;;48612:35;48630:7;48639;48612:17;:35::i;:::-;48663:33;48679:7;48688;48663:33;;;;;;;:::i;:::-;;;;;;;;48122:582;;48065:639;:::o;75724:387::-;75815:16;75849:18;75870;75880:7;75870:9;:18::i;:::-;75849:39;;75901:25;75943:10;75929:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75901:53;;75972:9;75967:109;75987:10;75983:1;:14;75967:109;;;76033:31;76053:7;76062:1;76033:19;:31::i;:::-;76019:8;76028:1;76019:11;;;;;;;;:::i;:::-;;;;;;;:45;;;;;75999:3;;;;;:::i;:::-;;;;75967:109;;;;76095:8;76088:15;;;;75724:387;;;:::o;25872:376::-;26081:41;26100:12;:10;:12::i;:::-;26114:7;26081:18;:41::i;:::-;26059:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26212:28;26222:4;26228:2;26232:7;26212:9;:28::i;:::-;25872:376;;;:::o;72560:33::-;;;;:::o;55943:343::-;56085:7;56140:23;56157:5;56140:16;:23::i;:::-;56132:5;:31;56110:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;56252:12;:19;56265:5;56252:19;;;;;;;;;;;;;;;:26;56272:5;56252:26;;;;;;;;;;;;56245:33;;55943:343;;;;:::o;46990:91::-;47034:7;47061:12;;47054:19;;46990:91;:::o;74595:98::-;50767:12;:10;:12::i;:::-;50756:23;;:7;:5;:7::i;:::-;:23;;;50748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74676:9:::1;74665:8;:20;;;;74595:98:::0;:::o;26319:185::-;26457:39;26474:4;26480:2;26484:7;26457:39;;;;;;;;;;;;:16;:39::i;:::-;26319:185;;;:::o;43750:282::-;43882:41;43901:12;:10;:12::i;:::-;43915:7;43882:18;:41::i;:::-;43860:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;44010:14;44016:7;44010:5;:14::i;:::-;43750:282;:::o;56552:320::-;56672:7;56727:30;:28;:30::i;:::-;56719:5;:38;56697:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;56847:10;56858:5;56847:17;;;;;;;;:::i;:::-;;;;;;;;;;56840:24;;56552:320;;;:::o;75233:116::-;50767:12;:10;:12::i;:::-;50756:23;;:7;:5;:7::i;:::-;:23;;;50748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75327:14:::1;75311:13;:30;;;;75233:116:::0;:::o;75079:101::-;50767:12;:10;:12::i;:::-;50756:23;;:7;:5;:7::i;:::-;:23;;;50748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75165:7:::1;75150:12;:22;;;;;;;;;;;;:::i;:::-;;75079:101:::0;:::o;22727:326::-;22844:7;22869:13;22885:7;:16;22893:7;22885:16;;;;;;;;;;;;;;;;;;;;;22869:32;;22951:1;22934:19;;:5;:19;;;;22912:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;23040:5;23033:12;;;22727:326;;;:::o;74937:89::-;50767:12;:10;:12::i;:::-;50756:23;;:7;:5;:7::i;:::-;:23;;;50748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75012:6:::1;75004:5;:14;;;;74937:89:::0;:::o;22370:295::-;22487:7;22551:1;22534:19;;:5;:19;;;;22512:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22641:9;:16;22651:5;22641:16;;;;;;;;;;;;;;;;22634:23;;22370:295;;;:::o;51187:94::-;50767:12;:10;:12::i;:::-;50756:23;;:7;:5;:7::i;:::-;:23;;;50748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51252:21:::1;51270:1;51252:9;:21::i;:::-;51187:94::o:0;75407:243::-;75466:7;75491:8;75486:54;;75523:5;;75516:12;;;;75486:54;75570:13;;75554;:11;:13::i;:::-;:29;75550:70;;;75607:1;75600:8;;;;75550:70;75637:5;;75630:12;;75407:243;;;;:::o;47765:100::-;47816:7;47843;47851:5;47843:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47836:21;;47765:100;;;:::o;50536:87::-;50582:7;50609:6;;;;;;;;;;;50602:13;;50536:87;:::o;72485:31::-;;;;:::o;73320:1171::-;53617:1;54213:7;;:19;;54205:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53617:1;54346:7;:18;;;;73463:12:::1;:10;:12::i;:::-;73452:23;;:7;:5;:7::i;:::-;:23;;;73448:187;;73530:1;73518:8;;:13;;:44;;;;;73547:15;73535:8;;:27;;73518:44;73492:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;73448:187;73669:9;;73653:13;:11;:13::i;:::-;:25;73645:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;73757:1;73741:13;:17;:48;;;;;73779:10;;73762:13;:27;;73741:48;73719:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;73928:9;;73912:13;73896;:11;:13::i;:::-;:29;;;;:::i;:::-;:41;73874:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;74077:13;74055:19;74069:4;74055:13;:19::i;:::-;:35;;;;:::i;:::-;74042:9;:48;;74020:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;74257:12;:10;:12::i;:::-;74244:25;;:9;:25;;;74222:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;74354:9;74349:135;74373:13;74369:1;:17;74349:135;;;74408:35;74418:10;74430:12;;74408:9;:35::i;:::-;74458:12;;:14;;;;;;;;;:::i;:::-;;;;;;74388:3;;;;;:::i;:::-;;;;74349:135;;;;53573:1:::0;54525:7;:22;;;;73320:1171;;:::o;23289:104::-;23345:13;23378:7;23371:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23289:104;:::o;47565:109::-;47621:7;47648:9;:18;47658:7;47648:18;;;;;;;;;;;;;;;;47641:25;;47565:109;;;:::o;72438:40::-;;;;:::o;25193:327::-;25340:12;:10;:12::i;:::-;25328:24;;:8;:24;;;;25320:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25440:8;25395:18;:32;25414:12;:10;:12::i;:::-;25395:32;;;;;;;;;;;;;;;:42;25428:8;25395:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25493:8;25464:48;;25479:12;:10;:12::i;:::-;25464:48;;;25503:8;25464:48;;;;;;:::i;:::-;;;;;;;;25193:327;;:::o;26575:365::-;26764:41;26783:12;:10;:12::i;:::-;26797:7;26764:18;:41::i;:::-;26742:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26893:39;26907:4;26913:2;26917:7;26926:5;26893:13;:39::i;:::-;26575:365;;;;:::o;72695:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23464:468::-;23582:13;23635:16;23643:7;23635;:16::i;:::-;23613:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;23739:21;23763:10;:8;:10::i;:::-;23739:34;;23828:1;23810:7;23804:21;:25;:120;;;;;;;;;;;;;;;;;23873:7;23882:18;:7;:16;:18::i;:::-;23856:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23804:120;23784:140;;;23464:468;;;:::o;47361:105::-;47415:7;47442;:16;47450:7;47442:16;;;;;;;;;;;;;;;;47435:23;;47361:105;;;:::o;72523:30::-;;;;:::o;47175:95::-;47221:7;47248:14;;47241:21;;47175:95;:::o;25591:214::-;25733:4;25762:18;:25;25781:5;25762:25;;;;;;;;;;;;;;;:35;25788:8;25762:35;;;;;;;;;;;;;;;;;;;;;;;;;25755:42;;25591:214;;;;:::o;51436:229::-;50767:12;:10;:12::i;:::-;50756:23;;:7;:5;:7::i;:::-;:23;;;50748:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51559:1:::1;51539:22;;:8;:22;;;;51517:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;51638:19;51648:8;51638:9;:19::i;:::-;51436:229:::0;:::o;55559:300::-;55706:4;55763:35;55748:50;;;:11;:50;;;;:103;;;;55815:36;55839:11;55815:23;:36::i;:::-;55748:103;55728:123;;55559:300;;;:::o;28487:127::-;28552:4;28604:1;28576:30;;:7;:16;28584:7;28576:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28569:37;;28487:127;;;:::o;32610:174::-;32712:2;32685:15;:24;32701:7;32685:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32768:7;32764:2;32730:46;;32739:23;32754:7;32739:14;:23::i;:::-;32730:46;;;;;;;;;;;;32610:174;;:::o;12110:391::-;12239:6;12214:21;:31;;12192:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;12316:12;12334:9;:14;;12356:6;12334:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12315:52;;;12400:7;12378:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;12181:320;12110:391;;:::o;28781:452::-;28910:4;28954:16;28962:7;28954;:16::i;:::-;28932:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29053:13;29069:23;29084:7;29069:14;:23::i;:::-;29053:39;;29122:5;29111:16;;:7;:16;;;:64;;;;29168:7;29144:31;;:20;29156:7;29144:11;:20::i;:::-;:31;;;29111:64;:113;;;;29192:32;29209:5;29216:7;29192:16;:32::i;:::-;29111:113;29103:122;;;28781:452;;;;:::o;31877:615::-;32050:4;32023:31;;:23;32038:7;32023:14;:23::i;:::-;:31;;;32001:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;32156:1;32142:16;;:2;:16;;;;32134:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32212:39;32233:4;32239:2;32243:7;32212:20;:39::i;:::-;32316:29;32333:1;32337:7;32316:8;:29::i;:::-;32377:1;32358:9;:15;32368:4;32358:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32406:1;32389:9;:13;32399:2;32389:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32437:2;32418:7;:16;32426:7;32418:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32476:7;32472:2;32457:27;;32466:4;32457:27;;;;;;;;;;;;31877:615;;;:::o;31180:360::-;31240:13;31256:23;31271:7;31256:14;:23::i;:::-;31240:39;;31292:48;31313:5;31328:1;31332:7;31292:20;:48::i;:::-;31381:29;31398:1;31402:7;31381:8;:29::i;:::-;31443:1;31423:9;:16;31433:5;31423:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31462:7;:16;31470:7;31462:16;;;;;;;;;;;;31455:23;;;;;;;;;;;31524:7;31520:1;31496:36;;31505:5;31496:36;;;;;;;;;;;;31229:311;31180:360;:::o;51673:173::-;51729:16;51748:6;;;;;;;;;;;51729:25;;51774:8;51765:6;;:17;;;;;;;;;;;;;;;;;;51829:8;51798:40;;51819:8;51798:40;;;;;;;;;;;;51718:128;51673:173;:::o;29575:110::-;29651:26;29661:2;29665:7;29651:26;;;;;;;;;;;;:9;:26::i;:::-;29575:110;;:::o;27822:352::-;27979:28;27989:4;27995:2;27999:7;27979:9;:28::i;:::-;28040:48;28063:4;28069:2;28073:7;28082:5;28040:22;:48::i;:::-;28018:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27822:352;;;;:::o;76194:113::-;76254:13;76287:12;76280:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76194:113;:::o;7328:723::-;7384:13;7614:1;7605:5;:10;7601:53;;;7632:10;;;;;;;;;;;;;;;;;;;;;7601:53;7664:12;7679:5;7664:20;;7695:14;7720:78;7735:1;7727:4;:9;7720:78;;7753:8;;;;;:::i;:::-;;;;7784:2;7776:10;;;;;:::i;:::-;;;7720:78;;;7808:19;7840:6;7830:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7808:39;;7858:154;7874:1;7865:5;:10;7858:154;;7902:1;7892:11;;;;;:::i;:::-;;;7969:2;7961:5;:10;;;;:::i;:::-;7948:2;:24;;;;:::i;:::-;7935:39;;7918:6;7925;7918:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7998:2;7989:11;;;;;:::i;:::-;;;7858:154;;;8036:6;8022:21;;;;;7328:723;;;;:::o;21951:355::-;22098:4;22155:25;22140:40;;;:11;:40;;;;:105;;;;22212:33;22197:48;;;:11;:48;;;;22140:105;:158;;;;22262:36;22286:11;22262:23;:36::i;:::-;22140:158;22120:178;;21951:355;;;:::o;76315:215::-;76477:45;76504:4;76510:2;76514:7;76477:26;:45::i;:::-;76315:215;;;:::o;29912:321::-;30042:18;30048:2;30052:7;30042:5;:18::i;:::-;30093:54;30124:1;30128:2;30132:7;30141:5;30093:22;:54::i;:::-;30071:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29912:321;;;:::o;33349:980::-;33504:4;33525:15;:2;:13;;;:15::i;:::-;33521:801;;;33594:2;33578:36;;;33637:12;:10;:12::i;:::-;33672:4;33699:7;33729:5;33578:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33557:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33953:1;33936:6;:13;:18;33932:320;;;33979:108;;;;;;;;;;:::i;:::-;;;;;;;;33932:320;34202:6;34196:13;34187:6;34183:2;34179:15;34172:38;33557:710;33827:41;;;33817:51;;;:6;:51;;;;33810:58;;;;;33521:801;34306:4;34299:11;;33349:980;;;;;;;:::o;6775:207::-;6905:4;6949:25;6934:40;;;:11;:40;;;;6927:47;;6775:207;;;:::o;57485:589::-;57629:45;57656:4;57662:2;57666:7;57629:26;:45::i;:::-;57707:1;57691:18;;:4;:18;;;57687:187;;;57726:40;57758:7;57726:31;:40::i;:::-;57687:187;;;57796:2;57788:10;;:4;:10;;;57784:90;;57815:47;57848:4;57854:7;57815:32;:47::i;:::-;57784:90;57687:187;57902:1;57888:16;;:2;:16;;;57884:183;;;57921:45;57958:7;57921:36;:45::i;:::-;57884:183;;;57994:4;57988:10;;:2;:10;;;57984:83;;58015:40;58043:2;58047:7;58015:27;:40::i;:::-;57984:83;57884:183;57485:589;;;:::o;30569:382::-;30663:1;30649:16;;:2;:16;;;;30641:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30722:16;30730:7;30722;:16::i;:::-;30721:17;30713:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30784:45;30813:1;30817:2;30821:7;30784:20;:45::i;:::-;30859:1;30842:9;:13;30852:2;30842:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30890:2;30871:7;:16;30879:7;30871:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30935:7;30931:2;30910:33;;30927:1;30910:33;;;;;;;;;;;;30569:382;;:::o;10784:387::-;10844:4;11052:12;11119:7;11107:20;11099:28;;11162:1;11155:4;:8;11148:15;;;10784:387;;;:::o;34901:126::-;;;;:::o;58797:164::-;58901:10;:17;;;;58874:15;:24;58890:7;58874:24;;;;;;;;;;;:44;;;;58929:10;58945:7;58929:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58797:164;:::o;59588:1002::-;59868:22;59918:1;59893:22;59910:4;59893:16;:22::i;:::-;:26;;;;:::i;:::-;59868:51;;59930:18;59951:17;:26;59969:7;59951:26;;;;;;;;;;;;59930:47;;60098:14;60084:10;:28;60080:328;;60129:19;60151:12;:18;60164:4;60151:18;;;;;;;;;;;;;;;:34;60170:14;60151:34;;;;;;;;;;;;60129:56;;60235:11;60202:12;:18;60215:4;60202:18;;;;;;;;;;;;;;;:30;60221:10;60202:30;;;;;;;;;;;:44;;;;60352:10;60319:17;:30;60337:11;60319:30;;;;;;;;;;;:43;;;;60114:294;60080:328;60504:17;:26;60522:7;60504:26;;;;;;;;;;;60497:33;;;60548:12;:18;60561:4;60548:18;;;;;;;;;;;;;;;:34;60567:14;60548:34;;;;;;;;;;;60541:41;;;59683:907;;59588:1002;;:::o;60885:1079::-;61138:22;61183:1;61163:10;:17;;;;:21;;;;:::i;:::-;61138:46;;61195:18;61216:15;:24;61232:7;61216:24;;;;;;;;;;;;61195:45;;61567:19;61589:10;61600:14;61589:26;;;;;;;;:::i;:::-;;;;;;;;;;61567:48;;61653:11;61628:10;61639;61628:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;61764:10;61733:15;:28;61749:11;61733:28;;;;;;;;;;;:41;;;;61905:15;:24;61921:7;61905:24;;;;;;;;;;;61898:31;;;61940:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60956:1008;;;60885:1079;:::o;58375:221::-;58460:14;58477:20;58494:2;58477:16;:20::i;:::-;58460:37;;58535:7;58508:12;:16;58521:2;58508:16;;;;;;;;;;;;;;;:24;58525:6;58508:24;;;;;;;;;;;:34;;;;58582:6;58553:17;:26;58571:7;58553:26;;;;;;;;;;;:35;;;;58449:147;58375:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:137::-;1331:5;1369:6;1356:20;1347:29;;1385:32;1411:5;1385:32;:::i;:::-;1286:137;;;;:::o;1429:141::-;1485:5;1516:6;1510:13;1501:22;;1532:32;1558:5;1532:32;:::i;:::-;1429:141;;;;:::o;1589:338::-;1644:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:122;;1701:79;;:::i;:::-;1660:122;1818:6;1805:20;1843:78;1917:3;1909:6;1902:4;1894:6;1890:17;1843:78;:::i;:::-;1834:87;;1650:277;1589:338;;;;:::o;1947:340::-;2003:5;2052:3;2045:4;2037:6;2033:17;2029:27;2019:122;;2060:79;;:::i;:::-;2019:122;2177:6;2164:20;2202:79;2277:3;2269:6;2262:4;2254:6;2250:17;2202:79;:::i;:::-;2193:88;;2009:278;1947:340;;;;:::o;2293:139::-;2339:5;2377:6;2364:20;2355:29;;2393:33;2420:5;2393:33;:::i;:::-;2293:139;;;;:::o;2438:329::-;2497:6;2546:2;2534:9;2525:7;2521:23;2517:32;2514:119;;;2552:79;;:::i;:::-;2514:119;2672:1;2697:53;2742:7;2733:6;2722:9;2718:22;2697:53;:::i;:::-;2687:63;;2643:117;2438:329;;;;:::o;2773:345::-;2840:6;2889:2;2877:9;2868:7;2864:23;2860:32;2857:119;;;2895:79;;:::i;:::-;2857:119;3015:1;3040:61;3093:7;3084:6;3073:9;3069:22;3040:61;:::i;:::-;3030:71;;2986:125;2773:345;;;;:::o;3124:474::-;3192:6;3200;3249:2;3237:9;3228:7;3224:23;3220:32;3217:119;;;3255:79;;:::i;:::-;3217:119;3375:1;3400:53;3445:7;3436:6;3425:9;3421:22;3400:53;:::i;:::-;3390:63;;3346:117;3502:2;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3473:118;3124:474;;;;;:::o;3604:619::-;3681:6;3689;3697;3746:2;3734:9;3725:7;3721:23;3717:32;3714:119;;;3752:79;;:::i;:::-;3714:119;3872:1;3897:53;3942:7;3933:6;3922:9;3918:22;3897:53;:::i;:::-;3887:63;;3843:117;3999:2;4025:53;4070:7;4061:6;4050:9;4046:22;4025:53;:::i;:::-;4015:63;;3970:118;4127:2;4153:53;4198:7;4189:6;4178:9;4174:22;4153:53;:::i;:::-;4143:63;;4098:118;3604:619;;;;;:::o;4229:943::-;4324:6;4332;4340;4348;4397:3;4385:9;4376:7;4372:23;4368:33;4365:120;;;4404:79;;:::i;:::-;4365:120;4524:1;4549:53;4594:7;4585:6;4574:9;4570:22;4549:53;:::i;:::-;4539:63;;4495:117;4651:2;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4622:118;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4935:2;4924:9;4920:18;4907:32;4966:18;4958:6;4955:30;4952:117;;;4988:79;;:::i;:::-;4952:117;5093:62;5147:7;5138:6;5127:9;5123:22;5093:62;:::i;:::-;5083:72;;4878:287;4229:943;;;;;;;:::o;5178:468::-;5243:6;5251;5300:2;5288:9;5279:7;5275:23;5271:32;5268:119;;;5306:79;;:::i;:::-;5268:119;5426:1;5451:53;5496:7;5487:6;5476:9;5472:22;5451:53;:::i;:::-;5441:63;;5397:117;5553:2;5579:50;5621:7;5612:6;5601:9;5597:22;5579:50;:::i;:::-;5569:60;;5524:115;5178:468;;;;;:::o;5652:474::-;5720:6;5728;5777:2;5765:9;5756:7;5752:23;5748:32;5745:119;;;5783:79;;:::i;:::-;5745:119;5903:1;5928:53;5973:7;5964:6;5953:9;5949:22;5928:53;:::i;:::-;5918:63;;5874:117;6030:2;6056:53;6101:7;6092:6;6081:9;6077:22;6056:53;:::i;:::-;6046:63;;6001:118;5652:474;;;;;:::o;6132:323::-;6188:6;6237:2;6225:9;6216:7;6212:23;6208:32;6205:119;;;6243:79;;:::i;:::-;6205:119;6363:1;6388:50;6430:7;6421:6;6410:9;6406:22;6388:50;:::i;:::-;6378:60;;6334:114;6132:323;;;;:::o;6461:327::-;6519:6;6568:2;6556:9;6547:7;6543:23;6539:32;6536:119;;;6574:79;;:::i;:::-;6536:119;6694:1;6719:52;6763:7;6754:6;6743:9;6739:22;6719:52;:::i;:::-;6709:62;;6665:116;6461:327;;;;:::o;6794:349::-;6863:6;6912:2;6900:9;6891:7;6887:23;6883:32;6880:119;;;6918:79;;:::i;:::-;6880:119;7038:1;7063:63;7118:7;7109:6;7098:9;7094:22;7063:63;:::i;:::-;7053:73;;7009:127;6794:349;;;;:::o;7149:509::-;7218:6;7267:2;7255:9;7246:7;7242:23;7238:32;7235:119;;;7273:79;;:::i;:::-;7235:119;7421:1;7410:9;7406:17;7393:31;7451:18;7443:6;7440:30;7437:117;;;7473:79;;:::i;:::-;7437:117;7578:63;7633:7;7624:6;7613:9;7609:22;7578:63;:::i;:::-;7568:73;;7364:287;7149:509;;;;:::o;7664:329::-;7723:6;7772:2;7760:9;7751:7;7747:23;7743:32;7740:119;;;7778:79;;:::i;:::-;7740:119;7898:1;7923:53;7968:7;7959:6;7948:9;7944:22;7923:53;:::i;:::-;7913:63;;7869:117;7664:329;;;;:::o;7999:474::-;8067:6;8075;8124:2;8112:9;8103:7;8099:23;8095:32;8092:119;;;8130:79;;:::i;:::-;8092:119;8250:1;8275:53;8320:7;8311:6;8300:9;8296:22;8275:53;:::i;:::-;8265:63;;8221:117;8377:2;8403:53;8448:7;8439:6;8428:9;8424:22;8403:53;:::i;:::-;8393:63;;8348:118;7999:474;;;;;:::o;8479:179::-;8548:10;8569:46;8611:3;8603:6;8569:46;:::i;:::-;8647:4;8642:3;8638:14;8624:28;;8479:179;;;;:::o;8664:147::-;8759:45;8798:5;8759:45;:::i;:::-;8754:3;8747:58;8664:147;;:::o;8817:118::-;8904:24;8922:5;8904:24;:::i;:::-;8899:3;8892:37;8817:118;;:::o;8971:732::-;9090:3;9119:54;9167:5;9119:54;:::i;:::-;9189:86;9268:6;9263:3;9189:86;:::i;:::-;9182:93;;9299:56;9349:5;9299:56;:::i;:::-;9378:7;9409:1;9394:284;9419:6;9416:1;9413:13;9394:284;;;9495:6;9489:13;9522:63;9581:3;9566:13;9522:63;:::i;:::-;9515:70;;9608:60;9661:6;9608:60;:::i;:::-;9598:70;;9454:224;9441:1;9438;9434:9;9429:14;;9394:284;;;9398:14;9694:3;9687:10;;9095:608;;;8971:732;;;;:::o;9709:109::-;9790:21;9805:5;9790:21;:::i;:::-;9785:3;9778:34;9709:109;;:::o;9824:360::-;9910:3;9938:38;9970:5;9938:38;:::i;:::-;9992:70;10055:6;10050:3;9992:70;:::i;:::-;9985:77;;10071:52;10116:6;10111:3;10104:4;10097:5;10093:16;10071:52;:::i;:::-;10148:29;10170:6;10148:29;:::i;:::-;10143:3;10139:39;10132:46;;9914:270;9824:360;;;;:::o;10190:364::-;10278:3;10306:39;10339:5;10306:39;:::i;:::-;10361:71;10425:6;10420:3;10361:71;:::i;:::-;10354:78;;10441:52;10486:6;10481:3;10474:4;10467:5;10463:16;10441:52;:::i;:::-;10518:29;10540:6;10518:29;:::i;:::-;10513:3;10509:39;10502:46;;10282:272;10190:364;;;;:::o;10560:377::-;10666:3;10694:39;10727:5;10694:39;:::i;:::-;10749:89;10831:6;10826:3;10749:89;:::i;:::-;10742:96;;10847:52;10892:6;10887:3;10880:4;10873:5;10869:16;10847:52;:::i;:::-;10924:6;10919:3;10915:16;10908:23;;10670:267;10560:377;;;;:::o;10943:366::-;11085:3;11106:67;11170:2;11165:3;11106:67;:::i;:::-;11099:74;;11182:93;11271:3;11182:93;:::i;:::-;11300:2;11295:3;11291:12;11284:19;;10943:366;;;:::o;11315:::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11315:366;;;:::o;11687:::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11687:366;;;:::o;12059:::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12059:366;;;:::o;12431:::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12431:366;;;:::o;12803:::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12803:366;;;:::o;13175:::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13175:366;;;:::o;13547:::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13547:366;;;:::o;13919:::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;13919:366;;;:::o;14291:::-;14433:3;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14530:93;14619:3;14530:93;:::i;:::-;14648:2;14643:3;14639:12;14632:19;;14291:366;;;:::o;14663:::-;14805:3;14826:67;14890:2;14885:3;14826:67;:::i;:::-;14819:74;;14902:93;14991:3;14902:93;:::i;:::-;15020:2;15015:3;15011:12;15004:19;;14663:366;;;:::o;15035:::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15035:366;;;:::o;15407:::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15407:366;;;:::o;15779:::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15779:366;;;:::o;16151:::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16151:366;;;:::o;16523:::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16523:366;;;:::o;16895:::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;16895:366;;;:::o;17267:::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18011:366;;;:::o;18383:::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18383:366;;;:::o;18755:::-;18897:3;18918:67;18982:2;18977:3;18918:67;:::i;:::-;18911:74;;18994:93;19083:3;18994:93;:::i;:::-;19112:2;19107:3;19103:12;19096:19;;18755:366;;;:::o;19127:::-;19269:3;19290:67;19354:2;19349:3;19290:67;:::i;:::-;19283:74;;19366:93;19455:3;19366:93;:::i;:::-;19484:2;19479:3;19475:12;19468:19;;19127:366;;;:::o;19499:::-;19641:3;19662:67;19726:2;19721:3;19662:67;:::i;:::-;19655:74;;19738:93;19827:3;19738:93;:::i;:::-;19856:2;19851:3;19847:12;19840:19;;19499:366;;;:::o;19871:::-;20013:3;20034:67;20098:2;20093:3;20034:67;:::i;:::-;20027:74;;20110:93;20199:3;20110:93;:::i;:::-;20228:2;20223:3;20219:12;20212:19;;19871:366;;;:::o;20243:398::-;20402:3;20423:83;20504:1;20499:3;20423:83;:::i;:::-;20416:90;;20515:93;20604:3;20515:93;:::i;:::-;20633:1;20628:3;20624:11;20617:18;;20243:398;;;:::o;20647:366::-;20789:3;20810:67;20874:2;20869:3;20810:67;:::i;:::-;20803:74;;20886:93;20975:3;20886:93;:::i;:::-;21004:2;20999:3;20995:12;20988:19;;20647:366;;;:::o;21019:::-;21161:3;21182:67;21246:2;21241:3;21182:67;:::i;:::-;21175:74;;21258:93;21347:3;21258:93;:::i;:::-;21376:2;21371:3;21367:12;21360:19;;21019:366;;;:::o;21391:::-;21533:3;21554:67;21618:2;21613:3;21554:67;:::i;:::-;21547:74;;21630:93;21719:3;21630:93;:::i;:::-;21748:2;21743:3;21739:12;21732:19;;21391:366;;;:::o;21763:::-;21905:3;21926:67;21990:2;21985:3;21926:67;:::i;:::-;21919:74;;22002:93;22091:3;22002:93;:::i;:::-;22120:2;22115:3;22111:12;22104:19;;21763:366;;;:::o;22135:::-;22277:3;22298:67;22362:2;22357:3;22298:67;:::i;:::-;22291:74;;22374:93;22463:3;22374:93;:::i;:::-;22492:2;22487:3;22483:12;22476:19;;22135:366;;;:::o;22507:108::-;22584:24;22602:5;22584:24;:::i;:::-;22579:3;22572:37;22507:108;;:::o;22621:118::-;22708:24;22726:5;22708:24;:::i;:::-;22703:3;22696:37;22621:118;;:::o;22745:435::-;22925:3;22947:95;23038:3;23029:6;22947:95;:::i;:::-;22940:102;;23059:95;23150:3;23141:6;23059:95;:::i;:::-;23052:102;;23171:3;23164:10;;22745:435;;;;;:::o;23186:379::-;23370:3;23392:147;23535:3;23392:147;:::i;:::-;23385:154;;23556:3;23549:10;;23186:379;;;:::o;23571:222::-;23664:4;23702:2;23691:9;23687:18;23679:26;;23715:71;23783:1;23772:9;23768:17;23759:6;23715:71;:::i;:::-;23571:222;;;;:::o;23799:348::-;23928:4;23966:2;23955:9;23951:18;23943:26;;23979:79;24055:1;24044:9;24040:17;24031:6;23979:79;:::i;:::-;24068:72;24136:2;24125:9;24121:18;24112:6;24068:72;:::i;:::-;23799:348;;;;;:::o;24153:640::-;24348:4;24386:3;24375:9;24371:19;24363:27;;24400:71;24468:1;24457:9;24453:17;24444:6;24400:71;:::i;:::-;24481:72;24549:2;24538:9;24534:18;24525:6;24481:72;:::i;:::-;24563;24631:2;24620:9;24616:18;24607:6;24563:72;:::i;:::-;24682:9;24676:4;24672:20;24667:2;24656:9;24652:18;24645:48;24710:76;24781:4;24772:6;24710:76;:::i;:::-;24702:84;;24153:640;;;;;;;:::o;24799:332::-;24920:4;24958:2;24947:9;24943:18;24935:26;;24971:71;25039:1;25028:9;25024:17;25015:6;24971:71;:::i;:::-;25052:72;25120:2;25109:9;25105:18;25096:6;25052:72;:::i;:::-;24799:332;;;;;:::o;25137:373::-;25280:4;25318:2;25307:9;25303:18;25295:26;;25367:9;25361:4;25357:20;25353:1;25342:9;25338:17;25331:47;25395:108;25498:4;25489:6;25395:108;:::i;:::-;25387:116;;25137:373;;;;:::o;25516:210::-;25603:4;25641:2;25630:9;25626:18;25618:26;;25654:65;25716:1;25705:9;25701:17;25692:6;25654:65;:::i;:::-;25516:210;;;;:::o;25732:313::-;25845:4;25883:2;25872:9;25868:18;25860:26;;25932:9;25926:4;25922:20;25918:1;25907:9;25903:17;25896:47;25960:78;26033:4;26024:6;25960:78;:::i;:::-;25952:86;;25732:313;;;;:::o;26051:419::-;26217:4;26255:2;26244:9;26240:18;26232:26;;26304:9;26298:4;26294:20;26290:1;26279:9;26275:17;26268:47;26332:131;26458:4;26332:131;:::i;:::-;26324:139;;26051:419;;;:::o;26476:::-;26642:4;26680:2;26669:9;26665:18;26657:26;;26729:9;26723:4;26719:20;26715:1;26704:9;26700:17;26693:47;26757:131;26883:4;26757:131;:::i;:::-;26749:139;;26476:419;;;:::o;26901:::-;27067:4;27105:2;27094:9;27090:18;27082:26;;27154:9;27148:4;27144:20;27140:1;27129:9;27125:17;27118:47;27182:131;27308:4;27182:131;:::i;:::-;27174:139;;26901:419;;;:::o;27326:::-;27492:4;27530:2;27519:9;27515:18;27507:26;;27579:9;27573:4;27569:20;27565:1;27554:9;27550:17;27543:47;27607:131;27733:4;27607:131;:::i;:::-;27599:139;;27326:419;;;:::o;27751:::-;27917:4;27955:2;27944:9;27940:18;27932:26;;28004:9;27998:4;27994:20;27990:1;27979:9;27975:17;27968:47;28032:131;28158:4;28032:131;:::i;:::-;28024:139;;27751:419;;;:::o;28176:::-;28342:4;28380:2;28369:9;28365:18;28357:26;;28429:9;28423:4;28419:20;28415:1;28404:9;28400:17;28393:47;28457:131;28583:4;28457:131;:::i;:::-;28449:139;;28176:419;;;:::o;28601:::-;28767:4;28805:2;28794:9;28790:18;28782:26;;28854:9;28848:4;28844:20;28840:1;28829:9;28825:17;28818:47;28882:131;29008:4;28882:131;:::i;:::-;28874:139;;28601:419;;;:::o;29026:::-;29192:4;29230:2;29219:9;29215:18;29207:26;;29279:9;29273:4;29269:20;29265:1;29254:9;29250:17;29243:47;29307:131;29433:4;29307:131;:::i;:::-;29299:139;;29026:419;;;:::o;29451:::-;29617:4;29655:2;29644:9;29640:18;29632:26;;29704:9;29698:4;29694:20;29690:1;29679:9;29675:17;29668:47;29732:131;29858:4;29732:131;:::i;:::-;29724:139;;29451:419;;;:::o;29876:::-;30042:4;30080:2;30069:9;30065:18;30057:26;;30129:9;30123:4;30119:20;30115:1;30104:9;30100:17;30093:47;30157:131;30283:4;30157:131;:::i;:::-;30149:139;;29876:419;;;:::o;30301:::-;30467:4;30505:2;30494:9;30490:18;30482:26;;30554:9;30548:4;30544:20;30540:1;30529:9;30525:17;30518:47;30582:131;30708:4;30582:131;:::i;:::-;30574:139;;30301:419;;;:::o;30726:::-;30892:4;30930:2;30919:9;30915:18;30907:26;;30979:9;30973:4;30969:20;30965:1;30954:9;30950:17;30943:47;31007:131;31133:4;31007:131;:::i;:::-;30999:139;;30726:419;;;:::o;31151:::-;31317:4;31355:2;31344:9;31340:18;31332:26;;31404:9;31398:4;31394:20;31390:1;31379:9;31375:17;31368:47;31432:131;31558:4;31432:131;:::i;:::-;31424:139;;31151:419;;;:::o;31576:::-;31742:4;31780:2;31769:9;31765:18;31757:26;;31829:9;31823:4;31819:20;31815:1;31804:9;31800:17;31793:47;31857:131;31983:4;31857:131;:::i;:::-;31849:139;;31576:419;;;:::o;32001:::-;32167:4;32205:2;32194:9;32190:18;32182:26;;32254:9;32248:4;32244:20;32240:1;32229:9;32225:17;32218:47;32282:131;32408:4;32282:131;:::i;:::-;32274:139;;32001:419;;;:::o;32426:::-;32592:4;32630:2;32619:9;32615:18;32607:26;;32679:9;32673:4;32669:20;32665:1;32654:9;32650:17;32643:47;32707:131;32833:4;32707:131;:::i;:::-;32699:139;;32426:419;;;:::o;32851:::-;33017:4;33055:2;33044:9;33040:18;33032:26;;33104:9;33098:4;33094:20;33090:1;33079:9;33075:17;33068:47;33132:131;33258:4;33132:131;:::i;:::-;33124:139;;32851:419;;;:::o;33276:::-;33442:4;33480:2;33469:9;33465:18;33457:26;;33529:9;33523:4;33519:20;33515:1;33504:9;33500:17;33493:47;33557:131;33683:4;33557:131;:::i;:::-;33549:139;;33276:419;;;:::o;33701:::-;33867:4;33905:2;33894:9;33890:18;33882:26;;33954:9;33948:4;33944:20;33940:1;33929:9;33925:17;33918:47;33982:131;34108:4;33982:131;:::i;:::-;33974:139;;33701:419;;;:::o;34126:::-;34292:4;34330:2;34319:9;34315:18;34307:26;;34379:9;34373:4;34369:20;34365:1;34354:9;34350:17;34343:47;34407:131;34533:4;34407:131;:::i;:::-;34399:139;;34126:419;;;:::o;34551:::-;34717:4;34755:2;34744:9;34740:18;34732:26;;34804:9;34798:4;34794:20;34790:1;34779:9;34775:17;34768:47;34832:131;34958:4;34832:131;:::i;:::-;34824:139;;34551:419;;;:::o;34976:::-;35142:4;35180:2;35169:9;35165:18;35157:26;;35229:9;35223:4;35219:20;35215:1;35204:9;35200:17;35193:47;35257:131;35383:4;35257:131;:::i;:::-;35249:139;;34976:419;;;:::o;35401:::-;35567:4;35605:2;35594:9;35590:18;35582:26;;35654:9;35648:4;35644:20;35640:1;35629:9;35625:17;35618:47;35682:131;35808:4;35682:131;:::i;:::-;35674:139;;35401:419;;;:::o;35826:::-;35992:4;36030:2;36019:9;36015:18;36007:26;;36079:9;36073:4;36069:20;36065:1;36054:9;36050:17;36043:47;36107:131;36233:4;36107:131;:::i;:::-;36099:139;;35826:419;;;:::o;36251:::-;36417:4;36455:2;36444:9;36440:18;36432:26;;36504:9;36498:4;36494:20;36490:1;36479:9;36475:17;36468:47;36532:131;36658:4;36532:131;:::i;:::-;36524:139;;36251:419;;;:::o;36676:::-;36842:4;36880:2;36869:9;36865:18;36857:26;;36929:9;36923:4;36919:20;36915:1;36904:9;36900:17;36893:47;36957:131;37083:4;36957:131;:::i;:::-;36949:139;;36676:419;;;:::o;37101:::-;37267:4;37305:2;37294:9;37290:18;37282:26;;37354:9;37348:4;37344:20;37340:1;37329:9;37325:17;37318:47;37382:131;37508:4;37382:131;:::i;:::-;37374:139;;37101:419;;;:::o;37526:::-;37692:4;37730:2;37719:9;37715:18;37707:26;;37779:9;37773:4;37769:20;37765:1;37754:9;37750:17;37743:47;37807:131;37933:4;37807:131;:::i;:::-;37799:139;;37526:419;;;:::o;37951:::-;38117:4;38155:2;38144:9;38140:18;38132:26;;38204:9;38198:4;38194:20;38190:1;38179:9;38175:17;38168:47;38232:131;38358:4;38232:131;:::i;:::-;38224:139;;37951:419;;;:::o;38376:::-;38542:4;38580:2;38569:9;38565:18;38557:26;;38629:9;38623:4;38619:20;38615:1;38604:9;38600:17;38593:47;38657:131;38783:4;38657:131;:::i;:::-;38649:139;;38376:419;;;:::o;38801:222::-;38894:4;38932:2;38921:9;38917:18;38909:26;;38945:71;39013:1;39002:9;38998:17;38989:6;38945:71;:::i;:::-;38801:222;;;;:::o;39029:129::-;39063:6;39090:20;;:::i;:::-;39080:30;;39119:33;39147:4;39139:6;39119:33;:::i;:::-;39029:129;;;:::o;39164:75::-;39197:6;39230:2;39224:9;39214:19;;39164:75;:::o;39245:307::-;39306:4;39396:18;39388:6;39385:30;39382:56;;;39418:18;;:::i;:::-;39382:56;39456:29;39478:6;39456:29;:::i;:::-;39448:37;;39540:4;39534;39530:15;39522:23;;39245:307;;;:::o;39558:308::-;39620:4;39710:18;39702:6;39699:30;39696:56;;;39732:18;;:::i;:::-;39696:56;39770:29;39792:6;39770:29;:::i;:::-;39762:37;;39854:4;39848;39844:15;39836:23;;39558:308;;;:::o;39872:132::-;39939:4;39962:3;39954:11;;39992:4;39987:3;39983:14;39975:22;;39872:132;;;:::o;40010:114::-;40077:6;40111:5;40105:12;40095:22;;40010:114;;;:::o;40130:98::-;40181:6;40215:5;40209:12;40199:22;;40130:98;;;:::o;40234:99::-;40286:6;40320:5;40314:12;40304:22;;40234:99;;;:::o;40339:113::-;40409:4;40441;40436:3;40432:14;40424:22;;40339:113;;;:::o;40458:184::-;40557:11;40591:6;40586:3;40579:19;40631:4;40626:3;40622:14;40607:29;;40458:184;;;;:::o;40648:168::-;40731:11;40765:6;40760:3;40753:19;40805:4;40800:3;40796:14;40781:29;;40648:168;;;;:::o;40822:147::-;40923:11;40960:3;40945:18;;40822:147;;;;:::o;40975:169::-;41059:11;41093:6;41088:3;41081:19;41133:4;41128:3;41124:14;41109:29;;40975:169;;;;:::o;41150:148::-;41252:11;41289:3;41274:18;;41150:148;;;;:::o;41304:305::-;41344:3;41363:20;41381:1;41363:20;:::i;:::-;41358:25;;41397:20;41415:1;41397:20;:::i;:::-;41392:25;;41551:1;41483:66;41479:74;41476:1;41473:81;41470:107;;;41557:18;;:::i;:::-;41470:107;41601:1;41598;41594:9;41587:16;;41304:305;;;;:::o;41615:185::-;41655:1;41672:20;41690:1;41672:20;:::i;:::-;41667:25;;41706:20;41724:1;41706:20;:::i;:::-;41701:25;;41745:1;41735:35;;41750:18;;:::i;:::-;41735:35;41792:1;41789;41785:9;41780:14;;41615:185;;;;:::o;41806:348::-;41846:7;41869:20;41887:1;41869:20;:::i;:::-;41864:25;;41903:20;41921:1;41903:20;:::i;:::-;41898:25;;42091:1;42023:66;42019:74;42016:1;42013:81;42008:1;42001:9;41994:17;41990:105;41987:131;;;42098:18;;:::i;:::-;41987:131;42146:1;42143;42139:9;42128:20;;41806:348;;;;:::o;42160:191::-;42200:4;42220:20;42238:1;42220:20;:::i;:::-;42215:25;;42254:20;42272:1;42254:20;:::i;:::-;42249:25;;42293:1;42290;42287:8;42284:34;;;42298:18;;:::i;:::-;42284:34;42343:1;42340;42336:9;42328:17;;42160:191;;;;:::o;42357:96::-;42394:7;42423:24;42441:5;42423:24;:::i;:::-;42412:35;;42357:96;;;:::o;42459:104::-;42504:7;42533:24;42551:5;42533:24;:::i;:::-;42522:35;;42459:104;;;:::o;42569:90::-;42603:7;42646:5;42639:13;42632:21;42621:32;;42569:90;;;:::o;42665:149::-;42701:7;42741:66;42734:5;42730:78;42719:89;;42665:149;;;:::o;42820:126::-;42857:7;42897:42;42890:5;42886:54;42875:65;;42820:126;;;:::o;42952:77::-;42989:7;43018:5;43007:16;;42952:77;;;:::o;43035:134::-;43093:9;43126:37;43157:5;43126:37;:::i;:::-;43113:50;;43035:134;;;:::o;43175:126::-;43225:9;43258:37;43289:5;43258:37;:::i;:::-;43245:50;;43175:126;;;:::o;43307:113::-;43357:9;43390:24;43408:5;43390:24;:::i;:::-;43377:37;;43307:113;;;:::o;43426:154::-;43510:6;43505:3;43500;43487:30;43572:1;43563:6;43558:3;43554:16;43547:27;43426:154;;;:::o;43586:307::-;43654:1;43664:113;43678:6;43675:1;43672:13;43664:113;;;43763:1;43758:3;43754:11;43748:18;43744:1;43739:3;43735:11;43728:39;43700:2;43697:1;43693:10;43688:15;;43664:113;;;43795:6;43792:1;43789:13;43786:101;;;43875:1;43866:6;43861:3;43857:16;43850:27;43786:101;43635:258;43586:307;;;:::o;43899:320::-;43943:6;43980:1;43974:4;43970:12;43960:22;;44027:1;44021:4;44017:12;44048:18;44038:81;;44104:4;44096:6;44092:17;44082:27;;44038:81;44166:2;44158:6;44155:14;44135:18;44132:38;44129:84;;;44185:18;;:::i;:::-;44129:84;43950:269;43899:320;;;:::o;44225:281::-;44308:27;44330:4;44308:27;:::i;:::-;44300:6;44296:40;44438:6;44426:10;44423:22;44402:18;44390:10;44387:34;44384:62;44381:88;;;44449:18;;:::i;:::-;44381:88;44489:10;44485:2;44478:22;44268:238;44225:281;;:::o;44512:233::-;44551:3;44574:24;44592:5;44574:24;:::i;:::-;44565:33;;44620:66;44613:5;44610:77;44607:103;;;44690:18;;:::i;:::-;44607:103;44737:1;44730:5;44726:13;44719:20;;44512:233;;;:::o;44751:176::-;44783:1;44800:20;44818:1;44800:20;:::i;:::-;44795:25;;44834:20;44852:1;44834:20;:::i;:::-;44829:25;;44873:1;44863:35;;44878:18;;:::i;:::-;44863:35;44919:1;44916;44912:9;44907:14;;44751:176;;;;:::o;44933:180::-;44981:77;44978:1;44971:88;45078:4;45075:1;45068:15;45102:4;45099:1;45092:15;45119:180;45167:77;45164:1;45157:88;45264:4;45261:1;45254:15;45288:4;45285:1;45278:15;45305:180;45353:77;45350:1;45343:88;45450:4;45447:1;45440:15;45474:4;45471:1;45464:15;45491:180;45539:77;45536:1;45529:88;45636:4;45633:1;45626:15;45660:4;45657:1;45650:15;45677:180;45725:77;45722:1;45715:88;45822:4;45819:1;45812:15;45846:4;45843:1;45836:15;45863:180;45911:77;45908:1;45901:88;46008:4;46005:1;45998:15;46032:4;46029:1;46022:15;46049:117;46158:1;46155;46148:12;46172:117;46281:1;46278;46271:12;46295:117;46404:1;46401;46394:12;46418:117;46527:1;46524;46517:12;46541:102;46582:6;46633:2;46629:7;46624:2;46617:5;46613:14;46609:28;46599:38;;46541:102;;;:::o;46649:175::-;46789:27;46785:1;46777:6;46773:14;46766:51;46649:175;:::o;46830:230::-;46970:34;46966:1;46958:6;46954:14;46947:58;47039:13;47034:2;47026:6;47022:15;47015:38;46830:230;:::o;47066:237::-;47206:34;47202:1;47194:6;47190:14;47183:58;47275:20;47270:2;47262:6;47258:15;47251:45;47066:237;:::o;47309:179::-;47449:31;47445:1;47437:6;47433:14;47426:55;47309:179;:::o;47494:225::-;47634:34;47630:1;47622:6;47618:14;47611:58;47703:8;47698:2;47690:6;47686:15;47679:33;47494:225;:::o;47725:178::-;47865:30;47861:1;47853:6;47849:14;47842:54;47725:178;:::o;47909:226::-;48049:34;48045:1;48037:6;48033:14;48026:58;48118:9;48113:2;48105:6;48101:15;48094:34;47909:226;:::o;48141:225::-;48281:34;48277:1;48269:6;48265:14;48258:58;48350:8;48345:2;48337:6;48333:15;48326:33;48141:225;:::o;48372:223::-;48512:34;48508:1;48500:6;48496:14;48489:58;48581:6;48576:2;48568:6;48564:15;48557:31;48372:223;:::o;48601:175::-;48741:27;48737:1;48729:6;48725:14;48718:51;48601:175;:::o;48782:245::-;48922:34;48918:1;48910:6;48906:14;48899:58;48991:28;48986:2;48978:6;48974:15;48967:53;48782:245;:::o;49033:179::-;49173:31;49169:1;49161:6;49157:14;49150:55;49033:179;:::o;49218:231::-;49358:34;49354:1;49346:6;49342:14;49335:58;49427:14;49422:2;49414:6;49410:15;49403:39;49218:231;:::o;49455:230::-;49595:34;49591:1;49583:6;49579:14;49572:58;49664:13;49659:2;49651:6;49647:15;49640:38;49455:230;:::o;49691:175::-;49831:27;49827:1;49819:6;49815:14;49808:51;49691:175;:::o;49872:233::-;50012:34;50008:1;50000:6;49996:14;49989:58;50081:16;50076:2;50068:6;50064:15;50057:41;49872:233;:::o;50111:243::-;50251:34;50247:1;50239:6;50235:14;50228:58;50320:26;50315:2;50307:6;50303:15;50296:51;50111:243;:::o;50360:229::-;50500:34;50496:1;50488:6;50484:14;50477:58;50569:12;50564:2;50556:6;50552:15;50545:37;50360:229;:::o;50595:228::-;50735:34;50731:1;50723:6;50719:14;50712:58;50804:11;50799:2;50791:6;50787:15;50780:36;50595:228;:::o;50829:182::-;50969:34;50965:1;50957:6;50953:14;50946:58;50829:182;:::o;51017:231::-;51157:34;51153:1;51145:6;51141:14;51134:58;51226:14;51221:2;51213:6;51209:15;51202:39;51017:231;:::o;51254:182::-;51394:34;51390:1;51382:6;51378:14;51371:58;51254:182;:::o;51442:228::-;51582:34;51578:1;51570:6;51566:14;51559:58;51651:11;51646:2;51638:6;51634:15;51627:36;51442:228;:::o;51676:234::-;51816:34;51812:1;51804:6;51800:14;51793:58;51885:17;51880:2;51872:6;51868:15;51861:42;51676:234;:::o;51916:220::-;52056:34;52052:1;52044:6;52040:14;52033:58;52125:3;52120:2;52112:6;52108:15;52101:28;51916:220;:::o;52142:114::-;;:::o;52262:236::-;52402:34;52398:1;52390:6;52386:14;52379:58;52471:19;52466:2;52458:6;52454:15;52447:44;52262:236;:::o;52504:231::-;52644:34;52640:1;52632:6;52628:14;52621:58;52713:14;52708:2;52700:6;52696:15;52689:39;52504:231;:::o;52741:181::-;52881:33;52877:1;52869:6;52865:14;52858:57;52741:181;:::o;52928:235::-;53068:34;53064:1;53056:6;53052:14;53045:58;53137:18;53132:2;53124:6;53120:15;53113:43;52928:235;:::o;53169:231::-;53309:34;53305:1;53297:6;53293:14;53286:58;53378:14;53373:2;53365:6;53361:15;53354:39;53169:231;:::o;53406:122::-;53479:24;53497:5;53479:24;:::i;:::-;53472:5;53469:35;53459:63;;53518:1;53515;53508:12;53459:63;53406:122;:::o;53534:138::-;53615:32;53641:5;53615:32;:::i;:::-;53608:5;53605:43;53595:71;;53662:1;53659;53652:12;53595:71;53534:138;:::o;53678:116::-;53748:21;53763:5;53748:21;:::i;:::-;53741:5;53738:32;53728:60;;53784:1;53781;53774:12;53728:60;53678:116;:::o;53800:120::-;53872:23;53889:5;53872:23;:::i;:::-;53865:5;53862:34;53852:62;;53910:1;53907;53900:12;53852:62;53800:120;:::o;53926:122::-;53999:24;54017:5;53999:24;:::i;:::-;53992:5;53989:35;53979:63;;54038:1;54035;54028:12;53979:63;53926:122;:::o

Swarm Source

ipfs://a303d60646143edf233363165d8336096c6ed10153a760e899d4b7338d67fbdc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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