ETH Price: $3,240.33 (-0.44%)
Gas: 2 Gwei

Token

Bad Girlfriend Project Familiars (BGFFAMILIARS)
 

Overview

Max Total Supply

200 BGFFAMILIARS

Holders

70

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 BGFFAMILIARS
0x4300333a99d3419b1e9cfca9191a8a837fac2bd8
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:
BGFFAMILIARS

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-23
*/

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: contracts/BGFVault.sol

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

pragma solidity ^0.8.0;

/**

 * @dev Interface of the ERC165 standard, as defined in the

 * https://eips.ethereum.org/EIPS/eip-165[EIP].

 *

 * Implementers can declare support of contract interfaces, which can then be

 * queried by others ({ERC165Checker}).

 *

 * For an implementation, see {ERC165}.

 */

interface IERC165 {
    /**

     * @dev Returns true if this contract implements the interface defined by

     * `interfaceId`. See the corresponding

     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]

     * to learn more about how these ids are created.

     *

     * This function call must use less than 30 000 gas.

     */

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;

/**

 * @dev Required interface of an ERC721 compliant contract.

 */

interface IERC721 is IERC165 {
    /**

     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.

     */

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**

     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.

     */

    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**

     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.

     */

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**

     * @dev Returns the number of tokens in ``owner``'s account.

     */

    function balanceOf(address owner) external view returns (uint256 balance);

    /**

     * @dev Returns the owner of the `tokenId` token.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     */

    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**

     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients

     * are aware of the ERC721 protocol to prevent tokens from being forever locked.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `tokenId` token must exist and be owned by `from`.

     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

     *

     * Emits a {Transfer} event.

     */

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**

     * @dev Transfers `tokenId` token from `from` to `to`.

     *

     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `tokenId` token must be owned by `from`.

     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.

     *

     * Emits a {Transfer} event.

     */

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**

     * @dev Gives permission to `to` to transfer `tokenId` token to another account.

     * The approval is cleared when the token is transferred.

     *

     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.

     *

     * Requirements:

     *

     * - The caller must own the token or be an approved operator.

     * - `tokenId` must exist.

     *

     * Emits an {Approval} event.

     */

    function approve(address to, uint256 tokenId) external;

    /**

     * @dev Returns the account approved for `tokenId` token.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     */

    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**

     * @dev Approve or remove `operator` as an operator for the caller.

     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.

     *

     * Requirements:

     *

     * - The `operator` cannot be the caller.

     *

     * Emits an {ApprovalForAll} event.

     */

    function setApprovalForAll(address operator, bool _approved) external;

    /**

     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.

     *

     * See {setApprovalForAll}

     */

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    /**

     * @dev Safely transfers `tokenId` token from `from` to `to`.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `tokenId` token must exist and be owned by `from`.

     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

     *

     * Emits a {Transfer} event.

     */

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

pragma solidity ^0.8.0;

/**

 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension

 * @dev See https://eips.ethereum.org/EIPS/eip-721

 */

interface IERC721Enumerable is IERC721 {
    /**

     * @dev Returns the total amount of tokens stored by the contract.

     */

    function totalSupply() external view returns (uint256);

    /**

     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.

     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.

     */

    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**

     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.

     * Use along with {totalSupply} to enumerate all tokens.

     */

    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

pragma solidity ^0.8.0;

/**

 * @dev Implementation of the {IERC165} interface.

 *

 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check

 * for the additional interface id that will be supported. For example:

 *

 * ```solidity

 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);

 * }

 * ```

 *

 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.

 */

abstract contract ERC165 is IERC165 {
    /**

     * @dev See {IERC165-supportsInterface}.

     */

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

/**

 * @dev String operations.

 */

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**

     * @dev Converts a `uint256` to its ASCII `string` decimal representation.

     */

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence

        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }

        uint256 temp = value;

        uint256 digits;

        while (temp != 0) {
            digits++;

            temp /= 10;
        }

        bytes memory buffer = new bytes(digits);

        while (value != 0) {
            digits -= 1;

            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));

            value /= 10;
        }

        return string(buffer);
    }

    /**

     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.

     */

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }

        uint256 temp = value;

        uint256 length = 0;

        while (temp != 0) {
            length++;

            temp >>= 8;
        }

        return toHexString(value, length);
    }

    /**

     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.

     */

    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);

        buffer[0] = "0";

        buffer[1] = "x";

        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];

            value >>= 4;
        }

        require(value == 0, "Strings: hex length insufficient");

        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.8.0;

/**

 * @dev Collection of functions related to the address type

 */

library Address {
    /**

     * @dev Returns true if `account` is a contract.

     *

     * [IMPORTANT]

     * ====

     * It is unsafe to assume that an address for which this function returns

     * false is an externally-owned account (EOA) and not a contract.

     *

     * Among others, `isContract` will return false for the following

     * types of addresses:

     *

     *  - an externally-owned account

     *  - a contract in construction

     *  - an address where a contract will be created

     *  - an address where a contract lived, but was destroyed

     * ====

     */

    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in

        // construction, since the code is only stored at the end of the

        // constructor execution.

        uint256 size;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;

/**

 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension

 * @dev See https://eips.ethereum.org/EIPS/eip-721

 */

interface IERC721Metadata is IERC721 {
    /**

     * @dev Returns the token collection name.

     */

    function name() external view returns (string memory);

    /**

     * @dev Returns the token collection symbol.

     */

    function symbol() external view returns (string memory);

    /**

     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.

     */

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

/**

 * @title ERC721 token receiver interface

 * @dev Interface for any contract that wants to support safeTransfers

 * from ERC721 asset contracts.

 */

interface IERC721Receiver {
    /**

     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}

     * by `operator` from `from`, this function is called.

     *

     * It must return its Solidity selector to confirm the token transfer.

     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.

     *

     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.

     */

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

/**

 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including

 * the Metadata extension, but not including the Enumerable extension, which is available separately as

 * {ERC721Enumerable}.

 */

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    using Strings for uint256;

    // Token name

    string private _name;

    // Token symbol

    string private _symbol;

    // Mapping from token ID to owner address

    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count

    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address

    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**

     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.

     */

    constructor(string memory name_, string memory symbol_) {
        _name = name_;

        _symbol = symbol_;
    }

    /**

     * @dev See {IERC165-supportsInterface}.

     */

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

    /**

     * @dev See {IERC721-balanceOf}.

     */

    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );

        return _balances[owner];
    }

    /**

     * @dev See {IERC721-ownerOf}.

     */

    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];

        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );

        return owner;
    }

    /**

     * @dev See {IERC721Metadata-name}.

     */

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**

     * @dev See {IERC721Metadata-symbol}.

     */

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**

     * @dev See {IERC721Metadata-tokenURI}.

     */

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();

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

    /**

     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each

     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty

     * by default, can be overriden in child contracts.

     */

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

    /**

     * @dev See {IERC721-approve}.

     */

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);

        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**

     * @dev See {IERC721-getApproved}.

     */

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**

     * @dev See {IERC721-setApprovalForAll}.

     */

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        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 {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

pragma solidity ^0.8.0;

/**

 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds

 * enumerability of all the token ids in the contract as well as all token ids owned by each

 * account.

 */

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs

    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list

    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration

    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array

    mapping(uint256 => uint256) private _allTokensIndex;

    /**

     * @dev See {IERC165-supportsInterface}.

     */

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

    /**

     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.

     */

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );

        return _ownedTokens[owner][index];
    }

    /**

     * @dev See {IERC721Enumerable-totalSupply}.

     */

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**

     * @dev See {IERC721Enumerable-tokenByIndex}.

     */

    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );

        return _allTokens[index];
    }

    /**

     * @dev Hook that is called before any token transfer. This includes minting

     * and burning.

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be

     * transferred to `to`.

     * - When `from` is zero, `tokenId` will be minted for `to`.

     * - When `to` is zero, ``from``'s `tokenId` will be burned.

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     *

     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].

     */

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

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

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

    /**

     * @dev Private function to add a token to this extension's ownership-tracking data structures.

     * @param to address representing the new owner of the given token ID

     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address

     */

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);

        _ownedTokens[to][length] = tokenId;

        _ownedTokensIndex[tokenId] = length;
    }

    /**

     * @dev Private function to add a token to this extension's token tracking data structures.

     * @param tokenId uint256 ID of the token to be added to the tokens list

     */

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;

        _allTokens.push(tokenId);
    }

    /**

     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that

     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for

     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).

     * This has O(1) time complexity, but alters the order of the _ownedTokens array.

     * @param from address representing the previous owner of the given token ID

     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address

     */

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and

        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;

        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token

            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array

        delete _ownedTokensIndex[tokenId];

        delete _ownedTokens[from][lastTokenIndex];
    }

    /**

     * @dev Private function to remove a token from this extension's token tracking data structures.

     * This has O(1) time complexity, but alters the order of the _allTokens array.

     * @param tokenId uint256 ID of the token to be removed from the tokens list

     */

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and

        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;

        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so

        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding

        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token

        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array

        delete _allTokensIndex[tokenId];

        _allTokens.pop();
    }
}

pragma solidity ^0.8.0;

interface HELLISHVAULT {
    function getBankBalance(address _address) external returns (uint256);
    function spendBalanceFamiliars(address _address, uint256 _amount) external;
}

contract BGFFAMILIARS is ERC721Enumerable, Ownable {
    using Strings for uint256;
    string public baseURI;
    string public baseExtension = "";
    uint256 public maxSupplyT1 = 100;
    uint256 public maxSupplyT2 = 200;
    uint256 public maxSupply = 200;
    uint256 public priceT1 = 800;
    uint256 public priceT2 = 900;
    bool public pausedT1 = true;
    bool public pausedT2 = true;
    address public bgfVault;
    HELLISHVAULT vaultContract;

    constructor() ERC721("Bad Girlfriend Project Familiars", "BGFFAMILIARS") {}

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

    function setVaultAddress(address _address) public onlyOwner {
        bgfVault = _address;
        vaultContract = HELLISHVAULT(_address);
    }

    function mintT1() public {
        require(!pausedT1, "Not allowed yet.");
        uint256 balance = vaultContract.getBankBalance(msg.sender);
        require(balance >= priceT1, "Insufficient Balance.");
        uint256 supply = totalSupply();
        require(supply + 1 <= maxSupplyT1, "Total supply would be reached.");
        vaultContract.spendBalanceFamiliars(msg.sender, priceT1);
        _safeMint(msg.sender, supply + 1);
    }

    function mintT2() public {
        require(!pausedT2, "Not allowed yet.");
        uint256 balance = vaultContract.getBankBalance(msg.sender);
        require(balance >= priceT2, "Insufficient Balance.");
        uint256 supply = totalSupply();
        require(supply + 1 <= maxSupplyT2, "Total supply would be reached.");
        vaultContract.spendBalanceFamiliars(msg.sender, priceT2);
        _safeMint(msg.sender, supply + 1);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Token doesn't exist.");
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }

    // only owner
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function toggleT1(bool _state) public onlyOwner {
        pausedT1 = _state;
    }

    function toggleT2(bool _state) public onlyOwner {
        pausedT2 = _state;
    }

    function setPriceT1(uint256 _price) public onlyOwner {
        priceT1 = _price;
    }

    function setPriceT2(uint256 _price) public onlyOwner {
        priceT2 = _price;
    }

    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bgfVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyT1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyT2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintT1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintT2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedT1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedT2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceT1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceT2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceT1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPriceT2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleT1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleT2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b9291906200021f565b506064600d5560c8600e5560c8600f556103206010556103846011556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055503480156200008a57600080fd5b506040518060400160405280602081526020017f426164204769726c667269656e642050726f6a6563742046616d696c696172738152506040518060400160405280600c81526020017f42474646414d494c49415253000000000000000000000000000000000000000081525081600090805190602001906200010f9291906200021f565b508060019080519060200190620001289291906200021f565b5050506200014b6200013f6200015160201b60201c565b6200015960201b60201c565b62000334565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022d90620002cf565b90600052602060002090601f0160209004810192826200025157600085556200029d565b82601f106200026c57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029c5782518255916020019190600101906200027f565b5b509050620002ac9190620002b0565b5090565b5b80821115620002cb576000816000905550600101620002b1565b5090565b60006002820490506001821680620002e857607f821691505b60208210811415620002ff57620002fe62000305565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61497980620003446000396000f3fe60806040526004361061023b5760003560e01c80636c0360eb1161012e578063b88d4fde116100ab578063da79e4161161006f578063da79e41614610852578063e985e9c51461087b578063ec84b933146108b8578063f2fde38b146108e3578063fbcaabad1461090c5761023b565b8063b88d4fde1461076d578063c668286214610796578063c87b56dd146107c1578063d5abeb01146107fe578063da3ef23f146108295761023b565b806385535cc5116100f257806385535cc51461069a5780638da5cb5b146106c357806395d89b41146106ee578063a22cb46514610719578063a9ea1896146107425761023b565b80636c0360eb146105c557806370a08231146105f0578063715018a61461062d57806372c37a1c146106445780637cea25901461066f5761023b565b80633ccfd60b116101bc5780634f6ccce7116101805780634f6ccce7146104ce57806351c1e51c1461050b57806355f804b3146105365780636352211e1461055f57806369a64e291461059c5761023b565b80633ccfd60b1461040a57806342842e0e14610414578063438b63001461043d57806343f6295f1461047a57806345f988a4146104a35761023b565b806318160ddd1161020357806318160ddd1461032557806323b872dd146103505780632eb78aad146103795780632f745c59146103a257806330e146db146103df5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063120ff4861461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135f6565b610923565b6040516102749190613c71565b60405180910390f35b34801561028957600080fd5b5061029261099d565b60405161029f9190613c8c565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613689565b610a2f565b6040516102dc9190613bbf565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613591565b610ab4565b005b34801561031a57600080fd5b50610323610bcc565b005b34801561033157600080fd5b5061033a610e1a565b6040516103479190613f4e565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061348b565b610e27565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613689565b610e87565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190613591565b610f0d565b6040516103d69190613f4e565b60405180910390f35b3480156103eb57600080fd5b506103f4610fb2565b6040516104019190613f4e565b60405180910390f35b610412610fb8565b005b34801561042057600080fd5b5061043b6004803603810190610436919061348b565b611074565b005b34801561044957600080fd5b50610464600480360381019061045f9190613426565b611094565b6040516104719190613c4f565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c91906135cd565b61118e565b005b3480156104af57600080fd5b506104b8611227565b6040516104c59190613f4e565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613689565b61122d565b6040516105029190613f4e565b60405180910390f35b34801561051757600080fd5b506105206112c4565b60405161052d9190613f4e565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613648565b6112ca565b005b34801561056b57600080fd5b5061058660048036038101906105819190613689565b611360565b6040516105939190613bbf565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be91906135cd565b611412565b005b3480156105d157600080fd5b506105da6114ab565b6040516105e79190613c8c565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190613426565b611539565b6040516106249190613f4e565b60405180910390f35b34801561063957600080fd5b506106426115f1565b005b34801561065057600080fd5b50610659611679565b6040516106669190613c71565b60405180910390f35b34801561067b57600080fd5b5061068461168c565b6040516106919190613c71565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613426565b61169f565b005b3480156106cf57600080fd5b506106d86117a0565b6040516106e59190613bbf565b60405180910390f35b3480156106fa57600080fd5b506107036117ca565b6040516107109190613c8c565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190613555565b61185c565b005b34801561074e57600080fd5b506107576119dd565b6040516107649190613f4e565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f91906134da565b6119e3565b005b3480156107a257600080fd5b506107ab611a45565b6040516107b89190613c8c565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e39190613689565b611ad3565b6040516107f59190613c8c565b60405180910390f35b34801561080a57600080fd5b50610813611b7d565b6040516108209190613f4e565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613648565b611b83565b005b34801561085e57600080fd5b5061087960048036038101906108749190613689565b611c19565b005b34801561088757600080fd5b506108a2600480360381019061089d919061344f565b611c9f565b6040516108af9190613c71565b60405180910390f35b3480156108c457600080fd5b506108cd611d33565b6040516108da9190613bbf565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613426565b611d59565b005b34801561091857600080fd5b50610921611e51565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099657506109958261209f565b5b9050919050565b6060600080546109ac906141f2565b80601f01602080910402602001604051908101604052809291908181526020018280546109d8906141f2565b8015610a255780601f106109fa57610100808354040283529160200191610a25565b820191906000526020600020905b815481529060010190602001808311610a0857829003601f168201915b5050505050905090565b6000610a3a82612181565b610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7090613e2e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abf82611360565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790613eae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4f6121ed565b73ffffffffffffffffffffffffffffffffffffffff161480610b7e5750610b7d81610b786121ed565b611c9f565b5b610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb490613d8e565b60405180910390fd5b610bc783836121f5565b505050565b601260019054906101000a900460ff1615610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613eee565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304cdb171336040518263ffffffff1660e01b8152600401610c799190613bbf565b602060405180830381600087803b158015610c9357600080fd5b505af1158015610ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccb91906136b2565b9050601154811015610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613dee565b60405180910390fd5b6000610d1c610e1a565b9050600e54600182610d2e9190614081565b1115610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690613e8e565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da89ddf5336011546040518363ffffffff1660e01b8152600401610dce929190613c26565b600060405180830381600087803b158015610de857600080fd5b505af1158015610dfc573d6000803e3d6000fd5b50505050610e1633600183610e119190614081565b6122ae565b5050565b6000600880549050905090565b610e38610e326121ed565b826122cc565b610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613f0e565b60405180910390fd5b610e828383836123aa565b505050565b610e8f6121ed565b73ffffffffffffffffffffffffffffffffffffffff16610ead6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613e4e565b60405180910390fd5b8060118190555050565b6000610f1883611539565b8210610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613cae565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610fc06121ed565b73ffffffffffffffffffffffffffffffffffffffff16610fde6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90613e4e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061107257600080fd5b565b61108f838383604051806020016040528060008152506119e3565b505050565b606060006110a183611539565b905060008167ffffffffffffffff8111156110e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111135781602001602082028036833780820191505090505b50905060005b828110156111835761112b8582610f0d565b828281518110611164577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061117b90614255565b915050611119565b508092505050919050565b6111966121ed565b73ffffffffffffffffffffffffffffffffffffffff166111b46117a0565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190613e4e565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60115481565b6000611237610e1a565b8210611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90613f2e565b60405180910390fd5b600882815481106112b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d5481565b6112d26121ed565b73ffffffffffffffffffffffffffffffffffffffff166112f06117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d90613e4e565b60405180910390fd5b80600b908051906020019061135c929190613235565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090613dce565b60405180910390fd5b80915050919050565b61141a6121ed565b73ffffffffffffffffffffffffffffffffffffffff166114386117a0565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613e4e565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b600b80546114b8906141f2565b80601f01602080910402602001604051908101604052809291908181526020018280546114e4906141f2565b80156115315780601f1061150657610100808354040283529160200191611531565b820191906000526020600020905b81548152906001019060200180831161151457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190613dae565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115f96121ed565b73ffffffffffffffffffffffffffffffffffffffff166116176117a0565b73ffffffffffffffffffffffffffffffffffffffff161461166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490613e4e565b60405180910390fd5b6116776000612606565b565b601260019054906101000a900460ff1681565b601260009054906101000a900460ff1681565b6116a76121ed565b73ffffffffffffffffffffffffffffffffffffffff166116c56117a0565b73ffffffffffffffffffffffffffffffffffffffff161461171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613e4e565b60405180910390fd5b80601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117d9906141f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611805906141f2565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b6118646121ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990613d4e565b60405180910390fd5b80600560006118df6121ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661198c6121ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119d19190613c71565b60405180910390a35050565b60105481565b6119f46119ee6121ed565b836122cc565b611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90613f0e565b60405180910390fd5b611a3f848484846126cc565b50505050565b600c8054611a52906141f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7e906141f2565b8015611acb5780601f10611aa057610100808354040283529160200191611acb565b820191906000526020600020905b815481529060010190602001808311611aae57829003601f168201915b505050505081565b6060611ade82612181565b611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490613ece565b60405180910390fd5b6000611b27612728565b90506000815111611b475760405180602001604052806000815250611b75565b80611b51846127ba565b600c604051602001611b6593929190613b8e565b6040516020818303038152906040525b915050919050565b600f5481565b611b8b6121ed565b73ffffffffffffffffffffffffffffffffffffffff16611ba96117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613e4e565b60405180910390fd5b80600c9080519060200190611c15929190613235565b5050565b611c216121ed565b73ffffffffffffffffffffffffffffffffffffffff16611c3f6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c90613e4e565b60405180910390fd5b8060108190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d616121ed565b73ffffffffffffffffffffffffffffffffffffffff16611d7f6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90613e4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90613cee565b60405180910390fd5b611e4e81612606565b50565b601260009054906101000a900460ff1615611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890613eee565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304cdb171336040518263ffffffff1660e01b8152600401611efe9190613bbf565b602060405180830381600087803b158015611f1857600080fd5b505af1158015611f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5091906136b2565b9050601054811015611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90613dee565b60405180910390fd5b6000611fa1610e1a565b9050600d54600182611fb39190614081565b1115611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb90613e8e565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da89ddf5336010546040518363ffffffff1660e01b8152600401612053929190613c26565b600060405180830381600087803b15801561206d57600080fd5b505af1158015612081573d6000803e3d6000fd5b5050505061209b336001836120969190614081565b6122ae565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061216a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061217a575061217982612967565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661226883611360565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6122c88282604051806020016040528060008152506129d1565b5050565b60006122d782612181565b612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90613d6e565b60405180910390fd5b600061232183611360565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061239057508373ffffffffffffffffffffffffffffffffffffffff1661237884610a2f565b73ffffffffffffffffffffffffffffffffffffffff16145b806123a157506123a08185611c9f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123ca82611360565b73ffffffffffffffffffffffffffffffffffffffff1614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790613e6e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790613d2e565b60405180910390fd5b61249b838383612a2c565b6124a66000826121f5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f69190614108565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254d9190614081565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126d78484846123aa565b6126e384848484612b40565b612722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271990613cce565b60405180910390fd5b50505050565b6060600b8054612737906141f2565b80601f0160208091040260200160405190810160405280929190818152602001828054612763906141f2565b80156127b05780601f10612785576101008083540402835291602001916127b0565b820191906000526020600020905b81548152906001019060200180831161279357829003601f168201915b5050505050905090565b60606000821415612802576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612962565b600082905060005b6000821461283457808061281d90614255565b915050600a8261282d91906140d7565b915061280a565b60008167ffffffffffffffff811115612876577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128a85781602001600182028036833780820191505090505b5090505b6000851461295b576001826128c19190614108565b9150600a856128d0919061429e565b60306128dc9190614081565b60f81b818381518110612918577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561295491906140d7565b94506128ac565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129db8383612cd7565b6129e86000848484612b40565b612a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1e90613cce565b60405180910390fd5b505050565b612a37838383612ea5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a7a57612a7581612eaa565b612ab9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ab857612ab78382612ef3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612afc57612af781613060565b612b3b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b3a57612b3982826131a3565b5b5b505050565b6000612b618473ffffffffffffffffffffffffffffffffffffffff16613222565b15612cca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b8a6121ed565b8786866040518563ffffffff1660e01b8152600401612bac9493929190613bda565b602060405180830381600087803b158015612bc657600080fd5b505af1925050508015612bf757506040513d601f19601f82011682018060405250810190612bf4919061361f565b60015b612c7a573d8060008114612c27576040519150601f19603f3d011682016040523d82523d6000602084013e612c2c565b606091505b50600081511415612c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6990613cce565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ccf565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3e90613e0e565b60405180910390fd5b612d5081612181565b15612d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8790613d0e565b60405180910390fd5b612d9c60008383612a2c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dec9190614081565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f0084611539565b612f0a9190614108565b9050600060076000848152602001908152602001600020549050818114612fef576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130749190614108565b90506000600960008481526020019081526020016000205490506000600883815481106130ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613112577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613187577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131ae83611539565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613241906141f2565b90600052602060002090601f01602090048101928261326357600085556132aa565b82601f1061327c57805160ff19168380011785556132aa565b828001600101855582156132aa579182015b828111156132a957825182559160200191906001019061328e565b5b5090506132b791906132bb565b5090565b5b808211156132d45760008160009055506001016132bc565b5090565b60006132eb6132e684613f8e565b613f69565b90508281526020810184848401111561330357600080fd5b61330e8482856141b0565b509392505050565b600061332961332484613fbf565b613f69565b90508281526020810184848401111561334157600080fd5b61334c8482856141b0565b509392505050565b600081359050613363816148e7565b92915050565b600081359050613378816148fe565b92915050565b60008135905061338d81614915565b92915050565b6000815190506133a281614915565b92915050565b600082601f8301126133b957600080fd5b81356133c98482602086016132d8565b91505092915050565b600082601f8301126133e357600080fd5b81356133f3848260208601613316565b91505092915050565b60008135905061340b8161492c565b92915050565b6000815190506134208161492c565b92915050565b60006020828403121561343857600080fd5b600061344684828501613354565b91505092915050565b6000806040838503121561346257600080fd5b600061347085828601613354565b925050602061348185828601613354565b9150509250929050565b6000806000606084860312156134a057600080fd5b60006134ae86828701613354565b93505060206134bf86828701613354565b92505060406134d0868287016133fc565b9150509250925092565b600080600080608085870312156134f057600080fd5b60006134fe87828801613354565b945050602061350f87828801613354565b9350506040613520878288016133fc565b925050606085013567ffffffffffffffff81111561353d57600080fd5b613549878288016133a8565b91505092959194509250565b6000806040838503121561356857600080fd5b600061357685828601613354565b925050602061358785828601613369565b9150509250929050565b600080604083850312156135a457600080fd5b60006135b285828601613354565b92505060206135c3858286016133fc565b9150509250929050565b6000602082840312156135df57600080fd5b60006135ed84828501613369565b91505092915050565b60006020828403121561360857600080fd5b60006136168482850161337e565b91505092915050565b60006020828403121561363157600080fd5b600061363f84828501613393565b91505092915050565b60006020828403121561365a57600080fd5b600082013567ffffffffffffffff81111561367457600080fd5b613680848285016133d2565b91505092915050565b60006020828403121561369b57600080fd5b60006136a9848285016133fc565b91505092915050565b6000602082840312156136c457600080fd5b60006136d284828501613411565b91505092915050565b60006136e78383613b70565b60208301905092915050565b6136fc8161413c565b82525050565b600061370d82614015565b6137178185614043565b935061372283613ff0565b8060005b8381101561375357815161373a88826136db565b975061374583614036565b925050600181019050613726565b5085935050505092915050565b6137698161414e565b82525050565b600061377a82614020565b6137848185614054565b93506137948185602086016141bf565b61379d8161438b565b840191505092915050565b60006137b38261402b565b6137bd8185614065565b93506137cd8185602086016141bf565b6137d68161438b565b840191505092915050565b60006137ec8261402b565b6137f68185614076565b93506138068185602086016141bf565b80840191505092915050565b6000815461381f816141f2565b6138298186614076565b94506001821660008114613844576001811461385557613888565b60ff19831686528186019350613888565b61385e85614000565b60005b8381101561388057815481890152600182019150602081019050613861565b838801955050505b50505092915050565b600061389e602b83614065565b91506138a98261439c565b604082019050919050565b60006138c1603283614065565b91506138cc826143eb565b604082019050919050565b60006138e4602683614065565b91506138ef8261443a565b604082019050919050565b6000613907601c83614065565b915061391282614489565b602082019050919050565b600061392a602483614065565b9150613935826144b2565b604082019050919050565b600061394d601983614065565b915061395882614501565b602082019050919050565b6000613970602c83614065565b915061397b8261452a565b604082019050919050565b6000613993603883614065565b915061399e82614579565b604082019050919050565b60006139b6602a83614065565b91506139c1826145c8565b604082019050919050565b60006139d9602983614065565b91506139e482614617565b604082019050919050565b60006139fc601583614065565b9150613a0782614666565b602082019050919050565b6000613a1f602083614065565b9150613a2a8261468f565b602082019050919050565b6000613a42602c83614065565b9150613a4d826146b8565b604082019050919050565b6000613a65602083614065565b9150613a7082614707565b602082019050919050565b6000613a88602983614065565b9150613a9382614730565b604082019050919050565b6000613aab601e83614065565b9150613ab68261477f565b602082019050919050565b6000613ace602183614065565b9150613ad9826147a8565b604082019050919050565b6000613af1601483614065565b9150613afc826147f7565b602082019050919050565b6000613b14601083614065565b9150613b1f82614820565b602082019050919050565b6000613b37603183614065565b9150613b4282614849565b604082019050919050565b6000613b5a602c83614065565b9150613b6582614898565b604082019050919050565b613b79816141a6565b82525050565b613b88816141a6565b82525050565b6000613b9a82866137e1565b9150613ba682856137e1565b9150613bb28284613812565b9150819050949350505050565b6000602082019050613bd460008301846136f3565b92915050565b6000608082019050613bef60008301876136f3565b613bfc60208301866136f3565b613c096040830185613b7f565b8181036060830152613c1b818461376f565b905095945050505050565b6000604082019050613c3b60008301856136f3565b613c486020830184613b7f565b9392505050565b60006020820190508181036000830152613c698184613702565b905092915050565b6000602082019050613c866000830184613760565b92915050565b60006020820190508181036000830152613ca681846137a8565b905092915050565b60006020820190508181036000830152613cc781613891565b9050919050565b60006020820190508181036000830152613ce7816138b4565b9050919050565b60006020820190508181036000830152613d07816138d7565b9050919050565b60006020820190508181036000830152613d27816138fa565b9050919050565b60006020820190508181036000830152613d478161391d565b9050919050565b60006020820190508181036000830152613d6781613940565b9050919050565b60006020820190508181036000830152613d8781613963565b9050919050565b60006020820190508181036000830152613da781613986565b9050919050565b60006020820190508181036000830152613dc7816139a9565b9050919050565b60006020820190508181036000830152613de7816139cc565b9050919050565b60006020820190508181036000830152613e07816139ef565b9050919050565b60006020820190508181036000830152613e2781613a12565b9050919050565b60006020820190508181036000830152613e4781613a35565b9050919050565b60006020820190508181036000830152613e6781613a58565b9050919050565b60006020820190508181036000830152613e8781613a7b565b9050919050565b60006020820190508181036000830152613ea781613a9e565b9050919050565b60006020820190508181036000830152613ec781613ac1565b9050919050565b60006020820190508181036000830152613ee781613ae4565b9050919050565b60006020820190508181036000830152613f0781613b07565b9050919050565b60006020820190508181036000830152613f2781613b2a565b9050919050565b60006020820190508181036000830152613f4781613b4d565b9050919050565b6000602082019050613f636000830184613b7f565b92915050565b6000613f73613f84565b9050613f7f8282614224565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa957613fa861435c565b5b613fb28261438b565b9050602081019050919050565b600067ffffffffffffffff821115613fda57613fd961435c565b5b613fe38261438b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061408c826141a6565b9150614097836141a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140cc576140cb6142cf565b5b828201905092915050565b60006140e2826141a6565b91506140ed836141a6565b9250826140fd576140fc6142fe565b5b828204905092915050565b6000614113826141a6565b915061411e836141a6565b925082821015614131576141306142cf565b5b828203905092915050565b600061414782614186565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141dd5780820151818401526020810190506141c2565b838111156141ec576000848401525b50505050565b6000600282049050600182168061420a57607f821691505b6020821081141561421e5761421d61432d565b5b50919050565b61422d8261438b565b810181811067ffffffffffffffff8211171561424c5761424b61435c565b5b80604052505050565b6000614260826141a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614293576142926142cf565b5b600182019050919050565b60006142a9826141a6565b91506142b4836141a6565b9250826142c4576142c36142fe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742042616c616e63652e0000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f546f74616c20737570706c7920776f756c6420626520726561636865642e0000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20646f65736e27742065786973742e000000000000000000000000600082015250565b7f4e6f7420616c6c6f776564207965742e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6148f08161413c565b81146148fb57600080fd5b50565b6149078161414e565b811461491257600080fd5b50565b61491e8161415a565b811461492957600080fd5b50565b614935816141a6565b811461494057600080fd5b5056fea264697066735822122014255118e6946e9c462bf376831b14b2d46b1e75c01e7af1683fde95332f23b064736f6c63430008040033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636c0360eb1161012e578063b88d4fde116100ab578063da79e4161161006f578063da79e41614610852578063e985e9c51461087b578063ec84b933146108b8578063f2fde38b146108e3578063fbcaabad1461090c5761023b565b8063b88d4fde1461076d578063c668286214610796578063c87b56dd146107c1578063d5abeb01146107fe578063da3ef23f146108295761023b565b806385535cc5116100f257806385535cc51461069a5780638da5cb5b146106c357806395d89b41146106ee578063a22cb46514610719578063a9ea1896146107425761023b565b80636c0360eb146105c557806370a08231146105f0578063715018a61461062d57806372c37a1c146106445780637cea25901461066f5761023b565b80633ccfd60b116101bc5780634f6ccce7116101805780634f6ccce7146104ce57806351c1e51c1461050b57806355f804b3146105365780636352211e1461055f57806369a64e291461059c5761023b565b80633ccfd60b1461040a57806342842e0e14610414578063438b63001461043d57806343f6295f1461047a57806345f988a4146104a35761023b565b806318160ddd1161020357806318160ddd1461032557806323b872dd146103505780632eb78aad146103795780632f745c59146103a257806330e146db146103df5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063120ff4861461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135f6565b610923565b6040516102749190613c71565b60405180910390f35b34801561028957600080fd5b5061029261099d565b60405161029f9190613c8c565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613689565b610a2f565b6040516102dc9190613bbf565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613591565b610ab4565b005b34801561031a57600080fd5b50610323610bcc565b005b34801561033157600080fd5b5061033a610e1a565b6040516103479190613f4e565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061348b565b610e27565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613689565b610e87565b005b3480156103ae57600080fd5b506103c960048036038101906103c49190613591565b610f0d565b6040516103d69190613f4e565b60405180910390f35b3480156103eb57600080fd5b506103f4610fb2565b6040516104019190613f4e565b60405180910390f35b610412610fb8565b005b34801561042057600080fd5b5061043b6004803603810190610436919061348b565b611074565b005b34801561044957600080fd5b50610464600480360381019061045f9190613426565b611094565b6040516104719190613c4f565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c91906135cd565b61118e565b005b3480156104af57600080fd5b506104b8611227565b6040516104c59190613f4e565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613689565b61122d565b6040516105029190613f4e565b60405180910390f35b34801561051757600080fd5b506105206112c4565b60405161052d9190613f4e565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613648565b6112ca565b005b34801561056b57600080fd5b5061058660048036038101906105819190613689565b611360565b6040516105939190613bbf565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be91906135cd565b611412565b005b3480156105d157600080fd5b506105da6114ab565b6040516105e79190613c8c565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190613426565b611539565b6040516106249190613f4e565b60405180910390f35b34801561063957600080fd5b506106426115f1565b005b34801561065057600080fd5b50610659611679565b6040516106669190613c71565b60405180910390f35b34801561067b57600080fd5b5061068461168c565b6040516106919190613c71565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613426565b61169f565b005b3480156106cf57600080fd5b506106d86117a0565b6040516106e59190613bbf565b60405180910390f35b3480156106fa57600080fd5b506107036117ca565b6040516107109190613c8c565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190613555565b61185c565b005b34801561074e57600080fd5b506107576119dd565b6040516107649190613f4e565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f91906134da565b6119e3565b005b3480156107a257600080fd5b506107ab611a45565b6040516107b89190613c8c565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e39190613689565b611ad3565b6040516107f59190613c8c565b60405180910390f35b34801561080a57600080fd5b50610813611b7d565b6040516108209190613f4e565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613648565b611b83565b005b34801561085e57600080fd5b5061087960048036038101906108749190613689565b611c19565b005b34801561088757600080fd5b506108a2600480360381019061089d919061344f565b611c9f565b6040516108af9190613c71565b60405180910390f35b3480156108c457600080fd5b506108cd611d33565b6040516108da9190613bbf565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613426565b611d59565b005b34801561091857600080fd5b50610921611e51565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099657506109958261209f565b5b9050919050565b6060600080546109ac906141f2565b80601f01602080910402602001604051908101604052809291908181526020018280546109d8906141f2565b8015610a255780601f106109fa57610100808354040283529160200191610a25565b820191906000526020600020905b815481529060010190602001808311610a0857829003601f168201915b5050505050905090565b6000610a3a82612181565b610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7090613e2e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abf82611360565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790613eae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4f6121ed565b73ffffffffffffffffffffffffffffffffffffffff161480610b7e5750610b7d81610b786121ed565b611c9f565b5b610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb490613d8e565b60405180910390fd5b610bc783836121f5565b505050565b601260019054906101000a900460ff1615610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613eee565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304cdb171336040518263ffffffff1660e01b8152600401610c799190613bbf565b602060405180830381600087803b158015610c9357600080fd5b505af1158015610ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccb91906136b2565b9050601154811015610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613dee565b60405180910390fd5b6000610d1c610e1a565b9050600e54600182610d2e9190614081565b1115610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690613e8e565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da89ddf5336011546040518363ffffffff1660e01b8152600401610dce929190613c26565b600060405180830381600087803b158015610de857600080fd5b505af1158015610dfc573d6000803e3d6000fd5b50505050610e1633600183610e119190614081565b6122ae565b5050565b6000600880549050905090565b610e38610e326121ed565b826122cc565b610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613f0e565b60405180910390fd5b610e828383836123aa565b505050565b610e8f6121ed565b73ffffffffffffffffffffffffffffffffffffffff16610ead6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613e4e565b60405180910390fd5b8060118190555050565b6000610f1883611539565b8210610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613cae565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610fc06121ed565b73ffffffffffffffffffffffffffffffffffffffff16610fde6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90613e4e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061107257600080fd5b565b61108f838383604051806020016040528060008152506119e3565b505050565b606060006110a183611539565b905060008167ffffffffffffffff8111156110e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111135781602001602082028036833780820191505090505b50905060005b828110156111835761112b8582610f0d565b828281518110611164577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061117b90614255565b915050611119565b508092505050919050565b6111966121ed565b73ffffffffffffffffffffffffffffffffffffffff166111b46117a0565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190613e4e565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60115481565b6000611237610e1a565b8210611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90613f2e565b60405180910390fd5b600882815481106112b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d5481565b6112d26121ed565b73ffffffffffffffffffffffffffffffffffffffff166112f06117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d90613e4e565b60405180910390fd5b80600b908051906020019061135c929190613235565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090613dce565b60405180910390fd5b80915050919050565b61141a6121ed565b73ffffffffffffffffffffffffffffffffffffffff166114386117a0565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590613e4e565b60405180910390fd5b80601260016101000a81548160ff02191690831515021790555050565b600b80546114b8906141f2565b80601f01602080910402602001604051908101604052809291908181526020018280546114e4906141f2565b80156115315780601f1061150657610100808354040283529160200191611531565b820191906000526020600020905b81548152906001019060200180831161151457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190613dae565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115f96121ed565b73ffffffffffffffffffffffffffffffffffffffff166116176117a0565b73ffffffffffffffffffffffffffffffffffffffff161461166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490613e4e565b60405180910390fd5b6116776000612606565b565b601260019054906101000a900460ff1681565b601260009054906101000a900460ff1681565b6116a76121ed565b73ffffffffffffffffffffffffffffffffffffffff166116c56117a0565b73ffffffffffffffffffffffffffffffffffffffff161461171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613e4e565b60405180910390fd5b80601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117d9906141f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611805906141f2565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b6118646121ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990613d4e565b60405180910390fd5b80600560006118df6121ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661198c6121ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119d19190613c71565b60405180910390a35050565b60105481565b6119f46119ee6121ed565b836122cc565b611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90613f0e565b60405180910390fd5b611a3f848484846126cc565b50505050565b600c8054611a52906141f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7e906141f2565b8015611acb5780601f10611aa057610100808354040283529160200191611acb565b820191906000526020600020905b815481529060010190602001808311611aae57829003601f168201915b505050505081565b6060611ade82612181565b611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490613ece565b60405180910390fd5b6000611b27612728565b90506000815111611b475760405180602001604052806000815250611b75565b80611b51846127ba565b600c604051602001611b6593929190613b8e565b6040516020818303038152906040525b915050919050565b600f5481565b611b8b6121ed565b73ffffffffffffffffffffffffffffffffffffffff16611ba96117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613e4e565b60405180910390fd5b80600c9080519060200190611c15929190613235565b5050565b611c216121ed565b73ffffffffffffffffffffffffffffffffffffffff16611c3f6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c90613e4e565b60405180910390fd5b8060108190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d616121ed565b73ffffffffffffffffffffffffffffffffffffffff16611d7f6117a0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90613e4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c90613cee565b60405180910390fd5b611e4e81612606565b50565b601260009054906101000a900460ff1615611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890613eee565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304cdb171336040518263ffffffff1660e01b8152600401611efe9190613bbf565b602060405180830381600087803b158015611f1857600080fd5b505af1158015611f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5091906136b2565b9050601054811015611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90613dee565b60405180910390fd5b6000611fa1610e1a565b9050600d54600182611fb39190614081565b1115611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb90613e8e565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da89ddf5336010546040518363ffffffff1660e01b8152600401612053929190613c26565b600060405180830381600087803b15801561206d57600080fd5b505af1158015612081573d6000803e3d6000fd5b5050505061209b336001836120969190614081565b6122ae565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061216a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061217a575061217982612967565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661226883611360565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6122c88282604051806020016040528060008152506129d1565b5050565b60006122d782612181565b612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90613d6e565b60405180910390fd5b600061232183611360565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061239057508373ffffffffffffffffffffffffffffffffffffffff1661237884610a2f565b73ffffffffffffffffffffffffffffffffffffffff16145b806123a157506123a08185611c9f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123ca82611360565b73ffffffffffffffffffffffffffffffffffffffff1614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790613e6e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790613d2e565b60405180910390fd5b61249b838383612a2c565b6124a66000826121f5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f69190614108565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254d9190614081565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126d78484846123aa565b6126e384848484612b40565b612722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271990613cce565b60405180910390fd5b50505050565b6060600b8054612737906141f2565b80601f0160208091040260200160405190810160405280929190818152602001828054612763906141f2565b80156127b05780601f10612785576101008083540402835291602001916127b0565b820191906000526020600020905b81548152906001019060200180831161279357829003601f168201915b5050505050905090565b60606000821415612802576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612962565b600082905060005b6000821461283457808061281d90614255565b915050600a8261282d91906140d7565b915061280a565b60008167ffffffffffffffff811115612876577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128a85781602001600182028036833780820191505090505b5090505b6000851461295b576001826128c19190614108565b9150600a856128d0919061429e565b60306128dc9190614081565b60f81b818381518110612918577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561295491906140d7565b94506128ac565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129db8383612cd7565b6129e86000848484612b40565b612a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1e90613cce565b60405180910390fd5b505050565b612a37838383612ea5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a7a57612a7581612eaa565b612ab9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ab857612ab78382612ef3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612afc57612af781613060565b612b3b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b3a57612b3982826131a3565b5b5b505050565b6000612b618473ffffffffffffffffffffffffffffffffffffffff16613222565b15612cca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b8a6121ed565b8786866040518563ffffffff1660e01b8152600401612bac9493929190613bda565b602060405180830381600087803b158015612bc657600080fd5b505af1925050508015612bf757506040513d601f19601f82011682018060405250810190612bf4919061361f565b60015b612c7a573d8060008114612c27576040519150601f19603f3d011682016040523d82523d6000602084013e612c2c565b606091505b50600081511415612c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6990613cce565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ccf565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3e90613e0e565b60405180910390fd5b612d5081612181565b15612d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8790613d0e565b60405180910390fd5b612d9c60008383612a2c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dec9190614081565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f0084611539565b612f0a9190614108565b9050600060076000848152602001908152602001600020549050818114612fef576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130749190614108565b90506000600960008481526020019081526020016000205490506000600883815481106130ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613112577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613187577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131ae83611539565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613241906141f2565b90600052602060002090601f01602090048101928261326357600085556132aa565b82601f1061327c57805160ff19168380011785556132aa565b828001600101855582156132aa579182015b828111156132a957825182559160200191906001019061328e565b5b5090506132b791906132bb565b5090565b5b808211156132d45760008160009055506001016132bc565b5090565b60006132eb6132e684613f8e565b613f69565b90508281526020810184848401111561330357600080fd5b61330e8482856141b0565b509392505050565b600061332961332484613fbf565b613f69565b90508281526020810184848401111561334157600080fd5b61334c8482856141b0565b509392505050565b600081359050613363816148e7565b92915050565b600081359050613378816148fe565b92915050565b60008135905061338d81614915565b92915050565b6000815190506133a281614915565b92915050565b600082601f8301126133b957600080fd5b81356133c98482602086016132d8565b91505092915050565b600082601f8301126133e357600080fd5b81356133f3848260208601613316565b91505092915050565b60008135905061340b8161492c565b92915050565b6000815190506134208161492c565b92915050565b60006020828403121561343857600080fd5b600061344684828501613354565b91505092915050565b6000806040838503121561346257600080fd5b600061347085828601613354565b925050602061348185828601613354565b9150509250929050565b6000806000606084860312156134a057600080fd5b60006134ae86828701613354565b93505060206134bf86828701613354565b92505060406134d0868287016133fc565b9150509250925092565b600080600080608085870312156134f057600080fd5b60006134fe87828801613354565b945050602061350f87828801613354565b9350506040613520878288016133fc565b925050606085013567ffffffffffffffff81111561353d57600080fd5b613549878288016133a8565b91505092959194509250565b6000806040838503121561356857600080fd5b600061357685828601613354565b925050602061358785828601613369565b9150509250929050565b600080604083850312156135a457600080fd5b60006135b285828601613354565b92505060206135c3858286016133fc565b9150509250929050565b6000602082840312156135df57600080fd5b60006135ed84828501613369565b91505092915050565b60006020828403121561360857600080fd5b60006136168482850161337e565b91505092915050565b60006020828403121561363157600080fd5b600061363f84828501613393565b91505092915050565b60006020828403121561365a57600080fd5b600082013567ffffffffffffffff81111561367457600080fd5b613680848285016133d2565b91505092915050565b60006020828403121561369b57600080fd5b60006136a9848285016133fc565b91505092915050565b6000602082840312156136c457600080fd5b60006136d284828501613411565b91505092915050565b60006136e78383613b70565b60208301905092915050565b6136fc8161413c565b82525050565b600061370d82614015565b6137178185614043565b935061372283613ff0565b8060005b8381101561375357815161373a88826136db565b975061374583614036565b925050600181019050613726565b5085935050505092915050565b6137698161414e565b82525050565b600061377a82614020565b6137848185614054565b93506137948185602086016141bf565b61379d8161438b565b840191505092915050565b60006137b38261402b565b6137bd8185614065565b93506137cd8185602086016141bf565b6137d68161438b565b840191505092915050565b60006137ec8261402b565b6137f68185614076565b93506138068185602086016141bf565b80840191505092915050565b6000815461381f816141f2565b6138298186614076565b94506001821660008114613844576001811461385557613888565b60ff19831686528186019350613888565b61385e85614000565b60005b8381101561388057815481890152600182019150602081019050613861565b838801955050505b50505092915050565b600061389e602b83614065565b91506138a98261439c565b604082019050919050565b60006138c1603283614065565b91506138cc826143eb565b604082019050919050565b60006138e4602683614065565b91506138ef8261443a565b604082019050919050565b6000613907601c83614065565b915061391282614489565b602082019050919050565b600061392a602483614065565b9150613935826144b2565b604082019050919050565b600061394d601983614065565b915061395882614501565b602082019050919050565b6000613970602c83614065565b915061397b8261452a565b604082019050919050565b6000613993603883614065565b915061399e82614579565b604082019050919050565b60006139b6602a83614065565b91506139c1826145c8565b604082019050919050565b60006139d9602983614065565b91506139e482614617565b604082019050919050565b60006139fc601583614065565b9150613a0782614666565b602082019050919050565b6000613a1f602083614065565b9150613a2a8261468f565b602082019050919050565b6000613a42602c83614065565b9150613a4d826146b8565b604082019050919050565b6000613a65602083614065565b9150613a7082614707565b602082019050919050565b6000613a88602983614065565b9150613a9382614730565b604082019050919050565b6000613aab601e83614065565b9150613ab68261477f565b602082019050919050565b6000613ace602183614065565b9150613ad9826147a8565b604082019050919050565b6000613af1601483614065565b9150613afc826147f7565b602082019050919050565b6000613b14601083614065565b9150613b1f82614820565b602082019050919050565b6000613b37603183614065565b9150613b4282614849565b604082019050919050565b6000613b5a602c83614065565b9150613b6582614898565b604082019050919050565b613b79816141a6565b82525050565b613b88816141a6565b82525050565b6000613b9a82866137e1565b9150613ba682856137e1565b9150613bb28284613812565b9150819050949350505050565b6000602082019050613bd460008301846136f3565b92915050565b6000608082019050613bef60008301876136f3565b613bfc60208301866136f3565b613c096040830185613b7f565b8181036060830152613c1b818461376f565b905095945050505050565b6000604082019050613c3b60008301856136f3565b613c486020830184613b7f565b9392505050565b60006020820190508181036000830152613c698184613702565b905092915050565b6000602082019050613c866000830184613760565b92915050565b60006020820190508181036000830152613ca681846137a8565b905092915050565b60006020820190508181036000830152613cc781613891565b9050919050565b60006020820190508181036000830152613ce7816138b4565b9050919050565b60006020820190508181036000830152613d07816138d7565b9050919050565b60006020820190508181036000830152613d27816138fa565b9050919050565b60006020820190508181036000830152613d478161391d565b9050919050565b60006020820190508181036000830152613d6781613940565b9050919050565b60006020820190508181036000830152613d8781613963565b9050919050565b60006020820190508181036000830152613da781613986565b9050919050565b60006020820190508181036000830152613dc7816139a9565b9050919050565b60006020820190508181036000830152613de7816139cc565b9050919050565b60006020820190508181036000830152613e07816139ef565b9050919050565b60006020820190508181036000830152613e2781613a12565b9050919050565b60006020820190508181036000830152613e4781613a35565b9050919050565b60006020820190508181036000830152613e6781613a58565b9050919050565b60006020820190508181036000830152613e8781613a7b565b9050919050565b60006020820190508181036000830152613ea781613a9e565b9050919050565b60006020820190508181036000830152613ec781613ac1565b9050919050565b60006020820190508181036000830152613ee781613ae4565b9050919050565b60006020820190508181036000830152613f0781613b07565b9050919050565b60006020820190508181036000830152613f2781613b2a565b9050919050565b60006020820190508181036000830152613f4781613b4d565b9050919050565b6000602082019050613f636000830184613b7f565b92915050565b6000613f73613f84565b9050613f7f8282614224565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa957613fa861435c565b5b613fb28261438b565b9050602081019050919050565b600067ffffffffffffffff821115613fda57613fd961435c565b5b613fe38261438b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061408c826141a6565b9150614097836141a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140cc576140cb6142cf565b5b828201905092915050565b60006140e2826141a6565b91506140ed836141a6565b9250826140fd576140fc6142fe565b5b828204905092915050565b6000614113826141a6565b915061411e836141a6565b925082821015614131576141306142cf565b5b828203905092915050565b600061414782614186565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141dd5780820151818401526020810190506141c2565b838111156141ec576000848401525b50505050565b6000600282049050600182168061420a57607f821691505b6020821081141561421e5761421d61432d565b5b50919050565b61422d8261438b565b810181811067ffffffffffffffff8211171561424c5761424b61435c565b5b80604052505050565b6000614260826141a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614293576142926142cf565b5b600182019050919050565b60006142a9826141a6565b91506142b4836141a6565b9250826142c4576142c36142fe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742042616c616e63652e0000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f546f74616c20737570706c7920776f756c6420626520726561636865642e0000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20646f65736e27742065786973742e000000000000000000000000600082015250565b7f4e6f7420616c6c6f776564207965742e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6148f08161413c565b81146148fb57600080fd5b50565b6149078161414e565b811461491257600080fd5b50565b61491e8161415a565b811461492957600080fd5b50565b614935816141a6565b811461494057600080fd5b5056fea264697066735822122014255118e6946e9c462bf376831b14b2d46b1e75c01e7af1683fde95332f23b064736f6c63430008040033

Deployed Bytecode Sourcemap

46789:3525:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40031:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26853:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28584:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28099:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48090:445;;;;;;;;;;;;;:::i;:::-;;40848:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29663:378;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50095:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40421:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46985:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50191:120;;;:::i;:::-;;30118:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48543:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49815:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47096:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41044:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46946:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49544:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26450:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49907:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46879:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26085:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2612:103;;;;;;;;;;;;;:::i;:::-;;47165:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47131;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47482:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1961:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27028:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28970:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47061:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30380:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46907:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48941:576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47024:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49656:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49999:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29376:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47199:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2870:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47637:445;;;;;;;;;;;;;:::i;:::-;;40031:300;40178:4;40235:35;40220:50;;;:11;:50;;;;:103;;;;40287:36;40311:11;40287:23;:36::i;:::-;40220:103;40200:123;;40031:300;;;:::o;26853:100::-;26907:13;26940:5;26933:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26853:100;:::o;28584:308::-;28705:7;28752:16;28760:7;28752;:16::i;:::-;28730:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28860:15;:24;28876:7;28860:24;;;;;;;;;;;;;;;;;;;;;28853:31;;28584:308;;;:::o;28099:413::-;28180:13;28196:23;28211:7;28196:14;:23::i;:::-;28180:39;;28246:5;28240:11;;:2;:11;;;;28232:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28340:5;28324:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28349:37;28366:5;28373:12;:10;:12::i;:::-;28349:16;:37::i;:::-;28324:62;28302:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28483:21;28492:2;28496:7;28483:8;:21::i;:::-;28099:413;;;:::o;48090:445::-;48135:8;;;;;;;;;;;48134:9;48126:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48175:15;48193:13;;;;;;;;;;;:28;;;48222:10;48193:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48175:58;;48263:7;;48252;:18;;48244:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;48307:14;48324:13;:11;:13::i;:::-;48307:30;;48370:11;;48365:1;48356:6;:10;;;;:::i;:::-;:25;;48348:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48427:13;;;;;;;;;;;:35;;;48463:10;48475:7;;48427:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48494:33;48504:10;48525:1;48516:6;:10;;;;:::i;:::-;48494:9;:33::i;:::-;48090:445;;:::o;40848:113::-;40909:7;40936:10;:17;;;;40929:24;;40848:113;:::o;29663:378::-;29874:41;29893:12;:10;:12::i;:::-;29907:7;29874:18;:41::i;:::-;29852:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30005:28;30015:4;30021:2;30025:7;30005:9;:28::i;:::-;29663:378;;;:::o;50095:88::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50169:6:::1;50159:7;:16;;;;50095:88:::0;:::o;40421:345::-;40563:7;40618:23;40635:5;40618:16;:23::i;:::-;40610:5;:31;40588:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;40732:12;:19;40745:5;40732:19;;;;;;;;;;;;;;;:26;40752:5;40732:26;;;;;;;;;;;;40725:33;;40421:345;;;;:::o;46985:32::-;;;;:::o;50191:120::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50263:10:::1;50255:24;;:47;50280:21;50255:47;;;;;;;;;;;;;;;;;;;;;;;50247:56;;;::::0;::::1;;50191:120::o:0;30118:185::-;30256:39;30273:4;30279:2;30283:7;30256:39;;;;;;;;;;;;:16;:39::i;:::-;30118:185;;;:::o;48543:390::-;48630:16;48664:23;48690:17;48700:6;48690:9;:17::i;:::-;48664:43;;48718:25;48760:15;48746:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48718:58;;48792:9;48787:113;48807:15;48803:1;:19;48787:113;;;48858:30;48878:6;48886:1;48858:19;:30::i;:::-;48844:8;48853:1;48844:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;48824:3;;;;;:::i;:::-;;;;48787:113;;;;48917:8;48910:15;;;;48543:390;;;:::o;49815:84::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49885:6:::1;49874:8;;:17;;;;;;;;;;;;;;;;;;49815:84:::0;:::o;47096:28::-;;;;:::o;41044:322::-;41164:7;41219:30;:28;:30::i;:::-;41211:5;:38;41189:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;41341:10;41352:5;41341:17;;;;;;;;;;;;;;;;;;;;;;;;41334:24;;41044:322;;;:::o;46946:32::-;;;;:::o;49544:104::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49629:11:::1;49619:7;:21;;;;;;;;;;;;:::i;:::-;;49544:104:::0;:::o;26450:330::-;26567:7;26592:13;26608:7;:16;26616:7;26608:16;;;;;;;;;;;;;;;;;;;;;26592:32;;26676:1;26659:19;;:5;:19;;;;26637:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26767:5;26760:12;;;26450:330;;;:::o;49907:84::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49977:6:::1;49966:8;;:17;;;;;;;;;;;;;;;;;;49907:84:::0;:::o;46879:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26085:297::-;26202:7;26266:1;26249:19;;:5;:19;;;;26227:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26358:9;:16;26368:5;26358:16;;;;;;;;;;;;;;;;26351:23;;26085:297;;;:::o;2612:103::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2677:30:::1;2704:1;2677:18;:30::i;:::-;2612:103::o:0;47165:27::-;;;;;;;;;;;;;:::o;47131:::-;;;;;;;;;;;;;:::o;47482:147::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47564:8:::1;47553;;:19;;;;;;;;;;;;;;;;;;47612:8;47583:13;;:38;;;;;;;;;;;;;;;;;;47482:147:::0;:::o;1961:87::-;2007:7;2034:6;;;;;;;;;;;2027:13;;1961:87;:::o;27028:104::-;27084:13;27117:7;27110:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27028:104;:::o;28970:329::-;29117:12;:10;:12::i;:::-;29105:24;;:8;:24;;;;29097:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29217:8;29172:18;:32;29191:12;:10;:12::i;:::-;29172:32;;;;;;;;;;;;;;;:42;29205:8;29172:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29272:8;29243:48;;29258:12;:10;:12::i;:::-;29243:48;;;29282:8;29243:48;;;;;;:::i;:::-;;;;;;;;28970:329;;:::o;47061:28::-;;;;:::o;30380:367::-;30569:41;30588:12;:10;:12::i;:::-;30602:7;30569:18;:41::i;:::-;30547:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30700:39;30714:4;30720:2;30724:7;30733:5;30700:13;:39::i;:::-;30380:367;;;;:::o;46907:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48941:576::-;49059:13;49098:16;49106:7;49098;:16::i;:::-;49090:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49150:28;49181:10;:8;:10::i;:::-;49150:41;;49253:1;49228:14;49222:28;:32;:287;;;;;;;;;;;;;;;;;49346:14;49387:18;:7;:16;:18::i;:::-;49432:13;49303:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49222:287;49202:307;;;48941:576;;;:::o;47024:30::-;;;;:::o;49656:151::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49782:17:::1;49766:13;:33;;;;;;;;;;;;:::i;:::-;;49656:151:::0;:::o;49999:88::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50073:6:::1;50063:7;:16;;;;49999:88:::0;:::o;29376:214::-;29518:4;29547:18;:25;29566:5;29547:25;;;;;;;;;;;;;;;:35;29573:8;29547:35;;;;;;;;;;;;;;;;;;;;;;;;;29540:42;;29376:214;;;;:::o;47199:23::-;;;;;;;;;;;;;:::o;2870:238::-;2192:12;:10;:12::i;:::-;2181:23;;:7;:5;:7::i;:::-;:23;;;2173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2993:1:::1;2973:22;;:8;:22;;;;2951:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3072:28;3091:8;3072:18;:28::i;:::-;2870:238:::0;:::o;47637:445::-;47682:8;;;;;;;;;;;47681:9;47673:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;47722:15;47740:13;;;;;;;;;;;:28;;;47769:10;47740:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47722:58;;47810:7;;47799;:18;;47791:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;47854:14;47871:13;:11;:13::i;:::-;47854:30;;47917:11;;47912:1;47903:6;:10;;;;:::i;:::-;:25;;47895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47974:13;;;;;;;;;;;:35;;;48010:10;48022:7;;47974:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48041:33;48051:10;48072:1;48063:6;:10;;;;:::i;:::-;48041:9;:33::i;:::-;47637:445;;:::o;25660:355::-;25807:4;25864:25;25849:40;;;:11;:40;;;;:105;;;;25921:33;25906:48;;;:11;:48;;;;25849:105;:158;;;;25971:36;25995:11;25971:23;:36::i;:::-;25849:158;25829:178;;25660:355;;;:::o;32348:127::-;32413:4;32465:1;32437:30;;:7;:16;32445:7;32437:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32430:37;;32348:127;;;:::o;664:98::-;717:7;744:10;737:17;;664:98;:::o;36611:176::-;36713:2;36686:15;:24;36702:7;36686:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36771:7;36767:2;36733:46;;36742:23;36757:7;36742:14;:23::i;:::-;36733:46;;;;;;;;;;;;36611:176;;:::o;33474:110::-;33550:26;33560:2;33564:7;33550:26;;;;;;;;;;;;:9;:26::i;:::-;33474:110;;:::o;32656:456::-;32785:4;32829:16;32837:7;32829;:16::i;:::-;32807:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32930:13;32946:23;32961:7;32946:14;:23::i;:::-;32930:39;;33001:5;32990:16;;:7;:16;;;:64;;;;33047:7;33023:31;;:20;33035:7;33023:11;:20::i;:::-;:31;;;32990:64;:113;;;;33071:32;33088:5;33095:7;33071:16;:32::i;:::-;32990:113;32982:122;;;32656:456;;;;:::o;35860:623::-;36033:4;36006:31;;:23;36021:7;36006:14;:23::i;:::-;:31;;;35984:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;36141:1;36127:16;;:2;:16;;;;36119:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36197:39;36218:4;36224:2;36228:7;36197:20;:39::i;:::-;36303:29;36320:1;36324:7;36303:8;:29::i;:::-;36364:1;36345:9;:15;36355:4;36345:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36395:1;36378:9;:13;36388:2;36378:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36428:2;36409:7;:16;36417:7;36409:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36467:7;36463:2;36448:27;;36457:4;36448:27;;;;;;;;;;;;35860:623;;;:::o;3268:191::-;3342:16;3361:6;;;;;;;;;;;3342:25;;3387:8;3378:6;;:17;;;;;;;;;;;;;;;;;;3442:8;3411:40;;3432:8;3411:40;;;;;;;;;;;;3268:191;;:::o;31665:354::-;31822:28;31832:4;31838:2;31842:7;31822:9;:28::i;:::-;31885:48;31908:4;31914:2;31918:7;31927:5;31885:22;:48::i;:::-;31863:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31665:354;;;;:::o;47366:108::-;47426:13;47459:7;47452:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47366:108;:::o;11928:743::-;11984:13;12216:1;12207:5;:10;12203:53;;;12234:10;;;;;;;;;;;;;;;;;;;;;12203:53;12268:12;12283:5;12268:20;;12301:14;12328:80;12343:1;12335:4;:9;12328:80;;12361:8;;;;;:::i;:::-;;;;12394:2;12386:10;;;;;:::i;:::-;;;12328:80;;;12420:19;12452:6;12442:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12420:39;;12472:158;12488:1;12479:5;:10;12472:158;;12516:1;12506:11;;;;;:::i;:::-;;;12585:2;12577:5;:10;;;;:::i;:::-;12564:2;:24;;;;:::i;:::-;12551:39;;12534:6;12541;12534:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;12616:2;12607:11;;;;;:::i;:::-;;;12472:158;;;12656:6;12642:21;;;;;11928:743;;;;:::o;11395:207::-;11525:4;11569:25;11554:40;;;:11;:40;;;;11547:47;;11395:207;;;:::o;33819:323::-;33949:18;33955:2;33959:7;33949:5;:18::i;:::-;34002:54;34033:1;34037:2;34041:7;34050:5;34002:22;:54::i;:::-;33980:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33819:323;;;:::o;42009:591::-;42153:45;42180:4;42186:2;42190:7;42153:26;:45::i;:::-;42231:1;42215:18;;:4;:18;;;42211:187;;;42250:40;42282:7;42250:31;:40::i;:::-;42211:187;;;42320:2;42312:10;;:4;:10;;;42308:90;;42339:47;42372:4;42378:7;42339:32;:47::i;:::-;42308:90;42211:187;42428:1;42414:16;;:2;:16;;;42410:183;;;42447:45;42484:7;42447:36;:45::i;:::-;42410:183;;;42520:4;42514:10;;:2;:10;;;42510:83;;42541:40;42569:2;42573:7;42541:27;:40::i;:::-;42510:83;42410:183;42009:591;;;:::o;37372:980::-;37527:4;37548:15;:2;:13;;;:15::i;:::-;37544:801;;;37617:2;37601:36;;;37660:12;:10;:12::i;:::-;37695:4;37722:7;37752:5;37601:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37580:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37976:1;37959:6;:13;:18;37955:320;;;38002:108;;;;;;;;;;:::i;:::-;;;;;;;;37955:320;38225:6;38219:13;38210:6;38206:2;38202:15;38195:38;37580:710;37850:41;;;37840:51;;;:6;:51;;;;37833:58;;;;;37544:801;38329:4;38322:11;;37372:980;;;;;;;:::o;34502:386::-;34596:1;34582:16;;:2;:16;;;;34574:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34657:16;34665:7;34657;:16::i;:::-;34656:17;34648:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34719:45;34748:1;34752:2;34756:7;34719:20;:45::i;:::-;34794:1;34777:9;:13;34787:2;34777:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34827:2;34808:7;:16;34816:7;34808:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34872:7;34868:2;34847:33;;34864:1;34847:33;;;;;;;;;;;;34502:386;;:::o;38952:126::-;;;;:::o;43345:166::-;43449:10;:17;;;;43422:15;:24;43438:7;43422:24;;;;;;;;;;;:44;;;;43479:10;43495:7;43479:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43345:166;:::o;44154:1014::-;44436:22;44486:1;44461:22;44478:4;44461:16;:22::i;:::-;:26;;;;:::i;:::-;44436:51;;44500:18;44521:17;:26;44539:7;44521:26;;;;;;;;;;;;44500:47;;44670:14;44656:10;:28;44652:330;;44701:19;44723:12;:18;44736:4;44723:18;;;;;;;;;;;;;;;:34;44742:14;44723:34;;;;;;;;;;;;44701:56;;44807:11;44774:12;:18;44787:4;44774:18;;;;;;;;;;;;;;;:30;44793:10;44774:30;;;;;;;;;;;:44;;;;44926:10;44893:17;:30;44911:11;44893:30;;;;;;;;;;;:43;;;;44652:330;;45080:17;:26;45098:7;45080:26;;;;;;;;;;;45073:33;;;45126:12;:18;45139:4;45126:18;;;;;;;;;;;;;;;:34;45145:14;45126:34;;;;;;;;;;;45119:41;;;44154:1014;;;;:::o;45473:1095::-;45728:22;45773:1;45753:10;:17;;;;:21;;;;:::i;:::-;45728:46;;45787:18;45808:15;:24;45824:7;45808:24;;;;;;;;;;;;45787:45;;46165:19;46187:10;46198:14;46187:26;;;;;;;;;;;;;;;;;;;;;;;;46165:48;;46251:11;46226:10;46237;46226:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46364:10;46333:15;:28;46349:11;46333:28;;;;;;;;;;;:41;;;;46507:15;:24;46523:7;46507:24;;;;;;;;;;;46500:31;;;46544:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45473:1095;;;;:::o;42911:225::-;42996:14;43013:20;43030:2;43013:16;:20::i;:::-;42996:37;;43073:7;43046:12;:16;43059:2;43046:16;;;;;;;;;;;;;;;:24;43063:6;43046:24;;;;;;;;;;;:34;;;;43122:6;43093:17;:26;43111:7;43093:26;;;;;;;;;;;:35;;;;42911:225;;;:::o;14575:395::-;14635:4;14847:12;14916:7;14904:20;14896:28;;14961:1;14954:4;:8;14947:15;;;14575:395;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:143::-;2066:5;2097:6;2091:13;2082:22;;2113:33;2140:5;2113:33;:::i;:::-;2072:80;;;;:::o;2158:262::-;2217:6;2266:2;2254:9;2245:7;2241:23;2237:32;2234:2;;;2282:1;2279;2272:12;2234:2;2325:1;2350:53;2395:7;2386:6;2375:9;2371:22;2350:53;:::i;:::-;2340:63;;2296:117;2224:196;;;;:::o;2426:407::-;2494:6;2502;2551:2;2539:9;2530:7;2526:23;2522:32;2519:2;;;2567:1;2564;2557:12;2519:2;2610:1;2635:53;2680:7;2671:6;2660:9;2656:22;2635:53;:::i;:::-;2625:63;;2581:117;2737:2;2763:53;2808:7;2799:6;2788:9;2784:22;2763:53;:::i;:::-;2753:63;;2708:118;2509:324;;;;;:::o;2839:552::-;2916:6;2924;2932;2981:2;2969:9;2960:7;2956:23;2952:32;2949:2;;;2997:1;2994;2987:12;2949:2;3040:1;3065:53;3110:7;3101:6;3090:9;3086:22;3065:53;:::i;:::-;3055:63;;3011:117;3167:2;3193:53;3238:7;3229:6;3218:9;3214:22;3193:53;:::i;:::-;3183:63;;3138:118;3295:2;3321:53;3366:7;3357:6;3346:9;3342:22;3321:53;:::i;:::-;3311:63;;3266:118;2939:452;;;;;:::o;3397:809::-;3492:6;3500;3508;3516;3565:3;3553:9;3544:7;3540:23;3536:33;3533:2;;;3582:1;3579;3572:12;3533:2;3625:1;3650:53;3695:7;3686:6;3675:9;3671:22;3650:53;:::i;:::-;3640:63;;3596:117;3752:2;3778:53;3823:7;3814:6;3803:9;3799:22;3778:53;:::i;:::-;3768:63;;3723:118;3880:2;3906:53;3951:7;3942:6;3931:9;3927:22;3906:53;:::i;:::-;3896:63;;3851:118;4036:2;4025:9;4021:18;4008:32;4067:18;4059:6;4056:30;4053:2;;;4099:1;4096;4089:12;4053:2;4127:62;4181:7;4172:6;4161:9;4157:22;4127:62;:::i;:::-;4117:72;;3979:220;3523:683;;;;;;;:::o;4212:401::-;4277:6;4285;4334:2;4322:9;4313:7;4309:23;4305:32;4302:2;;;4350:1;4347;4340:12;4302:2;4393:1;4418:53;4463:7;4454:6;4443:9;4439:22;4418:53;:::i;:::-;4408:63;;4364:117;4520:2;4546:50;4588:7;4579:6;4568:9;4564:22;4546:50;:::i;:::-;4536:60;;4491:115;4292:321;;;;;:::o;4619:407::-;4687:6;4695;4744:2;4732:9;4723:7;4719:23;4715:32;4712:2;;;4760:1;4757;4750:12;4712:2;4803:1;4828:53;4873:7;4864:6;4853:9;4849:22;4828:53;:::i;:::-;4818:63;;4774:117;4930:2;4956:53;5001:7;4992:6;4981:9;4977:22;4956:53;:::i;:::-;4946:63;;4901:118;4702:324;;;;;:::o;5032:256::-;5088:6;5137:2;5125:9;5116:7;5112:23;5108:32;5105:2;;;5153:1;5150;5143:12;5105:2;5196:1;5221:50;5263:7;5254:6;5243:9;5239:22;5221:50;:::i;:::-;5211:60;;5167:114;5095:193;;;;:::o;5294:260::-;5352:6;5401:2;5389:9;5380:7;5376:23;5372:32;5369:2;;;5417:1;5414;5407:12;5369:2;5460:1;5485:52;5529:7;5520:6;5509:9;5505:22;5485:52;:::i;:::-;5475:62;;5431:116;5359:195;;;;:::o;5560:282::-;5629:6;5678:2;5666:9;5657:7;5653:23;5649:32;5646:2;;;5694:1;5691;5684:12;5646:2;5737:1;5762:63;5817:7;5808:6;5797:9;5793:22;5762:63;:::i;:::-;5752:73;;5708:127;5636:206;;;;:::o;5848:375::-;5917:6;5966:2;5954:9;5945:7;5941:23;5937:32;5934:2;;;5982:1;5979;5972:12;5934:2;6053:1;6042:9;6038:17;6025:31;6083:18;6075:6;6072:30;6069:2;;;6115:1;6112;6105:12;6069:2;6143:63;6198:7;6189:6;6178:9;6174:22;6143:63;:::i;:::-;6133:73;;5996:220;5924:299;;;;:::o;6229:262::-;6288:6;6337:2;6325:9;6316:7;6312:23;6308:32;6305:2;;;6353:1;6350;6343:12;6305:2;6396:1;6421:53;6466:7;6457:6;6446:9;6442:22;6421:53;:::i;:::-;6411:63;;6367:117;6295:196;;;;:::o;6497:284::-;6567:6;6616:2;6604:9;6595:7;6591:23;6587:32;6584:2;;;6632:1;6629;6622:12;6584:2;6675:1;6700:64;6756:7;6747:6;6736:9;6732:22;6700:64;:::i;:::-;6690:74;;6646:128;6574:207;;;;:::o;6787:179::-;6856:10;6877:46;6919:3;6911:6;6877:46;:::i;:::-;6955:4;6950:3;6946:14;6932:28;;6867:99;;;;:::o;6972:118::-;7059:24;7077:5;7059:24;:::i;:::-;7054:3;7047:37;7037:53;;:::o;7126:732::-;7245:3;7274:54;7322:5;7274:54;:::i;:::-;7344:86;7423:6;7418:3;7344:86;:::i;:::-;7337:93;;7454:56;7504:5;7454:56;:::i;:::-;7533:7;7564:1;7549:284;7574:6;7571:1;7568:13;7549:284;;;7650:6;7644:13;7677:63;7736:3;7721:13;7677:63;:::i;:::-;7670:70;;7763:60;7816:6;7763:60;:::i;:::-;7753:70;;7609:224;7596:1;7593;7589:9;7584:14;;7549:284;;;7553:14;7849:3;7842:10;;7250:608;;;;;;;:::o;7864:109::-;7945:21;7960:5;7945:21;:::i;:::-;7940:3;7933:34;7923:50;;:::o;7979:360::-;8065:3;8093:38;8125:5;8093:38;:::i;:::-;8147:70;8210:6;8205:3;8147:70;:::i;:::-;8140:77;;8226:52;8271:6;8266:3;8259:4;8252:5;8248:16;8226:52;:::i;:::-;8303:29;8325:6;8303:29;:::i;:::-;8298:3;8294:39;8287:46;;8069:270;;;;;:::o;8345:364::-;8433:3;8461:39;8494:5;8461:39;:::i;:::-;8516:71;8580:6;8575:3;8516:71;:::i;:::-;8509:78;;8596:52;8641:6;8636:3;8629:4;8622:5;8618:16;8596:52;:::i;:::-;8673:29;8695:6;8673:29;:::i;:::-;8668:3;8664:39;8657:46;;8437:272;;;;;:::o;8715:377::-;8821:3;8849:39;8882:5;8849:39;:::i;:::-;8904:89;8986:6;8981:3;8904:89;:::i;:::-;8897:96;;9002:52;9047:6;9042:3;9035:4;9028:5;9024:16;9002:52;:::i;:::-;9079:6;9074:3;9070:16;9063:23;;8825:267;;;;;:::o;9122:845::-;9225:3;9262:5;9256:12;9291:36;9317:9;9291:36;:::i;:::-;9343:89;9425:6;9420:3;9343:89;:::i;:::-;9336:96;;9463:1;9452:9;9448:17;9479:1;9474:137;;;;9625:1;9620:341;;;;9441:520;;9474:137;9558:4;9554:9;9543;9539:25;9534:3;9527:38;9594:6;9589:3;9585:16;9578:23;;9474:137;;9620:341;9687:38;9719:5;9687:38;:::i;:::-;9747:1;9761:154;9775:6;9772:1;9769:13;9761:154;;;9849:7;9843:14;9839:1;9834:3;9830:11;9823:35;9899:1;9890:7;9886:15;9875:26;;9797:4;9794:1;9790:12;9785:17;;9761:154;;;9944:6;9939:3;9935:16;9928:23;;9627:334;;9441:520;;9229:738;;;;;;:::o;9973:366::-;10115:3;10136:67;10200:2;10195:3;10136:67;:::i;:::-;10129:74;;10212:93;10301:3;10212:93;:::i;:::-;10330:2;10325:3;10321:12;10314:19;;10119:220;;;:::o;10345:366::-;10487:3;10508:67;10572:2;10567:3;10508:67;:::i;:::-;10501:74;;10584:93;10673:3;10584:93;:::i;:::-;10702:2;10697:3;10693:12;10686:19;;10491:220;;;:::o;10717:366::-;10859:3;10880:67;10944:2;10939:3;10880:67;:::i;:::-;10873:74;;10956:93;11045:3;10956:93;:::i;:::-;11074:2;11069:3;11065:12;11058:19;;10863:220;;;:::o;11089:366::-;11231:3;11252:67;11316:2;11311:3;11252:67;:::i;:::-;11245:74;;11328:93;11417:3;11328:93;:::i;:::-;11446:2;11441:3;11437:12;11430:19;;11235:220;;;:::o;11461:366::-;11603:3;11624:67;11688:2;11683:3;11624:67;:::i;:::-;11617:74;;11700:93;11789:3;11700:93;:::i;:::-;11818:2;11813:3;11809:12;11802:19;;11607:220;;;:::o;11833:366::-;11975:3;11996:67;12060:2;12055:3;11996:67;:::i;:::-;11989:74;;12072:93;12161:3;12072:93;:::i;:::-;12190:2;12185:3;12181:12;12174:19;;11979:220;;;:::o;12205:366::-;12347:3;12368:67;12432:2;12427:3;12368:67;:::i;:::-;12361:74;;12444:93;12533:3;12444:93;:::i;:::-;12562:2;12557:3;12553:12;12546:19;;12351:220;;;:::o;12577:366::-;12719:3;12740:67;12804:2;12799:3;12740:67;:::i;:::-;12733:74;;12816:93;12905:3;12816:93;:::i;:::-;12934:2;12929:3;12925:12;12918:19;;12723:220;;;:::o;12949:366::-;13091:3;13112:67;13176:2;13171:3;13112:67;:::i;:::-;13105:74;;13188:93;13277:3;13188:93;:::i;:::-;13306:2;13301:3;13297:12;13290:19;;13095:220;;;:::o;13321:366::-;13463:3;13484:67;13548:2;13543:3;13484:67;:::i;:::-;13477:74;;13560:93;13649:3;13560:93;:::i;:::-;13678:2;13673:3;13669:12;13662:19;;13467:220;;;:::o;13693:366::-;13835:3;13856:67;13920:2;13915:3;13856:67;:::i;:::-;13849:74;;13932:93;14021:3;13932:93;:::i;:::-;14050:2;14045:3;14041:12;14034:19;;13839:220;;;:::o;14065:366::-;14207:3;14228:67;14292:2;14287:3;14228:67;:::i;:::-;14221:74;;14304:93;14393:3;14304:93;:::i;:::-;14422:2;14417:3;14413:12;14406:19;;14211:220;;;:::o;14437:366::-;14579:3;14600:67;14664:2;14659:3;14600:67;:::i;:::-;14593:74;;14676:93;14765:3;14676:93;:::i;:::-;14794:2;14789:3;14785:12;14778:19;;14583:220;;;:::o;14809:366::-;14951:3;14972:67;15036:2;15031:3;14972:67;:::i;:::-;14965:74;;15048:93;15137:3;15048:93;:::i;:::-;15166:2;15161:3;15157:12;15150:19;;14955:220;;;:::o;15181:366::-;15323:3;15344:67;15408:2;15403:3;15344:67;:::i;:::-;15337:74;;15420:93;15509:3;15420:93;:::i;:::-;15538:2;15533:3;15529:12;15522:19;;15327:220;;;:::o;15553:366::-;15695:3;15716:67;15780:2;15775:3;15716:67;:::i;:::-;15709:74;;15792:93;15881:3;15792:93;:::i;:::-;15910:2;15905:3;15901:12;15894:19;;15699:220;;;:::o;15925:366::-;16067:3;16088:67;16152:2;16147:3;16088:67;:::i;:::-;16081:74;;16164:93;16253:3;16164:93;:::i;:::-;16282:2;16277:3;16273:12;16266:19;;16071:220;;;:::o;16297:366::-;16439:3;16460:67;16524:2;16519:3;16460:67;:::i;:::-;16453:74;;16536:93;16625:3;16536:93;:::i;:::-;16654:2;16649:3;16645:12;16638:19;;16443:220;;;:::o;16669:366::-;16811:3;16832:67;16896:2;16891:3;16832:67;:::i;:::-;16825:74;;16908:93;16997:3;16908:93;:::i;:::-;17026:2;17021:3;17017:12;17010:19;;16815:220;;;:::o;17041:366::-;17183:3;17204:67;17268:2;17263:3;17204:67;:::i;:::-;17197:74;;17280:93;17369:3;17280:93;:::i;:::-;17398:2;17393:3;17389:12;17382:19;;17187:220;;;:::o;17413:366::-;17555:3;17576:67;17640:2;17635:3;17576:67;:::i;:::-;17569:74;;17652:93;17741:3;17652:93;:::i;:::-;17770:2;17765:3;17761:12;17754:19;;17559:220;;;:::o;17785:108::-;17862:24;17880:5;17862:24;:::i;:::-;17857:3;17850:37;17840:53;;:::o;17899:118::-;17986:24;18004:5;17986:24;:::i;:::-;17981:3;17974:37;17964:53;;:::o;18023:589::-;18248:3;18270:95;18361:3;18352:6;18270:95;:::i;:::-;18263:102;;18382:95;18473:3;18464:6;18382:95;:::i;:::-;18375:102;;18494:92;18582:3;18573:6;18494:92;:::i;:::-;18487:99;;18603:3;18596:10;;18252:360;;;;;;:::o;18618:222::-;18711:4;18749:2;18738:9;18734:18;18726:26;;18762:71;18830:1;18819:9;18815:17;18806:6;18762:71;:::i;:::-;18716:124;;;;:::o;18846:640::-;19041:4;19079:3;19068:9;19064:19;19056:27;;19093:71;19161:1;19150:9;19146:17;19137:6;19093:71;:::i;:::-;19174:72;19242:2;19231:9;19227:18;19218:6;19174:72;:::i;:::-;19256;19324:2;19313:9;19309:18;19300:6;19256:72;:::i;:::-;19375:9;19369:4;19365:20;19360:2;19349:9;19345:18;19338:48;19403:76;19474:4;19465:6;19403:76;:::i;:::-;19395:84;;19046:440;;;;;;;:::o;19492:332::-;19613:4;19651:2;19640:9;19636:18;19628:26;;19664:71;19732:1;19721:9;19717:17;19708:6;19664:71;:::i;:::-;19745:72;19813:2;19802:9;19798:18;19789:6;19745:72;:::i;:::-;19618:206;;;;;:::o;19830:373::-;19973:4;20011:2;20000:9;19996:18;19988:26;;20060:9;20054:4;20050:20;20046:1;20035:9;20031:17;20024:47;20088:108;20191:4;20182:6;20088:108;:::i;:::-;20080:116;;19978:225;;;;:::o;20209:210::-;20296:4;20334:2;20323:9;20319:18;20311:26;;20347:65;20409:1;20398:9;20394:17;20385:6;20347:65;:::i;:::-;20301:118;;;;:::o;20425:313::-;20538:4;20576:2;20565:9;20561:18;20553:26;;20625:9;20619:4;20615:20;20611:1;20600:9;20596:17;20589:47;20653:78;20726:4;20717:6;20653:78;:::i;:::-;20645:86;;20543:195;;;;:::o;20744:419::-;20910:4;20948:2;20937:9;20933:18;20925:26;;20997:9;20991:4;20987:20;20983:1;20972:9;20968:17;20961:47;21025:131;21151:4;21025:131;:::i;:::-;21017:139;;20915:248;;;:::o;21169:419::-;21335:4;21373:2;21362:9;21358:18;21350:26;;21422:9;21416:4;21412:20;21408:1;21397:9;21393:17;21386:47;21450:131;21576:4;21450:131;:::i;:::-;21442:139;;21340:248;;;:::o;21594:419::-;21760:4;21798:2;21787:9;21783:18;21775:26;;21847:9;21841:4;21837:20;21833:1;21822:9;21818:17;21811:47;21875:131;22001:4;21875:131;:::i;:::-;21867:139;;21765:248;;;:::o;22019:419::-;22185:4;22223:2;22212:9;22208:18;22200:26;;22272:9;22266:4;22262:20;22258:1;22247:9;22243:17;22236:47;22300:131;22426:4;22300:131;:::i;:::-;22292:139;;22190:248;;;:::o;22444:419::-;22610:4;22648:2;22637:9;22633:18;22625:26;;22697:9;22691:4;22687:20;22683:1;22672:9;22668:17;22661:47;22725:131;22851:4;22725:131;:::i;:::-;22717:139;;22615:248;;;:::o;22869:419::-;23035:4;23073:2;23062:9;23058:18;23050:26;;23122:9;23116:4;23112:20;23108:1;23097:9;23093:17;23086:47;23150:131;23276:4;23150:131;:::i;:::-;23142:139;;23040:248;;;:::o;23294:419::-;23460:4;23498:2;23487:9;23483:18;23475:26;;23547:9;23541:4;23537:20;23533:1;23522:9;23518:17;23511:47;23575:131;23701:4;23575:131;:::i;:::-;23567:139;;23465:248;;;:::o;23719:419::-;23885:4;23923:2;23912:9;23908:18;23900:26;;23972:9;23966:4;23962:20;23958:1;23947:9;23943:17;23936:47;24000:131;24126:4;24000:131;:::i;:::-;23992:139;;23890:248;;;:::o;24144:419::-;24310:4;24348:2;24337:9;24333:18;24325:26;;24397:9;24391:4;24387:20;24383:1;24372:9;24368:17;24361:47;24425:131;24551:4;24425:131;:::i;:::-;24417:139;;24315:248;;;:::o;24569:419::-;24735:4;24773:2;24762:9;24758:18;24750:26;;24822:9;24816:4;24812:20;24808:1;24797:9;24793:17;24786:47;24850:131;24976:4;24850:131;:::i;:::-;24842:139;;24740:248;;;:::o;24994:419::-;25160:4;25198:2;25187:9;25183:18;25175:26;;25247:9;25241:4;25237:20;25233:1;25222:9;25218:17;25211:47;25275:131;25401:4;25275:131;:::i;:::-;25267:139;;25165:248;;;:::o;25419:419::-;25585:4;25623:2;25612:9;25608:18;25600:26;;25672:9;25666:4;25662:20;25658:1;25647:9;25643:17;25636:47;25700:131;25826:4;25700:131;:::i;:::-;25692:139;;25590:248;;;:::o;25844:419::-;26010:4;26048:2;26037:9;26033:18;26025:26;;26097:9;26091:4;26087:20;26083:1;26072:9;26068:17;26061:47;26125:131;26251:4;26125:131;:::i;:::-;26117:139;;26015:248;;;:::o;26269:419::-;26435:4;26473:2;26462:9;26458:18;26450:26;;26522:9;26516:4;26512:20;26508:1;26497:9;26493:17;26486:47;26550:131;26676:4;26550:131;:::i;:::-;26542:139;;26440:248;;;:::o;26694:419::-;26860:4;26898:2;26887:9;26883:18;26875:26;;26947:9;26941:4;26937:20;26933:1;26922:9;26918:17;26911:47;26975:131;27101:4;26975:131;:::i;:::-;26967:139;;26865:248;;;:::o;27119:419::-;27285:4;27323:2;27312:9;27308:18;27300:26;;27372:9;27366:4;27362:20;27358:1;27347:9;27343:17;27336:47;27400:131;27526:4;27400:131;:::i;:::-;27392:139;;27290:248;;;:::o;27544:419::-;27710:4;27748:2;27737:9;27733:18;27725:26;;27797:9;27791:4;27787:20;27783:1;27772:9;27768:17;27761:47;27825:131;27951:4;27825:131;:::i;:::-;27817:139;;27715:248;;;:::o;27969:419::-;28135:4;28173:2;28162:9;28158:18;28150:26;;28222:9;28216:4;28212:20;28208:1;28197:9;28193:17;28186:47;28250:131;28376:4;28250:131;:::i;:::-;28242:139;;28140:248;;;:::o;28394:419::-;28560:4;28598:2;28587:9;28583:18;28575:26;;28647:9;28641:4;28637:20;28633:1;28622:9;28618:17;28611:47;28675:131;28801:4;28675:131;:::i;:::-;28667:139;;28565:248;;;:::o;28819:419::-;28985:4;29023:2;29012:9;29008:18;29000:26;;29072:9;29066:4;29062:20;29058:1;29047:9;29043:17;29036:47;29100:131;29226:4;29100:131;:::i;:::-;29092:139;;28990:248;;;:::o;29244:419::-;29410:4;29448:2;29437:9;29433:18;29425:26;;29497:9;29491:4;29487:20;29483:1;29472:9;29468:17;29461:47;29525:131;29651:4;29525:131;:::i;:::-;29517:139;;29415:248;;;:::o;29669:222::-;29762:4;29800:2;29789:9;29785:18;29777:26;;29813:71;29881:1;29870:9;29866:17;29857:6;29813:71;:::i;:::-;29767:124;;;;:::o;29897:129::-;29931:6;29958:20;;:::i;:::-;29948:30;;29987:33;30015:4;30007:6;29987:33;:::i;:::-;29938:88;;;:::o;30032:75::-;30065:6;30098:2;30092:9;30082:19;;30072:35;:::o;30113:307::-;30174:4;30264:18;30256:6;30253:30;30250:2;;;30286:18;;:::i;:::-;30250:2;30324:29;30346:6;30324:29;:::i;:::-;30316:37;;30408:4;30402;30398:15;30390:23;;30179:241;;;:::o;30426:308::-;30488:4;30578:18;30570:6;30567:30;30564:2;;;30600:18;;:::i;:::-;30564:2;30638:29;30660:6;30638:29;:::i;:::-;30630:37;;30722:4;30716;30712:15;30704:23;;30493:241;;;:::o;30740:132::-;30807:4;30830:3;30822:11;;30860:4;30855:3;30851:14;30843:22;;30812:60;;;:::o;30878:141::-;30927:4;30950:3;30942:11;;30973:3;30970:1;30963:14;31007:4;31004:1;30994:18;30986:26;;30932:87;;;:::o;31025:114::-;31092:6;31126:5;31120:12;31110:22;;31099:40;;;:::o;31145:98::-;31196:6;31230:5;31224:12;31214:22;;31203:40;;;:::o;31249:99::-;31301:6;31335:5;31329:12;31319:22;;31308:40;;;:::o;31354:113::-;31424:4;31456;31451:3;31447:14;31439:22;;31429:38;;;:::o;31473:184::-;31572:11;31606:6;31601:3;31594:19;31646:4;31641:3;31637:14;31622:29;;31584:73;;;;:::o;31663:168::-;31746:11;31780:6;31775:3;31768:19;31820:4;31815:3;31811:14;31796:29;;31758:73;;;;:::o;31837:169::-;31921:11;31955:6;31950:3;31943:19;31995:4;31990:3;31986:14;31971:29;;31933:73;;;;:::o;32012:148::-;32114:11;32151:3;32136:18;;32126:34;;;;:::o;32166:305::-;32206:3;32225:20;32243:1;32225:20;:::i;:::-;32220:25;;32259:20;32277:1;32259:20;:::i;:::-;32254:25;;32413:1;32345:66;32341:74;32338:1;32335:81;32332:2;;;32419:18;;:::i;:::-;32332:2;32463:1;32460;32456:9;32449:16;;32210:261;;;;:::o;32477:185::-;32517:1;32534:20;32552:1;32534:20;:::i;:::-;32529:25;;32568:20;32586:1;32568:20;:::i;:::-;32563:25;;32607:1;32597:2;;32612:18;;:::i;:::-;32597:2;32654:1;32651;32647:9;32642:14;;32519:143;;;;:::o;32668:191::-;32708:4;32728:20;32746:1;32728:20;:::i;:::-;32723:25;;32762:20;32780:1;32762:20;:::i;:::-;32757:25;;32801:1;32798;32795:8;32792:2;;;32806:18;;:::i;:::-;32792:2;32851:1;32848;32844:9;32836:17;;32713:146;;;;:::o;32865:96::-;32902:7;32931:24;32949:5;32931:24;:::i;:::-;32920:35;;32910:51;;;:::o;32967:90::-;33001:7;33044:5;33037:13;33030:21;33019:32;;33009:48;;;:::o;33063:149::-;33099:7;33139:66;33132:5;33128:78;33117:89;;33107:105;;;:::o;33218:126::-;33255:7;33295:42;33288:5;33284:54;33273:65;;33263:81;;;:::o;33350:77::-;33387:7;33416:5;33405:16;;33395:32;;;:::o;33433:154::-;33517:6;33512:3;33507;33494:30;33579:1;33570:6;33565:3;33561:16;33554:27;33484:103;;;:::o;33593:307::-;33661:1;33671:113;33685:6;33682:1;33679:13;33671:113;;;33770:1;33765:3;33761:11;33755:18;33751:1;33746:3;33742:11;33735:39;33707:2;33704:1;33700:10;33695:15;;33671:113;;;33802:6;33799:1;33796:13;33793:2;;;33882:1;33873:6;33868:3;33864:16;33857:27;33793:2;33642:258;;;;:::o;33906:320::-;33950:6;33987:1;33981:4;33977:12;33967:22;;34034:1;34028:4;34024:12;34055:18;34045:2;;34111:4;34103:6;34099:17;34089:27;;34045:2;34173;34165:6;34162:14;34142:18;34139:38;34136:2;;;34192:18;;:::i;:::-;34136:2;33957:269;;;;:::o;34232:281::-;34315:27;34337:4;34315:27;:::i;:::-;34307:6;34303:40;34445:6;34433:10;34430:22;34409:18;34397:10;34394:34;34391:62;34388:2;;;34456:18;;:::i;:::-;34388:2;34496:10;34492:2;34485:22;34275:238;;;:::o;34519:233::-;34558:3;34581:24;34599:5;34581:24;:::i;:::-;34572:33;;34627:66;34620:5;34617:77;34614:2;;;34697:18;;:::i;:::-;34614:2;34744:1;34737:5;34733:13;34726:20;;34562:190;;;:::o;34758:176::-;34790:1;34807:20;34825:1;34807:20;:::i;:::-;34802:25;;34841:20;34859:1;34841:20;:::i;:::-;34836:25;;34880:1;34870:2;;34885:18;;:::i;:::-;34870:2;34926:1;34923;34919:9;34914:14;;34792:142;;;;:::o;34940:180::-;34988:77;34985:1;34978:88;35085:4;35082:1;35075:15;35109:4;35106:1;35099:15;35126:180;35174:77;35171:1;35164:88;35271:4;35268:1;35261:15;35295:4;35292:1;35285:15;35312:180;35360:77;35357:1;35350:88;35457:4;35454:1;35447:15;35481:4;35478:1;35471:15;35498:180;35546:77;35543:1;35536:88;35643:4;35640:1;35633:15;35667:4;35664:1;35657:15;35684:102;35725:6;35776:2;35772:7;35767:2;35760:5;35756:14;35752:28;35742:38;;35732:54;;;:::o;35792:230::-;35932:34;35928:1;35920:6;35916:14;35909:58;36001:13;35996:2;35988:6;35984:15;35977:38;35898:124;:::o;36028:237::-;36168:34;36164:1;36156:6;36152:14;36145:58;36237:20;36232:2;36224:6;36220:15;36213:45;36134:131;:::o;36271:225::-;36411:34;36407:1;36399:6;36395:14;36388:58;36480:8;36475:2;36467:6;36463:15;36456:33;36377:119;:::o;36502:178::-;36642:30;36638:1;36630:6;36626:14;36619:54;36608:72;:::o;36686:223::-;36826:34;36822:1;36814:6;36810:14;36803:58;36895:6;36890:2;36882:6;36878:15;36871:31;36792:117;:::o;36915:175::-;37055:27;37051:1;37043:6;37039:14;37032:51;37021:69;:::o;37096:231::-;37236:34;37232:1;37224:6;37220:14;37213:58;37305:14;37300:2;37292:6;37288:15;37281:39;37202:125;:::o;37333:243::-;37473:34;37469:1;37461:6;37457:14;37450:58;37542:26;37537:2;37529:6;37525:15;37518:51;37439:137;:::o;37582:229::-;37722:34;37718:1;37710:6;37706:14;37699:58;37791:12;37786:2;37778:6;37774:15;37767:37;37688:123;:::o;37817:228::-;37957:34;37953:1;37945:6;37941:14;37934:58;38026:11;38021:2;38013:6;38009:15;38002:36;37923:122;:::o;38051:171::-;38191:23;38187:1;38179:6;38175:14;38168:47;38157:65;:::o;38228:182::-;38368:34;38364:1;38356:6;38352:14;38345:58;38334:76;:::o;38416:231::-;38556:34;38552:1;38544:6;38540:14;38533:58;38625:14;38620:2;38612:6;38608:15;38601:39;38522:125;:::o;38653:182::-;38793:34;38789:1;38781:6;38777:14;38770:58;38759:76;:::o;38841:228::-;38981:34;38977:1;38969:6;38965:14;38958:58;39050:11;39045:2;39037:6;39033:15;39026:36;38947:122;:::o;39075:180::-;39215:32;39211:1;39203:6;39199:14;39192:56;39181:74;:::o;39261:220::-;39401:34;39397:1;39389:6;39385:14;39378:58;39470:3;39465:2;39457:6;39453:15;39446:28;39367:114;:::o;39487:170::-;39627:22;39623:1;39615:6;39611:14;39604:46;39593:64;:::o;39663:166::-;39803:18;39799:1;39791:6;39787:14;39780:42;39769:60;:::o;39835:236::-;39975:34;39971:1;39963:6;39959:14;39952:58;40044:19;40039:2;40031:6;40027:15;40020:44;39941:130;:::o;40077:231::-;40217:34;40213:1;40205:6;40201:14;40194:58;40286:14;40281:2;40273:6;40269:15;40262:39;40183:125;:::o;40314:122::-;40387:24;40405:5;40387:24;:::i;:::-;40380:5;40377:35;40367:2;;40426:1;40423;40416:12;40367:2;40357:79;:::o;40442:116::-;40512:21;40527:5;40512:21;:::i;:::-;40505:5;40502:32;40492:2;;40548:1;40545;40538:12;40492:2;40482:76;:::o;40564:120::-;40636:23;40653:5;40636:23;:::i;:::-;40629:5;40626:34;40616:2;;40674:1;40671;40664:12;40616:2;40606:78;:::o;40690:122::-;40763:24;40781:5;40763:24;:::i;:::-;40756:5;40753:35;40743:2;;40802:1;40799;40792:12;40743:2;40733:79;:::o

Swarm Source

ipfs://14255118e6946e9c462bf376831b14b2d46b1e75c01e7af1683fde95332f23b0
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.