ETH Price: $3,318.93 (-3.35%)
Gas: 21 Gwei

Token

Stuff up Butts (BUTTS)
 

Overview

Max Total Supply

10,000 BUTTS

Holders

1,226

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Lives of Asuna: Deployer
Balance
1 BUTTS
0x985783404e5ce343e3fa6d67c6dcabe1f684133d
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:
ButtStuff

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-29
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/** import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; **/

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

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


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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/** import "@openzeppelin/contracts/utils/math/SafeMath.sol"; **/

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

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

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

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

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

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

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

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

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

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

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

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

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

/** import "@openzeppelin/contracts/utils/Counters.sol"; **/

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

/** import "@openzeppelin/contracts/access/Ownable.sol"; **/

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}

/** import "@openzeppelin/contracts/utils/Strings.sol"; **/

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

/************************
 * The Butt Stuff Contract stuff
 **********/

contract ButtStuff is ERC721, Ownable {
  using SafeMath for uint256;
  using Strings for uint256;
  using Counters for Counters.Counter;
  Counters.Counter private _tokenIds;

  /**
   * @dev Butt Stuff NFTs 🍑 (mostly taken from Gray Boys ✨👽✨)
   * */

  uint256 public constant MAX_BUTT_STUFF = 10000;
  uint256 public constant MIN_FREE_BUTT_STUFF = 2222;
  uint256 public constant MAX_BUTT_STUFF_PER_FREE = 5;
  uint256 public constant MAX_BUTT_STUFF_PER_PURCHASE = 10;
    
  /* by contract price can never be higher than this (0.005 ETH but in WEI) */
  uint256 public constant MAX_BUTT_STUFF_PRICE = 5000000000000000;
  uint256 public BUTT_STUFF_PRICE;
  uint256 public MAX_BUTT_STUFF_PER_MINT;
  uint256 public FREE_BUTT_STUFF_MAX_ID;
  
  /* initially the base URI will be centralized, for gas optimizations */
  /* after full mint, the IPFS hash will be replaced and locked */
  string public tokenBaseURI;
  string public constant INITIAL_BASE_URI = "https://api.buttstuff.art/nft/";

  bool public mintActive = false;
  bool public freeMinting = true;
  bool public tokenBaseLocked = false;

  Counters.Counter public tokenSupply;

  /**
   * @dev Contract Methods
   */

  constructor() ERC721("Stuff up Butts", "BUTTS") {
    tokenBaseURI = INITIAL_BASE_URI;
    BUTT_STUFF_PRICE = MAX_BUTT_STUFF_PRICE;
    MAX_BUTT_STUFF_PER_MINT = MAX_BUTT_STUFF_PER_FREE;
    FREE_BUTT_STUFF_MAX_ID = MIN_FREE_BUTT_STUFF;
  }

  /************
   * Metadata *
   ************/

  /*
   * the initial base URL will be centralized for optimized gas ...
   * while also keeping the metadata safe from being sniped ...
   * second method locks that value forever when ready ...
   */

  function setTokenBaseURI(string memory _baseURI) 
    external onlyOwner {
    require(!tokenBaseLocked, "Token Base URI is locked now & forever.");
    tokenBaseURI = _baseURI;
  }

  function lockTokenBaseURI(bool _lockIn) 
    external onlyOwner {
    require(!tokenBaseLocked, "Token Base URI is locked now & forever.");
    if (_lockIn) {
      tokenBaseLocked = true;
    }
  }

  function tokenURI(uint256 _tokenId) override public view returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: that token doesn't exist");
    return string(abi.encodePacked(tokenBaseURI, _tokenId.toString()));
  }

  /********
   * Minting *
   ********/

  function mint(uint256 _quantity) external payable {
    require(mintActive, "Minting is not active.");
    require(_quantity <= MAX_BUTT_STUFF_PER_MINT, "Quantity is more than allowed per transaction.");
    _safeMintButtStuff(_quantity);
  }

  function _safeMintButtStuff(uint256 _quantity) internal {
    require(_quantity > 0, "You must mint at least 1 Stuff up Butts");
    require(tokenSupply.current().add(_quantity) <= MAX_BUTT_STUFF, "This Tx would exceed max supply of Stuff up Butts NFTs");
    if (freeMinting) {
      require(tokenSupply.current().add(_quantity) <= FREE_BUTT_STUFF_MAX_ID, "This Tx would exceed max supply of FREE Stuff up Butts NFTs");
    }
    if (!freeMinting) {
      require(msg.value >= BUTT_STUFF_PRICE.mul(_quantity), "The ether value sent is not correct");
    }

    for (uint256 i = 0; i < _quantity; i++) {
      uint256 mintIndex = tokenSupply.current() + 1;
      if (mintIndex <= MAX_BUTT_STUFF) {
        tokenSupply.increment();
        /* once the FREE limit is hit the max per tx increases */
        if (tokenSupply.current() == FREE_BUTT_STUFF_MAX_ID) {
          freeMinting = false;
          MAX_BUTT_STUFF_PER_MINT = MAX_BUTT_STUFF_PER_PURCHASE;
        }
        /* once it hits the max, turn off minting */
        if (mintIndex == MAX_BUTT_STUFF) {
          mintActive = false;
        }
        _safeMint(msg.sender, mintIndex);
      }
    }
  }

  function setMintActive(bool _active)
    external onlyOwner 
  {
    mintActive = _active;
  }

  /* these mostly help with the web3 experience */

  function isMintActive() 
    public view 
    returns (bool) 
  {
    return mintActive;
  }

  function maxPerMint() 
    public view 
    returns (uint256) 
  {
    return MAX_BUTT_STUFF_PER_MINT;
  }

  function totalSupply() 
    public view 
    returns (uint256) 
  {
    return tokenSupply.current();
  }

  function maxFreeTokenId() 
    public view 
    returns (uint256) 
  {
    return FREE_BUTT_STUFF_MAX_ID;
  }

  /**********
  * Pricing *
  * enables change in pricing, but only ever downward ...
  * who knows maybe all the Butt Stuff will be free $$$ ...
  ***************/

  function increaseFreeSupply(uint256 _newMaxTokenId) 
    external onlyOwner
  {
    require(_newMaxTokenId <= MAX_BUTT_STUFF, "Can't give away more than exist, duh");
    require(_newMaxTokenId > FREE_BUTT_STUFF_MAX_ID, "Can't lower the number of free ones, duh");
    require(_newMaxTokenId > tokenSupply.current(), "New one must be higher than current token");
    FREE_BUTT_STUFF_MAX_ID = _newMaxTokenId;
    if (!freeMinting) {
      freeMinting = true;
      MAX_BUTT_STUFF_PER_MINT = MAX_BUTT_STUFF_PER_FREE;
    }
  }

  function lowerMintPrice(uint256 _newPriceWei) 
    external onlyOwner 
  {
    require(tokenSupply.current() < MAX_BUTT_STUFF, "Minting is done, can't update price anymore");
    require(_newPriceWei < BUTT_STUFF_PRICE, "Price can only be lowered, duh");
    BUTT_STUFF_PRICE = _newPriceWei;
  }

  function getMintPrice() 
    public view 
    returns (uint256)
  {
    return BUTT_STUFF_PRICE;
  }

  /**************
   * Withdrawal *
   * these funds will go towards more projects ...
   * who know, holding these might be utility for future STUFF & THINGS ...
   * butt otherwise, just for cheeky fun ✨🍑✨ ...
   **************/

  function withdraw() public onlyOwner {
    uint256 balance = address(this).balance;
    require(balance > 0, "Nothing to withdraw");
    payable(msg.sender).transfer(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":[],"name":"BUTT_STUFF_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_BUTT_STUFF_MAX_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUTT_STUFF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUTT_STUFF_PER_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUTT_STUFF_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUTT_STUFF_PER_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUTT_STUFF_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_FREE_BUTT_STUFF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxTokenId","type":"uint256"}],"name":"increaseFreeSupply","outputs":[],"stateMutability":"nonpayable","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":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_lockIn","type":"bool"}],"name":"lockTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPriceWei","type":"uint256"}],"name":"lowerMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxFreeTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"bool","name":"_active","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setTokenBaseURI","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":[],"name":"tokenBaseLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040518060400160405280600e81526020017f53747566662075702042757474730000000000000000000000000000000000008152506040518060400160405280600581526020017f42555454530000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e792919062000264565b5080600190805190602001906200010092919062000264565b50505062000123620001176200019660201b60201c565b6200019e60201b60201c565b6040518060400160405280601e81526020017f68747470733a2f2f6170692e6275747473747566662e6172742f6e66742f0000815250600b90805190602001906200017092919062000264565b506611c37937e0800060088190555060056009819055506108ae600a8190555062000379565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002729062000314565b90600052602060002090601f016020900481019282620002965760008555620002e2565b82601f10620002b157805160ff1916838001178555620002e2565b82800160010185558215620002e2579182015b82811115620002e1578251825591602001919060010190620002c4565b5b509050620002f19190620002f5565b5090565b5b8082111562000310576000816000905550600101620002f6565b5090565b600060028204905060018216806200032d57607f821691505b602082108114156200034457620003436200034a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61455980620003896000396000f3fe6080604052600436106102515760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063cdb6eaa91161007a578063cdb6eaa914610875578063e985e9c5146108a0578063ee1cc944146108dd578063f2fde38b14610906578063f549d7571461092f578063f6e752fd1461095a57610251565b8063b88d4fde1461078e578063c5286c23146107b7578063c87b56dd146107e2578063caf28d081461081f578063cd6ebb4f1461084a57610251565b8063a0712d68116100fd578063a0712d68146106c8578063a22cb465146106e4578063a58356701461070d578063a7f93ebd14610738578063aad647581461076357610251565b80638da5cb5b146105f35780638ef79e911461061e57806395933ed61461064757806395d89b41146106725780639f8affb01461069d57610251565b80633ccfd60b116101d25780635fcc76aa116101965780635fcc76aa146104e15780636352211e1461050c578063708d79ae1461054957806370a0823114610574578063715018a6146105b15780637824407f146105c857610251565b80633ccfd60b1461042057806342842e0e146104375780634e99b80014610460578063507e094f1461048b5780635b92ac0d146104b657610251565b806318160ddd1161021957806318160ddd1461034d57806323b872dd1461037857806325fd90f3146103a15780632742a979146103cc5780633b7f13db146103f557610251565b806301ffc9a71461025657806306fdde03146102935780630811e2c0146102be578063081812fc146102e7578063095ea7b314610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612dae565b610983565b60405161028a919061344f565b60405180910390f35b34801561029f57600080fd5b506102a8610a65565b6040516102b5919061346a565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612e51565b610af7565b005b3480156102f357600080fd5b5061030e60048036038101906103099190612e51565b610c89565b60405161031b91906133e8565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190612d41565b610d0e565b005b34801561035957600080fd5b50610362610e26565b60405161036f919061382c565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c2b565b610e37565b005b3480156103ad57600080fd5b506103b6610e97565b6040516103c3919061344f565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee9190612d81565b610eaa565b005b34801561040157600080fd5b5061040a610f9b565b604051610417919061346a565b60405180910390f35b34801561042c57600080fd5b50610435610fd4565b005b34801561044357600080fd5b5061045e60048036038101906104599190612c2b565b6110e2565b005b34801561046c57600080fd5b50610475611102565b604051610482919061346a565b60405180910390f35b34801561049757600080fd5b506104a0611190565b6040516104ad919061382c565b60405180910390f35b3480156104c257600080fd5b506104cb61119a565b6040516104d8919061344f565b60405180910390f35b3480156104ed57600080fd5b506104f66111b1565b604051610503919061382c565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612e51565b6111b7565b60405161054091906133e8565b60405180910390f35b34801561055557600080fd5b5061055e611269565b60405161056b919061382c565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190612bbe565b61126e565b6040516105a8919061382c565b60405180910390f35b3480156105bd57600080fd5b506105c6611326565b005b3480156105d457600080fd5b506105dd6113ae565b6040516105ea919061382c565b60405180910390f35b3480156105ff57600080fd5b506106086113ba565b60405161061591906133e8565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190612e08565b6113e4565b005b34801561065357600080fd5b5061065c6114ca565b604051610669919061344f565b60405180910390f35b34801561067e57600080fd5b506106876114dd565b604051610694919061346a565b60405180910390f35b3480156106a957600080fd5b506106b261156f565b6040516106bf919061382c565b60405180910390f35b6106e260048036038101906106dd9190612e51565b611575565b005b3480156106f057600080fd5b5061070b60048036038101906107069190612d01565b611615565b005b34801561071957600080fd5b5061072261162b565b60405161072f919061344f565b60405180910390f35b34801561074457600080fd5b5061074d61163e565b60405161075a919061382c565b60405180910390f35b34801561076f57600080fd5b50610778611648565b604051610785919061382c565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612c7e565b61164d565b005b3480156107c357600080fd5b506107cc6116af565b6040516107d9919061382c565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190612e51565b6116ba565b604051610816919061346a565b60405180910390f35b34801561082b57600080fd5b50610834611736565b604051610841919061382c565b60405180910390f35b34801561085657600080fd5b5061085f61173c565b60405161086c919061382c565b60405180910390f35b34801561088157600080fd5b5061088a611742565b604051610897919061382c565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190612beb565b61174c565b6040516108d4919061344f565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff9190612d81565b6117e0565b005b34801561091257600080fd5b5061092d60048036038101906109289190612bbe565b611879565b005b34801561093b57600080fd5b50610944611971565b604051610951919061382c565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c9190612e51565b611977565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5e5750610a5d82611a8e565b5b9050919050565b606060008054610a7490613af1565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090613af1565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b610aff611af8565b73ffffffffffffffffffffffffffffffffffffffff16610b1d6113ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906136ec565b60405180910390fd5b612710811115610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906134ac565b60405180910390fd5b600a548111610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf3906137ec565b60405180910390fd5b610c06600d611b00565b8111610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906136cc565b60405180910390fd5b80600a81905550600c60019054906101000a900460ff16610c86576001600c60016101000a81548160ff02191690831515021790555060056009819055505b50565b6000610c9482611b0e565b610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca906136ac565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d19826111b7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d819061374c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da9611af8565b73ffffffffffffffffffffffffffffffffffffffff161480610dd85750610dd781610dd2611af8565b61174c565b5b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061360c565b60405180910390fd5b610e218383611b7a565b505050565b6000610e32600d611b00565b905090565b610e48610e42611af8565b82611c33565b610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e906137cc565b60405180910390fd5b610e92838383611d11565b505050565b600c60009054906101000a900460ff1681565b610eb2611af8565b73ffffffffffffffffffffffffffffffffffffffff16610ed06113ba565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d906136ec565b60405180910390fd5b600c60029054906101000a900460ff1615610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d906137ac565b60405180910390fd5b8015610f98576001600c60026101000a81548160ff0219169083151502179055505b50565b6040518060400160405280601e81526020017f68747470733a2f2f6170692e6275747473747566662e6172742f6e66742f000081525081565b610fdc611af8565b73ffffffffffffffffffffffffffffffffffffffff16610ffa6113ba565b73ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906136ec565b60405180910390fd5b600047905060008111611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f906134cc565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110de573d6000803e3d6000fd5b5050565b6110fd8383836040518060200160405280600081525061164d565b505050565b600b805461110f90613af1565b80601f016020809104026020016040519081016040528092919081815260200182805461113b90613af1565b80156111885780601f1061115d57610100808354040283529160200191611188565b820191906000526020600020905b81548152906001019060200180831161116b57829003601f168201915b505050505081565b6000600954905090565b6000600c60009054906101000a900460ff16905090565b60095481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112579061364c565b60405180910390fd5b80915050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061362c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61132e611af8565b73ffffffffffffffffffffffffffffffffffffffff1661134c6113ba565b73ffffffffffffffffffffffffffffffffffffffff16146113a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611399906136ec565b60405180910390fd5b6113ac6000611f6d565b565b600d8060000154905081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113ec611af8565b73ffffffffffffffffffffffffffffffffffffffff1661140a6113ba565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611457906136ec565b60405180910390fd5b600c60029054906101000a900460ff16156114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a7906137ac565b60405180910390fd5b80600b90805190602001906114c69291906129d2565b5050565b600c60029054906101000a900460ff1681565b6060600180546114ec90613af1565b80601f016020809104026020016040519081016040528092919081815260200182805461151890613af1565b80156115655780601f1061153a57610100808354040283529160200191611565565b820191906000526020600020905b81548152906001019060200180831161154857829003601f168201915b5050505050905090565b600a5481565b600c60009054906101000a900460ff166115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb9061378c565b60405180910390fd5b600954811115611609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116009061376c565b60405180910390fd5b61161281612033565b50565b611627611620611af8565b8383612270565b5050565b600c60019054906101000a900460ff1681565b6000600854905090565b600581565b61165e611658611af8565b83611c33565b61169d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611694906137cc565b60405180910390fd5b6116a9848484846123dd565b50505050565b6611c37937e0800081565b60606116c582611b0e565b611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb906135cc565b60405180910390fd5b600b61170f83612439565b6040516020016117209291906133c4565b6040516020818303038152906040529050919050565b60085481565b61271081565b6000600a54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117e8611af8565b73ffffffffffffffffffffffffffffffffffffffff166118066113ba565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611853906136ec565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b611881611af8565b73ffffffffffffffffffffffffffffffffffffffff1661189f6113ba565b73ffffffffffffffffffffffffffffffffffffffff16146118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec906136ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c9061350c565b60405180910390fd5b61196e81611f6d565b50565b6108ae81565b61197f611af8565b73ffffffffffffffffffffffffffffffffffffffff1661199d6113ba565b73ffffffffffffffffffffffffffffffffffffffff16146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea906136ec565b60405180910390fd5b612710611a00600d611b00565b10611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a379061368c565b60405180910390fd5b6008548110611a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7b906135ec565b60405180910390fd5b8060088190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bed836111b7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3e82611b0e565b611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c74906135ac565b60405180910390fd5b6000611c88836111b7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cf757508373ffffffffffffffffffffffffffffffffffffffff16611cdf84610c89565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d085750611d07818561174c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d31826111b7565b73ffffffffffffffffffffffffffffffffffffffff1614611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e9061370c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee9061356c565b60405180910390fd5b611e0283838361259a565b611e0d600082611b7a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5d9190613a07565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb49190613926565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008111612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d9061372c565b60405180910390fd5b61271061209582612087600d611b00565b61259f90919063ffffffff16565b11156120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd9061348c565b60405180910390fd5b600c60019054906101000a900460ff161561214c57600a5461210a826120fc600d611b00565b61259f90919063ffffffff16565b111561214b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121429061354c565b60405180910390fd5b5b600c60019054906101000a900460ff166121b857612175816008546125b590919063ffffffff16565b3410156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061380c565b60405180910390fd5b5b60005b8181101561226c57600060016121d1600d611b00565b6121db9190613926565b90506127108111612258576121f0600d6125cb565b600a546121fd600d611b00565b1415612227576000600c60016101000a81548160ff021916908315150217905550600a6009819055505b61271081141561224d576000600c60006101000a81548160ff0219169083151502179055505b61225733826125e1565b5b50808061226490613b54565b9150506121bb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d69061358c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123d0919061344f565b60405180910390a3505050565b6123e8848484611d11565b6123f4848484846125ff565b612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a906134ec565b60405180910390fd5b50505050565b60606000821415612481576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612595565b600082905060005b600082146124b357808061249c90613b54565b915050600a826124ac919061397c565b9150612489565b60008167ffffffffffffffff8111156124cf576124ce613c8a565b5b6040519080825280601f01601f1916602001820160405280156125015781602001600182028036833780820191505090505b5090505b6000851461258e5760018261251a9190613a07565b9150600a856125299190613b9d565b60306125359190613926565b60f81b81838151811061254b5761254a613c5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612587919061397c565b9450612505565b8093505050505b919050565b505050565b600081836125ad9190613926565b905092915050565b600081836125c391906139ad565b905092915050565b6001816000016000828254019250508190555050565b6125fb828260405180602001604052806000815250612796565b5050565b60006126208473ffffffffffffffffffffffffffffffffffffffff166127f1565b15612789578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612649611af8565b8786866040518563ffffffff1660e01b815260040161266b9493929190613403565b602060405180830381600087803b15801561268557600080fd5b505af19250505080156126b657506040513d601f19601f820116820180604052508101906126b39190612ddb565b60015b612739573d80600081146126e6576040519150601f19603f3d011682016040523d82523d6000602084013e6126eb565b606091505b50600081511415612731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612728906134ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061278e565b600190505b949350505050565b6127a08383612804565b6127ad60008484846125ff565b6127ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e3906134ec565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b9061366c565b60405180910390fd5b61287d81611b0e565b156128bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b49061352c565b60405180910390fd5b6128c96000838361259a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129199190613926565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129de90613af1565b90600052602060002090601f016020900481019282612a005760008555612a47565b82601f10612a1957805160ff1916838001178555612a47565b82800160010185558215612a47579182015b82811115612a46578251825591602001919060010190612a2b565b5b509050612a549190612a58565b5090565b5b80821115612a71576000816000905550600101612a59565b5090565b6000612a88612a838461386c565b613847565b905082815260208101848484011115612aa457612aa3613cbe565b5b612aaf848285613aaf565b509392505050565b6000612aca612ac58461389d565b613847565b905082815260208101848484011115612ae657612ae5613cbe565b5b612af1848285613aaf565b509392505050565b600081359050612b08816144c7565b92915050565b600081359050612b1d816144de565b92915050565b600081359050612b32816144f5565b92915050565b600081519050612b47816144f5565b92915050565b600082601f830112612b6257612b61613cb9565b5b8135612b72848260208601612a75565b91505092915050565b600082601f830112612b9057612b8f613cb9565b5b8135612ba0848260208601612ab7565b91505092915050565b600081359050612bb88161450c565b92915050565b600060208284031215612bd457612bd3613cc8565b5b6000612be284828501612af9565b91505092915050565b60008060408385031215612c0257612c01613cc8565b5b6000612c1085828601612af9565b9250506020612c2185828601612af9565b9150509250929050565b600080600060608486031215612c4457612c43613cc8565b5b6000612c5286828701612af9565b9350506020612c6386828701612af9565b9250506040612c7486828701612ba9565b9150509250925092565b60008060008060808587031215612c9857612c97613cc8565b5b6000612ca687828801612af9565b9450506020612cb787828801612af9565b9350506040612cc887828801612ba9565b925050606085013567ffffffffffffffff811115612ce957612ce8613cc3565b5b612cf587828801612b4d565b91505092959194509250565b60008060408385031215612d1857612d17613cc8565b5b6000612d2685828601612af9565b9250506020612d3785828601612b0e565b9150509250929050565b60008060408385031215612d5857612d57613cc8565b5b6000612d6685828601612af9565b9250506020612d7785828601612ba9565b9150509250929050565b600060208284031215612d9757612d96613cc8565b5b6000612da584828501612b0e565b91505092915050565b600060208284031215612dc457612dc3613cc8565b5b6000612dd284828501612b23565b91505092915050565b600060208284031215612df157612df0613cc8565b5b6000612dff84828501612b38565b91505092915050565b600060208284031215612e1e57612e1d613cc8565b5b600082013567ffffffffffffffff811115612e3c57612e3b613cc3565b5b612e4884828501612b7b565b91505092915050565b600060208284031215612e6757612e66613cc8565b5b6000612e7584828501612ba9565b91505092915050565b612e8781613a3b565b82525050565b612e9681613a4d565b82525050565b6000612ea7826138e3565b612eb181856138f9565b9350612ec1818560208601613abe565b612eca81613ccd565b840191505092915050565b6000612ee0826138ee565b612eea818561390a565b9350612efa818560208601613abe565b612f0381613ccd565b840191505092915050565b6000612f19826138ee565b612f23818561391b565b9350612f33818560208601613abe565b80840191505092915050565b60008154612f4c81613af1565b612f56818661391b565b94506001821660008114612f715760018114612f8257612fb5565b60ff19831686528186019350612fb5565b612f8b856138ce565b60005b83811015612fad57815481890152600182019150602081019050612f8e565b838801955050505b50505092915050565b6000612fcb60368361390a565b9150612fd682613cde565b604082019050919050565b6000612fee60248361390a565b9150612ff982613d2d565b604082019050919050565b600061301160138361390a565b915061301c82613d7c565b602082019050919050565b600061303460328361390a565b915061303f82613da5565b604082019050919050565b600061305760268361390a565b915061306282613df4565b604082019050919050565b600061307a601c8361390a565b915061308582613e43565b602082019050919050565b600061309d603b8361390a565b91506130a882613e6c565b604082019050919050565b60006130c060248361390a565b91506130cb82613ebb565b604082019050919050565b60006130e360198361390a565b91506130ee82613f0a565b602082019050919050565b6000613106602c8361390a565b915061311182613f33565b604082019050919050565b600061312960288361390a565b915061313482613f82565b604082019050919050565b600061314c601e8361390a565b915061315782613fd1565b602082019050919050565b600061316f60388361390a565b915061317a82613ffa565b604082019050919050565b6000613192602a8361390a565b915061319d82614049565b604082019050919050565b60006131b560298361390a565b91506131c082614098565b604082019050919050565b60006131d860208361390a565b91506131e3826140e7565b602082019050919050565b60006131fb602b8361390a565b915061320682614110565b604082019050919050565b600061321e602c8361390a565b91506132298261415f565b604082019050919050565b600061324160298361390a565b915061324c826141ae565b604082019050919050565b600061326460208361390a565b915061326f826141fd565b602082019050919050565b600061328760298361390a565b915061329282614226565b604082019050919050565b60006132aa60278361390a565b91506132b582614275565b604082019050919050565b60006132cd60218361390a565b91506132d8826142c4565b604082019050919050565b60006132f0602e8361390a565b91506132fb82614313565b604082019050919050565b600061331360168361390a565b915061331e82614362565b602082019050919050565b600061333660278361390a565b91506133418261438b565b604082019050919050565b600061335960318361390a565b9150613364826143da565b604082019050919050565b600061337c60288361390a565b915061338782614429565b604082019050919050565b600061339f60238361390a565b91506133aa82614478565b604082019050919050565b6133be81613aa5565b82525050565b60006133d08285612f3f565b91506133dc8284612f0e565b91508190509392505050565b60006020820190506133fd6000830184612e7e565b92915050565b60006080820190506134186000830187612e7e565b6134256020830186612e7e565b61343260408301856133b5565b81810360608301526134448184612e9c565b905095945050505050565b60006020820190506134646000830184612e8d565b92915050565b600060208201905081810360008301526134848184612ed5565b905092915050565b600060208201905081810360008301526134a581612fbe565b9050919050565b600060208201905081810360008301526134c581612fe1565b9050919050565b600060208201905081810360008301526134e581613004565b9050919050565b6000602082019050818103600083015261350581613027565b9050919050565b600060208201905081810360008301526135258161304a565b9050919050565b600060208201905081810360008301526135458161306d565b9050919050565b6000602082019050818103600083015261356581613090565b9050919050565b60006020820190508181036000830152613585816130b3565b9050919050565b600060208201905081810360008301526135a5816130d6565b9050919050565b600060208201905081810360008301526135c5816130f9565b9050919050565b600060208201905081810360008301526135e58161311c565b9050919050565b600060208201905081810360008301526136058161313f565b9050919050565b6000602082019050818103600083015261362581613162565b9050919050565b6000602082019050818103600083015261364581613185565b9050919050565b60006020820190508181036000830152613665816131a8565b9050919050565b60006020820190508181036000830152613685816131cb565b9050919050565b600060208201905081810360008301526136a5816131ee565b9050919050565b600060208201905081810360008301526136c581613211565b9050919050565b600060208201905081810360008301526136e581613234565b9050919050565b6000602082019050818103600083015261370581613257565b9050919050565b600060208201905081810360008301526137258161327a565b9050919050565b600060208201905081810360008301526137458161329d565b9050919050565b60006020820190508181036000830152613765816132c0565b9050919050565b60006020820190508181036000830152613785816132e3565b9050919050565b600060208201905081810360008301526137a581613306565b9050919050565b600060208201905081810360008301526137c581613329565b9050919050565b600060208201905081810360008301526137e58161334c565b9050919050565b600060208201905081810360008301526138058161336f565b9050919050565b6000602082019050818103600083015261382581613392565b9050919050565b600060208201905061384160008301846133b5565b92915050565b6000613851613862565b905061385d8282613b23565b919050565b6000604051905090565b600067ffffffffffffffff82111561388757613886613c8a565b5b61389082613ccd565b9050602081019050919050565b600067ffffffffffffffff8211156138b8576138b7613c8a565b5b6138c182613ccd565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061393182613aa5565b915061393c83613aa5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561397157613970613bce565b5b828201905092915050565b600061398782613aa5565b915061399283613aa5565b9250826139a2576139a1613bfd565b5b828204905092915050565b60006139b882613aa5565b91506139c383613aa5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139fc576139fb613bce565b5b828202905092915050565b6000613a1282613aa5565b9150613a1d83613aa5565b925082821015613a3057613a2f613bce565b5b828203905092915050565b6000613a4682613a85565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613adc578082015181840152602081019050613ac1565b83811115613aeb576000848401525b50505050565b60006002820490506001821680613b0957607f821691505b60208210811415613b1d57613b1c613c2c565b5b50919050565b613b2c82613ccd565b810181811067ffffffffffffffff82111715613b4b57613b4a613c8a565b5b80604052505050565b6000613b5f82613aa5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b9257613b91613bce565b5b600182019050919050565b6000613ba882613aa5565b9150613bb383613aa5565b925082613bc357613bc2613bfd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5468697320547820776f756c6420657863656564206d617820737570706c792060008201527f6f66205374756666207570204275747473204e46547300000000000000000000602082015250565b7f43616e277420676976652061776179206d6f7265207468616e2065786973742c60008201527f2064756800000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5468697320547820776f756c6420657863656564206d617820737570706c792060008201527f6f662046524545205374756666207570204275747473204e4654730000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a207468617420746f6b656e20646f65736e60008201527f2774206578697374000000000000000000000000000000000000000000000000602082015250565b7f50726963652063616e206f6e6c79206265206c6f77657265642c206475680000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e74696e6720697320646f6e652c2063616e27742075706461746520707260008201527f69636520616e796d6f7265000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6577206f6e65206d75737420626520686967686572207468616e206375727260008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f596f75206d757374206d696e74206174206c656173742031205374756666207560008201527f7020427574747300000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e74697479206973206d6f7265207468616e20616c6c6f77656420706560008201527f72207472616e73616374696f6e2e000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f74206163746976652e00000000000000000000600082015250565b7f546f6b656e204261736520555249206973206c6f636b6564206e6f772026206660008201527f6f72657665722e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43616e2774206c6f77657220746865206e756d626572206f662066726565206f60008201527f6e65732c20647568000000000000000000000000000000000000000000000000602082015250565b7f5468652065746865722076616c75652073656e74206973206e6f7420636f727260008201527f6563740000000000000000000000000000000000000000000000000000000000602082015250565b6144d081613a3b565b81146144db57600080fd5b50565b6144e781613a4d565b81146144f257600080fd5b50565b6144fe81613a59565b811461450957600080fd5b50565b61451581613aa5565b811461452057600080fd5b5056fea2646970667358221220c0378d6c223c24aa85810e006f73833e914975c088bedd0f0ccdc003929fcf8b64736f6c63430008060033

Deployed Bytecode

0x6080604052600436106102515760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063cdb6eaa91161007a578063cdb6eaa914610875578063e985e9c5146108a0578063ee1cc944146108dd578063f2fde38b14610906578063f549d7571461092f578063f6e752fd1461095a57610251565b8063b88d4fde1461078e578063c5286c23146107b7578063c87b56dd146107e2578063caf28d081461081f578063cd6ebb4f1461084a57610251565b8063a0712d68116100fd578063a0712d68146106c8578063a22cb465146106e4578063a58356701461070d578063a7f93ebd14610738578063aad647581461076357610251565b80638da5cb5b146105f35780638ef79e911461061e57806395933ed61461064757806395d89b41146106725780639f8affb01461069d57610251565b80633ccfd60b116101d25780635fcc76aa116101965780635fcc76aa146104e15780636352211e1461050c578063708d79ae1461054957806370a0823114610574578063715018a6146105b15780637824407f146105c857610251565b80633ccfd60b1461042057806342842e0e146104375780634e99b80014610460578063507e094f1461048b5780635b92ac0d146104b657610251565b806318160ddd1161021957806318160ddd1461034d57806323b872dd1461037857806325fd90f3146103a15780632742a979146103cc5780633b7f13db146103f557610251565b806301ffc9a71461025657806306fdde03146102935780630811e2c0146102be578063081812fc146102e7578063095ea7b314610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612dae565b610983565b60405161028a919061344f565b60405180910390f35b34801561029f57600080fd5b506102a8610a65565b6040516102b5919061346a565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612e51565b610af7565b005b3480156102f357600080fd5b5061030e60048036038101906103099190612e51565b610c89565b60405161031b91906133e8565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190612d41565b610d0e565b005b34801561035957600080fd5b50610362610e26565b60405161036f919061382c565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612c2b565b610e37565b005b3480156103ad57600080fd5b506103b6610e97565b6040516103c3919061344f565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee9190612d81565b610eaa565b005b34801561040157600080fd5b5061040a610f9b565b604051610417919061346a565b60405180910390f35b34801561042c57600080fd5b50610435610fd4565b005b34801561044357600080fd5b5061045e60048036038101906104599190612c2b565b6110e2565b005b34801561046c57600080fd5b50610475611102565b604051610482919061346a565b60405180910390f35b34801561049757600080fd5b506104a0611190565b6040516104ad919061382c565b60405180910390f35b3480156104c257600080fd5b506104cb61119a565b6040516104d8919061344f565b60405180910390f35b3480156104ed57600080fd5b506104f66111b1565b604051610503919061382c565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612e51565b6111b7565b60405161054091906133e8565b60405180910390f35b34801561055557600080fd5b5061055e611269565b60405161056b919061382c565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190612bbe565b61126e565b6040516105a8919061382c565b60405180910390f35b3480156105bd57600080fd5b506105c6611326565b005b3480156105d457600080fd5b506105dd6113ae565b6040516105ea919061382c565b60405180910390f35b3480156105ff57600080fd5b506106086113ba565b60405161061591906133e8565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190612e08565b6113e4565b005b34801561065357600080fd5b5061065c6114ca565b604051610669919061344f565b60405180910390f35b34801561067e57600080fd5b506106876114dd565b604051610694919061346a565b60405180910390f35b3480156106a957600080fd5b506106b261156f565b6040516106bf919061382c565b60405180910390f35b6106e260048036038101906106dd9190612e51565b611575565b005b3480156106f057600080fd5b5061070b60048036038101906107069190612d01565b611615565b005b34801561071957600080fd5b5061072261162b565b60405161072f919061344f565b60405180910390f35b34801561074457600080fd5b5061074d61163e565b60405161075a919061382c565b60405180910390f35b34801561076f57600080fd5b50610778611648565b604051610785919061382c565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612c7e565b61164d565b005b3480156107c357600080fd5b506107cc6116af565b6040516107d9919061382c565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190612e51565b6116ba565b604051610816919061346a565b60405180910390f35b34801561082b57600080fd5b50610834611736565b604051610841919061382c565b60405180910390f35b34801561085657600080fd5b5061085f61173c565b60405161086c919061382c565b60405180910390f35b34801561088157600080fd5b5061088a611742565b604051610897919061382c565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190612beb565b61174c565b6040516108d4919061344f565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff9190612d81565b6117e0565b005b34801561091257600080fd5b5061092d60048036038101906109289190612bbe565b611879565b005b34801561093b57600080fd5b50610944611971565b604051610951919061382c565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c9190612e51565b611977565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5e5750610a5d82611a8e565b5b9050919050565b606060008054610a7490613af1565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090613af1565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b610aff611af8565b73ffffffffffffffffffffffffffffffffffffffff16610b1d6113ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906136ec565b60405180910390fd5b612710811115610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906134ac565b60405180910390fd5b600a548111610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf3906137ec565b60405180910390fd5b610c06600d611b00565b8111610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906136cc565b60405180910390fd5b80600a81905550600c60019054906101000a900460ff16610c86576001600c60016101000a81548160ff02191690831515021790555060056009819055505b50565b6000610c9482611b0e565b610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca906136ac565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d19826111b7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d819061374c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da9611af8565b73ffffffffffffffffffffffffffffffffffffffff161480610dd85750610dd781610dd2611af8565b61174c565b5b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e9061360c565b60405180910390fd5b610e218383611b7a565b505050565b6000610e32600d611b00565b905090565b610e48610e42611af8565b82611c33565b610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e906137cc565b60405180910390fd5b610e92838383611d11565b505050565b600c60009054906101000a900460ff1681565b610eb2611af8565b73ffffffffffffffffffffffffffffffffffffffff16610ed06113ba565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d906136ec565b60405180910390fd5b600c60029054906101000a900460ff1615610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d906137ac565b60405180910390fd5b8015610f98576001600c60026101000a81548160ff0219169083151502179055505b50565b6040518060400160405280601e81526020017f68747470733a2f2f6170692e6275747473747566662e6172742f6e66742f000081525081565b610fdc611af8565b73ffffffffffffffffffffffffffffffffffffffff16610ffa6113ba565b73ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906136ec565b60405180910390fd5b600047905060008111611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f906134cc565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110de573d6000803e3d6000fd5b5050565b6110fd8383836040518060200160405280600081525061164d565b505050565b600b805461110f90613af1565b80601f016020809104026020016040519081016040528092919081815260200182805461113b90613af1565b80156111885780601f1061115d57610100808354040283529160200191611188565b820191906000526020600020905b81548152906001019060200180831161116b57829003601f168201915b505050505081565b6000600954905090565b6000600c60009054906101000a900460ff16905090565b60095481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112579061364c565b60405180910390fd5b80915050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061362c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61132e611af8565b73ffffffffffffffffffffffffffffffffffffffff1661134c6113ba565b73ffffffffffffffffffffffffffffffffffffffff16146113a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611399906136ec565b60405180910390fd5b6113ac6000611f6d565b565b600d8060000154905081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113ec611af8565b73ffffffffffffffffffffffffffffffffffffffff1661140a6113ba565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611457906136ec565b60405180910390fd5b600c60029054906101000a900460ff16156114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a7906137ac565b60405180910390fd5b80600b90805190602001906114c69291906129d2565b5050565b600c60029054906101000a900460ff1681565b6060600180546114ec90613af1565b80601f016020809104026020016040519081016040528092919081815260200182805461151890613af1565b80156115655780601f1061153a57610100808354040283529160200191611565565b820191906000526020600020905b81548152906001019060200180831161154857829003601f168201915b5050505050905090565b600a5481565b600c60009054906101000a900460ff166115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb9061378c565b60405180910390fd5b600954811115611609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116009061376c565b60405180910390fd5b61161281612033565b50565b611627611620611af8565b8383612270565b5050565b600c60019054906101000a900460ff1681565b6000600854905090565b600581565b61165e611658611af8565b83611c33565b61169d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611694906137cc565b60405180910390fd5b6116a9848484846123dd565b50505050565b6611c37937e0800081565b60606116c582611b0e565b611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb906135cc565b60405180910390fd5b600b61170f83612439565b6040516020016117209291906133c4565b6040516020818303038152906040529050919050565b60085481565b61271081565b6000600a54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117e8611af8565b73ffffffffffffffffffffffffffffffffffffffff166118066113ba565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611853906136ec565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b611881611af8565b73ffffffffffffffffffffffffffffffffffffffff1661189f6113ba565b73ffffffffffffffffffffffffffffffffffffffff16146118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec906136ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c9061350c565b60405180910390fd5b61196e81611f6d565b50565b6108ae81565b61197f611af8565b73ffffffffffffffffffffffffffffffffffffffff1661199d6113ba565b73ffffffffffffffffffffffffffffffffffffffff16146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea906136ec565b60405180910390fd5b612710611a00600d611b00565b10611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a379061368c565b60405180910390fd5b6008548110611a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7b906135ec565b60405180910390fd5b8060088190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bed836111b7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3e82611b0e565b611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c74906135ac565b60405180910390fd5b6000611c88836111b7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cf757508373ffffffffffffffffffffffffffffffffffffffff16611cdf84610c89565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d085750611d07818561174c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d31826111b7565b73ffffffffffffffffffffffffffffffffffffffff1614611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e9061370c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee9061356c565b60405180910390fd5b611e0283838361259a565b611e0d600082611b7a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5d9190613a07565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb49190613926565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008111612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d9061372c565b60405180910390fd5b61271061209582612087600d611b00565b61259f90919063ffffffff16565b11156120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd9061348c565b60405180910390fd5b600c60019054906101000a900460ff161561214c57600a5461210a826120fc600d611b00565b61259f90919063ffffffff16565b111561214b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121429061354c565b60405180910390fd5b5b600c60019054906101000a900460ff166121b857612175816008546125b590919063ffffffff16565b3410156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061380c565b60405180910390fd5b5b60005b8181101561226c57600060016121d1600d611b00565b6121db9190613926565b90506127108111612258576121f0600d6125cb565b600a546121fd600d611b00565b1415612227576000600c60016101000a81548160ff021916908315150217905550600a6009819055505b61271081141561224d576000600c60006101000a81548160ff0219169083151502179055505b61225733826125e1565b5b50808061226490613b54565b9150506121bb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d69061358c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123d0919061344f565b60405180910390a3505050565b6123e8848484611d11565b6123f4848484846125ff565b612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a906134ec565b60405180910390fd5b50505050565b60606000821415612481576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612595565b600082905060005b600082146124b357808061249c90613b54565b915050600a826124ac919061397c565b9150612489565b60008167ffffffffffffffff8111156124cf576124ce613c8a565b5b6040519080825280601f01601f1916602001820160405280156125015781602001600182028036833780820191505090505b5090505b6000851461258e5760018261251a9190613a07565b9150600a856125299190613b9d565b60306125359190613926565b60f81b81838151811061254b5761254a613c5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612587919061397c565b9450612505565b8093505050505b919050565b505050565b600081836125ad9190613926565b905092915050565b600081836125c391906139ad565b905092915050565b6001816000016000828254019250508190555050565b6125fb828260405180602001604052806000815250612796565b5050565b60006126208473ffffffffffffffffffffffffffffffffffffffff166127f1565b15612789578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612649611af8565b8786866040518563ffffffff1660e01b815260040161266b9493929190613403565b602060405180830381600087803b15801561268557600080fd5b505af19250505080156126b657506040513d601f19601f820116820180604052508101906126b39190612ddb565b60015b612739573d80600081146126e6576040519150601f19603f3d011682016040523d82523d6000602084013e6126eb565b606091505b50600081511415612731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612728906134ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061278e565b600190505b949350505050565b6127a08383612804565b6127ad60008484846125ff565b6127ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e3906134ec565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b9061366c565b60405180910390fd5b61287d81611b0e565b156128bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b49061352c565b60405180910390fd5b6128c96000838361259a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129199190613926565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129de90613af1565b90600052602060002090601f016020900481019282612a005760008555612a47565b82601f10612a1957805160ff1916838001178555612a47565b82800160010185558215612a47579182015b82811115612a46578251825591602001919060010190612a2b565b5b509050612a549190612a58565b5090565b5b80821115612a71576000816000905550600101612a59565b5090565b6000612a88612a838461386c565b613847565b905082815260208101848484011115612aa457612aa3613cbe565b5b612aaf848285613aaf565b509392505050565b6000612aca612ac58461389d565b613847565b905082815260208101848484011115612ae657612ae5613cbe565b5b612af1848285613aaf565b509392505050565b600081359050612b08816144c7565b92915050565b600081359050612b1d816144de565b92915050565b600081359050612b32816144f5565b92915050565b600081519050612b47816144f5565b92915050565b600082601f830112612b6257612b61613cb9565b5b8135612b72848260208601612a75565b91505092915050565b600082601f830112612b9057612b8f613cb9565b5b8135612ba0848260208601612ab7565b91505092915050565b600081359050612bb88161450c565b92915050565b600060208284031215612bd457612bd3613cc8565b5b6000612be284828501612af9565b91505092915050565b60008060408385031215612c0257612c01613cc8565b5b6000612c1085828601612af9565b9250506020612c2185828601612af9565b9150509250929050565b600080600060608486031215612c4457612c43613cc8565b5b6000612c5286828701612af9565b9350506020612c6386828701612af9565b9250506040612c7486828701612ba9565b9150509250925092565b60008060008060808587031215612c9857612c97613cc8565b5b6000612ca687828801612af9565b9450506020612cb787828801612af9565b9350506040612cc887828801612ba9565b925050606085013567ffffffffffffffff811115612ce957612ce8613cc3565b5b612cf587828801612b4d565b91505092959194509250565b60008060408385031215612d1857612d17613cc8565b5b6000612d2685828601612af9565b9250506020612d3785828601612b0e565b9150509250929050565b60008060408385031215612d5857612d57613cc8565b5b6000612d6685828601612af9565b9250506020612d7785828601612ba9565b9150509250929050565b600060208284031215612d9757612d96613cc8565b5b6000612da584828501612b0e565b91505092915050565b600060208284031215612dc457612dc3613cc8565b5b6000612dd284828501612b23565b91505092915050565b600060208284031215612df157612df0613cc8565b5b6000612dff84828501612b38565b91505092915050565b600060208284031215612e1e57612e1d613cc8565b5b600082013567ffffffffffffffff811115612e3c57612e3b613cc3565b5b612e4884828501612b7b565b91505092915050565b600060208284031215612e6757612e66613cc8565b5b6000612e7584828501612ba9565b91505092915050565b612e8781613a3b565b82525050565b612e9681613a4d565b82525050565b6000612ea7826138e3565b612eb181856138f9565b9350612ec1818560208601613abe565b612eca81613ccd565b840191505092915050565b6000612ee0826138ee565b612eea818561390a565b9350612efa818560208601613abe565b612f0381613ccd565b840191505092915050565b6000612f19826138ee565b612f23818561391b565b9350612f33818560208601613abe565b80840191505092915050565b60008154612f4c81613af1565b612f56818661391b565b94506001821660008114612f715760018114612f8257612fb5565b60ff19831686528186019350612fb5565b612f8b856138ce565b60005b83811015612fad57815481890152600182019150602081019050612f8e565b838801955050505b50505092915050565b6000612fcb60368361390a565b9150612fd682613cde565b604082019050919050565b6000612fee60248361390a565b9150612ff982613d2d565b604082019050919050565b600061301160138361390a565b915061301c82613d7c565b602082019050919050565b600061303460328361390a565b915061303f82613da5565b604082019050919050565b600061305760268361390a565b915061306282613df4565b604082019050919050565b600061307a601c8361390a565b915061308582613e43565b602082019050919050565b600061309d603b8361390a565b91506130a882613e6c565b604082019050919050565b60006130c060248361390a565b91506130cb82613ebb565b604082019050919050565b60006130e360198361390a565b91506130ee82613f0a565b602082019050919050565b6000613106602c8361390a565b915061311182613f33565b604082019050919050565b600061312960288361390a565b915061313482613f82565b604082019050919050565b600061314c601e8361390a565b915061315782613fd1565b602082019050919050565b600061316f60388361390a565b915061317a82613ffa565b604082019050919050565b6000613192602a8361390a565b915061319d82614049565b604082019050919050565b60006131b560298361390a565b91506131c082614098565b604082019050919050565b60006131d860208361390a565b91506131e3826140e7565b602082019050919050565b60006131fb602b8361390a565b915061320682614110565b604082019050919050565b600061321e602c8361390a565b91506132298261415f565b604082019050919050565b600061324160298361390a565b915061324c826141ae565b604082019050919050565b600061326460208361390a565b915061326f826141fd565b602082019050919050565b600061328760298361390a565b915061329282614226565b604082019050919050565b60006132aa60278361390a565b91506132b582614275565b604082019050919050565b60006132cd60218361390a565b91506132d8826142c4565b604082019050919050565b60006132f0602e8361390a565b91506132fb82614313565b604082019050919050565b600061331360168361390a565b915061331e82614362565b602082019050919050565b600061333660278361390a565b91506133418261438b565b604082019050919050565b600061335960318361390a565b9150613364826143da565b604082019050919050565b600061337c60288361390a565b915061338782614429565b604082019050919050565b600061339f60238361390a565b91506133aa82614478565b604082019050919050565b6133be81613aa5565b82525050565b60006133d08285612f3f565b91506133dc8284612f0e565b91508190509392505050565b60006020820190506133fd6000830184612e7e565b92915050565b60006080820190506134186000830187612e7e565b6134256020830186612e7e565b61343260408301856133b5565b81810360608301526134448184612e9c565b905095945050505050565b60006020820190506134646000830184612e8d565b92915050565b600060208201905081810360008301526134848184612ed5565b905092915050565b600060208201905081810360008301526134a581612fbe565b9050919050565b600060208201905081810360008301526134c581612fe1565b9050919050565b600060208201905081810360008301526134e581613004565b9050919050565b6000602082019050818103600083015261350581613027565b9050919050565b600060208201905081810360008301526135258161304a565b9050919050565b600060208201905081810360008301526135458161306d565b9050919050565b6000602082019050818103600083015261356581613090565b9050919050565b60006020820190508181036000830152613585816130b3565b9050919050565b600060208201905081810360008301526135a5816130d6565b9050919050565b600060208201905081810360008301526135c5816130f9565b9050919050565b600060208201905081810360008301526135e58161311c565b9050919050565b600060208201905081810360008301526136058161313f565b9050919050565b6000602082019050818103600083015261362581613162565b9050919050565b6000602082019050818103600083015261364581613185565b9050919050565b60006020820190508181036000830152613665816131a8565b9050919050565b60006020820190508181036000830152613685816131cb565b9050919050565b600060208201905081810360008301526136a5816131ee565b9050919050565b600060208201905081810360008301526136c581613211565b9050919050565b600060208201905081810360008301526136e581613234565b9050919050565b6000602082019050818103600083015261370581613257565b9050919050565b600060208201905081810360008301526137258161327a565b9050919050565b600060208201905081810360008301526137458161329d565b9050919050565b60006020820190508181036000830152613765816132c0565b9050919050565b60006020820190508181036000830152613785816132e3565b9050919050565b600060208201905081810360008301526137a581613306565b9050919050565b600060208201905081810360008301526137c581613329565b9050919050565b600060208201905081810360008301526137e58161334c565b9050919050565b600060208201905081810360008301526138058161336f565b9050919050565b6000602082019050818103600083015261382581613392565b9050919050565b600060208201905061384160008301846133b5565b92915050565b6000613851613862565b905061385d8282613b23565b919050565b6000604051905090565b600067ffffffffffffffff82111561388757613886613c8a565b5b61389082613ccd565b9050602081019050919050565b600067ffffffffffffffff8211156138b8576138b7613c8a565b5b6138c182613ccd565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061393182613aa5565b915061393c83613aa5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561397157613970613bce565b5b828201905092915050565b600061398782613aa5565b915061399283613aa5565b9250826139a2576139a1613bfd565b5b828204905092915050565b60006139b882613aa5565b91506139c383613aa5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139fc576139fb613bce565b5b828202905092915050565b6000613a1282613aa5565b9150613a1d83613aa5565b925082821015613a3057613a2f613bce565b5b828203905092915050565b6000613a4682613a85565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613adc578082015181840152602081019050613ac1565b83811115613aeb576000848401525b50505050565b60006002820490506001821680613b0957607f821691505b60208210811415613b1d57613b1c613c2c565b5b50919050565b613b2c82613ccd565b810181811067ffffffffffffffff82111715613b4b57613b4a613c8a565b5b80604052505050565b6000613b5f82613aa5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b9257613b91613bce565b5b600182019050919050565b6000613ba882613aa5565b9150613bb383613aa5565b925082613bc357613bc2613bfd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5468697320547820776f756c6420657863656564206d617820737570706c792060008201527f6f66205374756666207570204275747473204e46547300000000000000000000602082015250565b7f43616e277420676976652061776179206d6f7265207468616e2065786973742c60008201527f2064756800000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5468697320547820776f756c6420657863656564206d617820737570706c792060008201527f6f662046524545205374756666207570204275747473204e4654730000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a207468617420746f6b656e20646f65736e60008201527f2774206578697374000000000000000000000000000000000000000000000000602082015250565b7f50726963652063616e206f6e6c79206265206c6f77657265642c206475680000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e74696e6720697320646f6e652c2063616e27742075706461746520707260008201527f69636520616e796d6f7265000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6577206f6e65206d75737420626520686967686572207468616e206375727260008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f596f75206d757374206d696e74206174206c656173742031205374756666207560008201527f7020427574747300000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e74697479206973206d6f7265207468616e20616c6c6f77656420706560008201527f72207472616e73616374696f6e2e000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f74206163746976652e00000000000000000000600082015250565b7f546f6b656e204261736520555249206973206c6f636b6564206e6f772026206660008201527f6f72657665722e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43616e2774206c6f77657220746865206e756d626572206f662066726565206f60008201527f6e65732c20647568000000000000000000000000000000000000000000000000602082015250565b7f5468652065746865722076616c75652073656e74206973206e6f7420636f727260008201527f6563740000000000000000000000000000000000000000000000000000000000602082015250565b6144d081613a3b565b81146144db57600080fd5b50565b6144e781613a4d565b81146144f257600080fd5b50565b6144fe81613a59565b811461450957600080fd5b50565b61451581613aa5565b811461452057600080fd5b5056fea2646970667358221220c0378d6c223c24aa85810e006f73833e914975c088bedd0f0ccdc003929fcf8b64736f6c63430008060033

Deployed Bytecode Sourcemap

43117:6058:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17925:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18870:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47782:535;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20429:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19952:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47374:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21179:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44150:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45053:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44069:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48987:183;;;;;;;;;;;;;:::i;:::-;;21589:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44038:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47257:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47154:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43806:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18564:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43555:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18294:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40175:103;;;;;;;;;;;;;:::i;:::-;;44262:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39524:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44862:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44220:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19039:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43849:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45551:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20722:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44185:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48630:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43499:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21845:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43702:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45263:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43770:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43393:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47490:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20948:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46996:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40433:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43444:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48323:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17925:305;18027:4;18079:25;18064:40;;;:11;:40;;;;:105;;;;18136:33;18121:48;;;:11;:48;;;;18064:105;:158;;;;18186:36;18210:11;18186:23;:36::i;:::-;18064:158;18044:178;;17925:305;;;:::o;18870:100::-;18924:13;18957:5;18950:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18870:100;:::o;47782:535::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43434:5:::1;47877:14;:32;;47869:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47982:22;;47965:14;:39;47957:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;48081:21;:11;:19;:21::i;:::-;48064:14;:38;48056:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;48180:14;48155:22;:39;;;;48206:11;;;;;;;;;;;48201:111;;48242:4;48228:11;;:18;;;;;;;;;;;;;;;;;;43549:1;48255:23;:49;;;;48201:111;47782:535:::0;:::o;20429:221::-;20505:7;20533:16;20541:7;20533;:16::i;:::-;20525:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20618:15;:24;20634:7;20618:24;;;;;;;;;;;;;;;;;;;;;20611:31;;20429:221;;;:::o;19952:411::-;20033:13;20049:23;20064:7;20049:14;:23::i;:::-;20033:39;;20097:5;20091:11;;:2;:11;;;;20083:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;20191:5;20175:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20200:37;20217:5;20224:12;:10;:12::i;:::-;20200:16;:37::i;:::-;20175:62;20153:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;20334:21;20343:2;20347:7;20334:8;:21::i;:::-;20022:341;19952:411;;:::o;47374:110::-;47430:7;47457:21;:11;:19;:21::i;:::-;47450:28;;47374:110;:::o;21179:339::-;21374:41;21393:12;:10;:12::i;:::-;21407:7;21374:18;:41::i;:::-;21366:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;21482:28;21492:4;21498:2;21502:7;21482:9;:28::i;:::-;21179:339;;;:::o;44150:30::-;;;;;;;;;;;;;:::o;45053:204::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45134:15:::1;;;;;;;;;;;45133:16;45125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45204:7;45200:52;;;45240:4;45222:15;;:22;;;;;;;;;;;;;;;;;;45200:52;45053:204:::0;:::o;44069:74::-;;;;;;;;;;;;;;;;;;;:::o;48987:183::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49031:15:::1;49049:21;49031:39;;49095:1;49085:7;:11;49077:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49135:10;49127:28;;:37;49156:7;49127:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49024:146;48987:183::o:0;21589:185::-;21727:39;21744:4;21750:2;21754:7;21727:39;;;;;;;;;;;;:16;:39::i;:::-;21589:185;;;:::o;44038:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47257:111::-;47312:7;47339:23;;47332:30;;47257:111;:::o;47154:97::-;47211:4;47235:10;;;;;;;;;;;47228:17;;47154:97;:::o;43806:38::-;;;;:::o;18564:239::-;18636:7;18656:13;18672:7;:16;18680:7;18672:16;;;;;;;;;;;;;;;;;;;;;18656:32;;18724:1;18707:19;;:5;:19;;;;18699:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18790:5;18783:12;;;18564:239;;;:::o;43555:56::-;43609:2;43555:56;:::o;18294:208::-;18366:7;18411:1;18394:19;;:5;:19;;;;18386:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18478:9;:16;18488:5;18478:16;;;;;;;;;;;;;;;;18471:23;;18294:208;;;:::o;40175:103::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40240:30:::1;40267:1;40240:18;:30::i;:::-;40175:103::o:0;44262:35::-;;;;;;;;;:::o;39524:87::-;39570:7;39597:6;;;;;;;;;;;39590:13;;39524:87;:::o;44862:185::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44952:15:::1;;;;;;;;;;;44951:16;44943:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45033:8;45018:12;:23;;;;;;;;;;;;:::i;:::-;;44862:185:::0;:::o;44220:35::-;;;;;;;;;;;;;:::o;19039:104::-;19095:13;19128:7;19121:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19039:104;:::o;43849:37::-;;;;:::o;45551:246::-;45616:10;;;;;;;;;;;45608:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;45681:23;;45668:9;:36;;45660:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45762:29;45781:9;45762:18;:29::i;:::-;45551:246;:::o;20722:155::-;20817:52;20836:12;:10;:12::i;:::-;20850:8;20860;20817:18;:52::i;:::-;20722:155;;:::o;44185:30::-;;;;;;;;;;;;;:::o;48630:105::-;48687:7;48713:16;;48706:23;;48630:105;:::o;43499:51::-;43549:1;43499:51;:::o;21845:328::-;22020:41;22039:12;:10;:12::i;:::-;22053:7;22020:18;:41::i;:::-;22012:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22126:39;22140:4;22146:2;22150:7;22159:5;22126:13;:39::i;:::-;21845:328;;;;:::o;43702:63::-;43749:16;43702:63;:::o;45263:237::-;45329:13;45359:17;45367:8;45359:7;:17::i;:::-;45351:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;45459:12;45473:19;:8;:17;:19::i;:::-;45442:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45428:66;;45263:237;;;:::o;43770:31::-;;;;:::o;43393:46::-;43434:5;43393:46;:::o;47490:114::-;47549:7;47576:22;;47569:29;;47490:114;:::o;20948:164::-;21045:4;21069:18;:25;21088:5;21069:25;;;;;;;;;;;;;;;:35;21095:8;21069:35;;;;;;;;;;;;;;;;;;;;;;;;;21062:42;;20948:164;;;;:::o;46996:98::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47081:7:::1;47068:10;;:20;;;;;;;;;;;;;;;;;;46996:98:::0;:::o;40433:201::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40542:1:::1;40522:22;;:8;:22;;;;40514:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40598:28;40617:8;40598:18;:28::i;:::-;40433:201:::0;:::o;43444:50::-;43490:4;43444:50;:::o;48323:301::-;39755:12;:10;:12::i;:::-;39744:23;;:7;:5;:7::i;:::-;:23;;;39736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43434:5:::1;48413:21;:11;:19;:21::i;:::-;:38;48405:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;48529:16;;48514:12;:31;48506:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48606:12;48587:16;:31;;;;48323:301:::0;:::o;16534:157::-;16619:4;16658:25;16643:40;;;:11;:40;;;;16636:47;;16534:157;;;:::o;15622:98::-;15675:7;15702:10;15695:17;;15622:98;:::o;37948:114::-;38013:7;38040;:14;;;38033:21;;37948:114;;;:::o;23683:127::-;23748:4;23800:1;23772:30;;:7;:16;23780:7;23772:16;;;;;;;;;;;;;;;;;;;;;:30;;;;23765:37;;23683:127;;;:::o;27665:174::-;27767:2;27740:15;:24;27756:7;27740:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27823:7;27819:2;27785:46;;27794:23;27809:7;27794:14;:23::i;:::-;27785:46;;;;;;;;;;;;27665:174;;:::o;23977:348::-;24070:4;24095:16;24103:7;24095;:16::i;:::-;24087:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24171:13;24187:23;24202:7;24187:14;:23::i;:::-;24171:39;;24240:5;24229:16;;:7;:16;;;:51;;;;24273:7;24249:31;;:20;24261:7;24249:11;:20::i;:::-;:31;;;24229:51;:87;;;;24284:32;24301:5;24308:7;24284:16;:32::i;:::-;24229:87;24221:96;;;23977:348;;;;:::o;26969:578::-;27128:4;27101:31;;:23;27116:7;27101:14;:23::i;:::-;:31;;;27093:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27211:1;27197:16;;:2;:16;;;;27189:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;27267:39;27288:4;27294:2;27298:7;27267:20;:39::i;:::-;27371:29;27388:1;27392:7;27371:8;:29::i;:::-;27432:1;27413:9;:15;27423:4;27413:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;27461:1;27444:9;:13;27454:2;27444:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27492:2;27473:7;:16;27481:7;27473:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27531:7;27527:2;27512:27;;27521:4;27512:27;;;;;;;;;;;;26969:578;;;:::o;40794:191::-;40868:16;40887:6;;;;;;;;;;;40868:25;;40913:8;40904:6;;:17;;;;;;;;;;;;;;;;;;40968:8;40937:40;;40958:8;40937:40;;;;;;;;;;;;40857:128;40794:191;:::o;45803:1187::-;45886:1;45874:9;:13;45866:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43434:5;45946:36;45972:9;45946:21;:11;:19;:21::i;:::-;:25;;:36;;;;:::i;:::-;:54;;45938:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;46070:11;;;;;;;;;;;46066:168;;;46140:22;;46100:36;46126:9;46100:21;:11;:19;:21::i;:::-;:25;;:36;;;;:::i;:::-;:62;;46092:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;46066:168;46245:11;;;;;;;;;;;46240:127;;46288:31;46309:9;46288:16;;:20;;:31;;;;:::i;:::-;46275:9;:44;;46267:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;46240:127;46380:9;46375:610;46399:9;46395:1;:13;46375:610;;;46424:17;46468:1;46444:21;:11;:19;:21::i;:::-;:25;;;;:::i;:::-;46424:45;;43434:5;46482:9;:27;46478:500;;46522:23;:11;:21;:23::i;:::-;46652:22;;46627:21;:11;:19;:21::i;:::-;:47;46623:163;;;46703:5;46689:11;;:19;;;;;;;;;;;;;;;;;;43609:2;46721:23;:53;;;;46623:163;43434:5;46854:9;:27;46850:76;;;46909:5;46896:10;;:18;;;;;;;;;;;;;;;;;;46850:76;46936:32;46946:10;46958:9;46936;:32::i;:::-;46478:500;46415:570;46410:3;;;;;:::i;:::-;;;;46375:610;;;;45803:1187;:::o;27981:315::-;28136:8;28127:17;;:5;:17;;;;28119:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;28223:8;28185:18;:25;28204:5;28185:25;;;;;;;;;;;;;;;:35;28211:8;28185:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;28269:8;28247:41;;28262:5;28247:41;;;28279:8;28247:41;;;;;;:::i;:::-;;;;;;;;27981:315;;;:::o;23055:::-;23212:28;23222:4;23228:2;23232:7;23212:9;:28::i;:::-;23259:48;23282:4;23288:2;23292:7;23301:5;23259:22;:48::i;:::-;23251:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23055:315;;;;:::o;41281:723::-;41337:13;41567:1;41558:5;:10;41554:53;;;41585:10;;;;;;;;;;;;;;;;;;;;;41554:53;41617:12;41632:5;41617:20;;41648:14;41673:78;41688:1;41680:4;:9;41673:78;;41706:8;;;;;:::i;:::-;;;;41737:2;41729:10;;;;;:::i;:::-;;;41673:78;;;41761:19;41793:6;41783:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41761:39;;41811:154;41827:1;41818:5;:10;41811:154;;41855:1;41845:11;;;;;:::i;:::-;;;41922:2;41914:5;:10;;;;:::i;:::-;41901:2;:24;;;;:::i;:::-;41888:39;;41871:6;41878;41871:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;41951:2;41942:11;;;;;:::i;:::-;;;41811:154;;;41989:6;41975:21;;;;;41281:723;;;;:::o;30232:126::-;;;;:::o;32988:98::-;33046:7;33077:1;33073;:5;;;;:::i;:::-;33066:12;;32988:98;;;;:::o;33726:::-;33784:7;33815:1;33811;:5;;;;:::i;:::-;33804:12;;33726:98;;;;:::o;38070:127::-;38177:1;38159:7;:14;;;:19;;;;;;;;;;;38070:127;:::o;24667:110::-;24743:26;24753:2;24757:7;24743:26;;;;;;;;;;;;:9;:26::i;:::-;24667:110;;:::o;28861:799::-;29016:4;29037:15;:2;:13;;;:15::i;:::-;29033:620;;;29089:2;29073:36;;;29110:12;:10;:12::i;:::-;29124:4;29130:7;29139:5;29073:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29069:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29332:1;29315:6;:13;:18;29311:272;;;29358:60;;;;;;;;;;:::i;:::-;;;;;;;;29311:272;29533:6;29527:13;29518:6;29514:2;29510:15;29503:38;29069:529;29206:41;;;29196:51;;;:6;:51;;;;29189:58;;;;;29033:620;29637:4;29630:11;;28861:799;;;;;;;:::o;25004:321::-;25134:18;25140:2;25144:7;25134:5;:18::i;:::-;25185:54;25216:1;25220:2;25224:7;25233:5;25185:22;:54::i;:::-;25163:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;25004:321;;;:::o;7751:387::-;7811:4;8019:12;8086:7;8074:20;8066:28;;8129:1;8122:4;:8;8115:15;;;7751:387;;;:::o;25661:382::-;25755:1;25741:16;;:2;:16;;;;25733:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;25814:16;25822:7;25814;:16::i;:::-;25813:17;25805:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;25876:45;25905:1;25909:2;25913:7;25876:20;:45::i;:::-;25951:1;25934:9;:13;25944:2;25934:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;25982:2;25963:7;:16;25971:7;25963:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;26027:7;26023:2;26002:33;;26019:1;26002:33;;;;;;;;;;;;25661:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;1035:84;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1176:86;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1330:79;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:2;;1540:79;;:::i;:::-;1499:2;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:2;;1899:79;;:::i;:::-;1858:2;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2184:87;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:2;;;2391:79;;:::i;:::-;2353:2;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2343:263;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:2;;;2743:79;;:::i;:::-;2705:2;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2695:391;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:2;;;3240:79;;:::i;:::-;3202:2;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3192:519;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:2;;;3892:79;;:::i;:::-;3853:2;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:2;;;4476:79;;:::i;:::-;4440:2;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3843:817;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:2;;;4794:79;;:::i;:::-;4756:2;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4746:388;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5271:79;;:::i;:::-;5233:2;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5223:391;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:2;;;5731:79;;:::i;:::-;5693:2;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5683:260;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:2;;;6062:79;;:::i;:::-;6024:2;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;6014:262;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:2;;;6406:79;;:::i;:::-;6368:2;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6358:273;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:2;;;6761:79;;:::i;:::-;6723:2;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:2;;;6961:79;;:::i;:::-;6925:2;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6713:433;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:2;;;7266:79;;:::i;:::-;7228:2;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7218:263;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7552:53;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7670:50;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;;;;;:::o;8869:845::-;8972:3;9009:5;9003:12;9038:36;9064:9;9038:36;:::i;:::-;9090:89;9172:6;9167:3;9090:89;:::i;:::-;9083:96;;9210:1;9199:9;9195:17;9226:1;9221:137;;;;9372:1;9367:341;;;;9188:520;;9221:137;9305:4;9301:9;9290;9286:25;9281:3;9274:38;9341:6;9336:3;9332:16;9325:23;;9221:137;;9367:341;9434:38;9466:5;9434:38;:::i;:::-;9494:1;9508:154;9522:6;9519:1;9516:13;9508:154;;;9596:7;9590:14;9586:1;9581:3;9577:11;9570:35;9646:1;9637:7;9633:15;9622:26;;9544:4;9541:1;9537:12;9532:17;;9508:154;;;9691:6;9686:3;9682:16;9675:23;;9374:334;;9188:520;;8976:738;;;;;;:::o;9720:366::-;9862:3;9883:67;9947:2;9942:3;9883:67;:::i;:::-;9876:74;;9959:93;10048:3;9959:93;:::i;:::-;10077:2;10072:3;10068:12;10061:19;;9866:220;;;:::o;10092:366::-;10234:3;10255:67;10319:2;10314:3;10255:67;:::i;:::-;10248:74;;10331:93;10420:3;10331:93;:::i;:::-;10449:2;10444:3;10440:12;10433:19;;10238:220;;;:::o;10464:366::-;10606:3;10627:67;10691:2;10686:3;10627:67;:::i;:::-;10620:74;;10703:93;10792:3;10703:93;:::i;:::-;10821:2;10816:3;10812:12;10805:19;;10610:220;;;:::o;10836:366::-;10978:3;10999:67;11063:2;11058:3;10999:67;:::i;:::-;10992:74;;11075:93;11164:3;11075:93;:::i;:::-;11193:2;11188:3;11184:12;11177:19;;10982:220;;;:::o;11208:366::-;11350:3;11371:67;11435:2;11430:3;11371:67;:::i;:::-;11364:74;;11447:93;11536:3;11447:93;:::i;:::-;11565:2;11560:3;11556:12;11549:19;;11354:220;;;:::o;11580:366::-;11722:3;11743:67;11807:2;11802:3;11743:67;:::i;:::-;11736:74;;11819:93;11908:3;11819:93;:::i;:::-;11937:2;11932:3;11928:12;11921:19;;11726:220;;;:::o;11952:366::-;12094:3;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12191:93;12280:3;12191:93;:::i;:::-;12309:2;12304:3;12300:12;12293:19;;12098:220;;;:::o;12324:366::-;12466:3;12487:67;12551:2;12546:3;12487:67;:::i;:::-;12480:74;;12563:93;12652:3;12563:93;:::i;:::-;12681:2;12676:3;12672:12;12665:19;;12470:220;;;:::o;12696:366::-;12838:3;12859:67;12923:2;12918:3;12859:67;:::i;:::-;12852:74;;12935:93;13024:3;12935:93;:::i;:::-;13053:2;13048:3;13044:12;13037:19;;12842:220;;;:::o;13068:366::-;13210:3;13231:67;13295:2;13290:3;13231:67;:::i;:::-;13224:74;;13307:93;13396:3;13307:93;:::i;:::-;13425:2;13420:3;13416:12;13409:19;;13214:220;;;:::o;13440:366::-;13582:3;13603:67;13667:2;13662:3;13603:67;:::i;:::-;13596:74;;13679:93;13768:3;13679:93;:::i;:::-;13797:2;13792:3;13788:12;13781:19;;13586:220;;;:::o;13812:366::-;13954:3;13975:67;14039:2;14034:3;13975:67;:::i;:::-;13968:74;;14051:93;14140:3;14051:93;:::i;:::-;14169:2;14164:3;14160:12;14153:19;;13958:220;;;:::o;14184:366::-;14326:3;14347:67;14411:2;14406:3;14347:67;:::i;:::-;14340:74;;14423:93;14512:3;14423:93;:::i;:::-;14541:2;14536:3;14532:12;14525:19;;14330:220;;;:::o;14556:366::-;14698:3;14719:67;14783:2;14778:3;14719:67;:::i;:::-;14712:74;;14795:93;14884:3;14795:93;:::i;:::-;14913:2;14908:3;14904:12;14897:19;;14702:220;;;:::o;14928:366::-;15070:3;15091:67;15155:2;15150:3;15091:67;:::i;:::-;15084:74;;15167:93;15256:3;15167:93;:::i;:::-;15285:2;15280:3;15276:12;15269:19;;15074:220;;;:::o;15300:366::-;15442:3;15463:67;15527:2;15522:3;15463:67;:::i;:::-;15456:74;;15539:93;15628:3;15539:93;:::i;:::-;15657:2;15652:3;15648:12;15641:19;;15446:220;;;:::o;15672:366::-;15814:3;15835:67;15899:2;15894:3;15835:67;:::i;:::-;15828:74;;15911:93;16000:3;15911:93;:::i;:::-;16029:2;16024:3;16020:12;16013:19;;15818:220;;;:::o;16044:366::-;16186:3;16207:67;16271:2;16266:3;16207:67;:::i;:::-;16200:74;;16283:93;16372:3;16283:93;:::i;:::-;16401:2;16396:3;16392:12;16385:19;;16190:220;;;:::o;16416:366::-;16558:3;16579:67;16643:2;16638:3;16579:67;:::i;:::-;16572:74;;16655:93;16744:3;16655:93;:::i;:::-;16773:2;16768:3;16764:12;16757:19;;16562:220;;;:::o;16788:366::-;16930:3;16951:67;17015:2;17010:3;16951:67;:::i;:::-;16944:74;;17027:93;17116:3;17027:93;:::i;:::-;17145:2;17140:3;17136:12;17129:19;;16934:220;;;:::o;17160:366::-;17302:3;17323:67;17387:2;17382:3;17323:67;:::i;:::-;17316:74;;17399:93;17488:3;17399:93;:::i;:::-;17517:2;17512:3;17508:12;17501:19;;17306:220;;;:::o;17532:366::-;17674:3;17695:67;17759:2;17754:3;17695:67;:::i;:::-;17688:74;;17771:93;17860:3;17771:93;:::i;:::-;17889:2;17884:3;17880:12;17873:19;;17678:220;;;:::o;17904:366::-;18046:3;18067:67;18131:2;18126:3;18067:67;:::i;:::-;18060:74;;18143:93;18232:3;18143:93;:::i;:::-;18261:2;18256:3;18252:12;18245:19;;18050:220;;;:::o;18276:366::-;18418:3;18439:67;18503:2;18498:3;18439:67;:::i;:::-;18432:74;;18515:93;18604:3;18515:93;:::i;:::-;18633:2;18628:3;18624:12;18617:19;;18422:220;;;:::o;18648:366::-;18790:3;18811:67;18875:2;18870:3;18811:67;:::i;:::-;18804:74;;18887:93;18976:3;18887:93;:::i;:::-;19005:2;19000:3;18996:12;18989:19;;18794:220;;;:::o;19020:366::-;19162:3;19183:67;19247:2;19242:3;19183:67;:::i;:::-;19176:74;;19259:93;19348:3;19259:93;:::i;:::-;19377:2;19372:3;19368:12;19361:19;;19166:220;;;:::o;19392:366::-;19534:3;19555:67;19619:2;19614:3;19555:67;:::i;:::-;19548:74;;19631:93;19720:3;19631:93;:::i;:::-;19749:2;19744:3;19740:12;19733:19;;19538:220;;;:::o;19764:366::-;19906:3;19927:67;19991:2;19986:3;19927:67;:::i;:::-;19920:74;;20003:93;20092:3;20003:93;:::i;:::-;20121:2;20116:3;20112:12;20105:19;;19910:220;;;:::o;20136:366::-;20278:3;20299:67;20363:2;20358:3;20299:67;:::i;:::-;20292:74;;20375:93;20464:3;20375:93;:::i;:::-;20493:2;20488:3;20484:12;20477:19;;20282:220;;;:::o;20508:118::-;20595:24;20613:5;20595:24;:::i;:::-;20590:3;20583:37;20573:53;;:::o;20632:429::-;20809:3;20831:92;20919:3;20910:6;20831:92;:::i;:::-;20824:99;;20940:95;21031:3;21022:6;20940:95;:::i;:::-;20933:102;;21052:3;21045:10;;20813:248;;;;;:::o;21067:222::-;21160:4;21198:2;21187:9;21183:18;21175:26;;21211:71;21279:1;21268:9;21264:17;21255:6;21211:71;:::i;:::-;21165:124;;;;:::o;21295:640::-;21490:4;21528:3;21517:9;21513:19;21505:27;;21542:71;21610:1;21599:9;21595:17;21586:6;21542:71;:::i;:::-;21623:72;21691:2;21680:9;21676:18;21667:6;21623:72;:::i;:::-;21705;21773:2;21762:9;21758:18;21749:6;21705:72;:::i;:::-;21824:9;21818:4;21814:20;21809:2;21798:9;21794:18;21787:48;21852:76;21923:4;21914:6;21852:76;:::i;:::-;21844:84;;21495:440;;;;;;;:::o;21941:210::-;22028:4;22066:2;22055:9;22051:18;22043:26;;22079:65;22141:1;22130:9;22126:17;22117:6;22079:65;:::i;:::-;22033:118;;;;:::o;22157:313::-;22270:4;22308:2;22297:9;22293:18;22285:26;;22357:9;22351:4;22347:20;22343:1;22332:9;22328:17;22321:47;22385:78;22458:4;22449:6;22385:78;:::i;:::-;22377:86;;22275:195;;;;:::o;22476:419::-;22642:4;22680:2;22669:9;22665:18;22657:26;;22729:9;22723:4;22719:20;22715:1;22704:9;22700:17;22693:47;22757:131;22883:4;22757:131;:::i;:::-;22749:139;;22647:248;;;:::o;22901:419::-;23067:4;23105:2;23094:9;23090:18;23082:26;;23154:9;23148:4;23144:20;23140:1;23129:9;23125:17;23118:47;23182:131;23308:4;23182:131;:::i;:::-;23174:139;;23072:248;;;:::o;23326:419::-;23492:4;23530:2;23519:9;23515:18;23507:26;;23579:9;23573:4;23569:20;23565:1;23554:9;23550:17;23543:47;23607:131;23733:4;23607:131;:::i;:::-;23599:139;;23497:248;;;:::o;23751:419::-;23917:4;23955:2;23944:9;23940:18;23932:26;;24004:9;23998:4;23994:20;23990:1;23979:9;23975:17;23968:47;24032:131;24158:4;24032:131;:::i;:::-;24024:139;;23922:248;;;:::o;24176:419::-;24342:4;24380:2;24369:9;24365:18;24357:26;;24429:9;24423:4;24419:20;24415:1;24404:9;24400:17;24393:47;24457:131;24583:4;24457:131;:::i;:::-;24449:139;;24347:248;;;:::o;24601:419::-;24767:4;24805:2;24794:9;24790:18;24782:26;;24854:9;24848:4;24844:20;24840:1;24829:9;24825:17;24818:47;24882:131;25008:4;24882:131;:::i;:::-;24874:139;;24772:248;;;:::o;25026:419::-;25192:4;25230:2;25219:9;25215:18;25207:26;;25279:9;25273:4;25269:20;25265:1;25254:9;25250:17;25243:47;25307:131;25433:4;25307:131;:::i;:::-;25299:139;;25197:248;;;:::o;25451:419::-;25617:4;25655:2;25644:9;25640:18;25632:26;;25704:9;25698:4;25694:20;25690:1;25679:9;25675:17;25668:47;25732:131;25858:4;25732:131;:::i;:::-;25724:139;;25622:248;;;:::o;25876:419::-;26042:4;26080:2;26069:9;26065:18;26057:26;;26129:9;26123:4;26119:20;26115:1;26104:9;26100:17;26093:47;26157:131;26283:4;26157:131;:::i;:::-;26149:139;;26047:248;;;:::o;26301:419::-;26467:4;26505:2;26494:9;26490:18;26482:26;;26554:9;26548:4;26544:20;26540:1;26529:9;26525:17;26518:47;26582:131;26708:4;26582:131;:::i;:::-;26574:139;;26472:248;;;:::o;26726:419::-;26892:4;26930:2;26919:9;26915:18;26907:26;;26979:9;26973:4;26969:20;26965:1;26954:9;26950:17;26943:47;27007:131;27133:4;27007:131;:::i;:::-;26999:139;;26897:248;;;:::o;27151:419::-;27317:4;27355:2;27344:9;27340:18;27332:26;;27404:9;27398:4;27394:20;27390:1;27379:9;27375:17;27368:47;27432:131;27558:4;27432:131;:::i;:::-;27424:139;;27322:248;;;:::o;27576:419::-;27742:4;27780:2;27769:9;27765:18;27757:26;;27829:9;27823:4;27819:20;27815:1;27804:9;27800:17;27793:47;27857:131;27983:4;27857:131;:::i;:::-;27849:139;;27747:248;;;:::o;28001:419::-;28167:4;28205:2;28194:9;28190:18;28182:26;;28254:9;28248:4;28244:20;28240:1;28229:9;28225:17;28218:47;28282:131;28408:4;28282:131;:::i;:::-;28274:139;;28172:248;;;:::o;28426:419::-;28592:4;28630:2;28619:9;28615:18;28607:26;;28679:9;28673:4;28669:20;28665:1;28654:9;28650:17;28643:47;28707:131;28833:4;28707:131;:::i;:::-;28699:139;;28597:248;;;:::o;28851:419::-;29017:4;29055:2;29044:9;29040:18;29032:26;;29104:9;29098:4;29094:20;29090:1;29079:9;29075:17;29068:47;29132:131;29258:4;29132:131;:::i;:::-;29124:139;;29022:248;;;:::o;29276:419::-;29442:4;29480:2;29469:9;29465:18;29457:26;;29529:9;29523:4;29519:20;29515:1;29504:9;29500:17;29493:47;29557:131;29683:4;29557:131;:::i;:::-;29549:139;;29447:248;;;:::o;29701:419::-;29867:4;29905:2;29894:9;29890:18;29882:26;;29954:9;29948:4;29944:20;29940:1;29929:9;29925:17;29918:47;29982:131;30108:4;29982:131;:::i;:::-;29974:139;;29872:248;;;:::o;30126:419::-;30292:4;30330:2;30319:9;30315:18;30307:26;;30379:9;30373:4;30369:20;30365:1;30354:9;30350:17;30343:47;30407:131;30533:4;30407:131;:::i;:::-;30399:139;;30297:248;;;:::o;30551:419::-;30717:4;30755:2;30744:9;30740:18;30732:26;;30804:9;30798:4;30794:20;30790:1;30779:9;30775:17;30768:47;30832:131;30958:4;30832:131;:::i;:::-;30824:139;;30722:248;;;:::o;30976:419::-;31142:4;31180:2;31169:9;31165:18;31157:26;;31229:9;31223:4;31219:20;31215:1;31204:9;31200:17;31193:47;31257:131;31383:4;31257:131;:::i;:::-;31249:139;;31147:248;;;:::o;31401:419::-;31567:4;31605:2;31594:9;31590:18;31582:26;;31654:9;31648:4;31644:20;31640:1;31629:9;31625:17;31618:47;31682:131;31808:4;31682:131;:::i;:::-;31674:139;;31572:248;;;:::o;31826:419::-;31992:4;32030:2;32019:9;32015:18;32007:26;;32079:9;32073:4;32069:20;32065:1;32054:9;32050:17;32043:47;32107:131;32233:4;32107:131;:::i;:::-;32099:139;;31997:248;;;:::o;32251:419::-;32417:4;32455:2;32444:9;32440:18;32432:26;;32504:9;32498:4;32494:20;32490:1;32479:9;32475:17;32468:47;32532:131;32658:4;32532:131;:::i;:::-;32524:139;;32422:248;;;:::o;32676:419::-;32842:4;32880:2;32869:9;32865:18;32857:26;;32929:9;32923:4;32919:20;32915:1;32904:9;32900:17;32893:47;32957:131;33083:4;32957:131;:::i;:::-;32949:139;;32847:248;;;:::o;33101:419::-;33267:4;33305:2;33294:9;33290:18;33282:26;;33354:9;33348:4;33344:20;33340:1;33329:9;33325:17;33318:47;33382:131;33508:4;33382:131;:::i;:::-;33374:139;;33272:248;;;:::o;33526:419::-;33692:4;33730:2;33719:9;33715:18;33707:26;;33779:9;33773:4;33769:20;33765:1;33754:9;33750:17;33743:47;33807:131;33933:4;33807:131;:::i;:::-;33799:139;;33697:248;;;:::o;33951:419::-;34117:4;34155:2;34144:9;34140:18;34132:26;;34204:9;34198:4;34194:20;34190:1;34179:9;34175:17;34168:47;34232:131;34358:4;34232:131;:::i;:::-;34224:139;;34122:248;;;:::o;34376:419::-;34542:4;34580:2;34569:9;34565:18;34557:26;;34629:9;34623:4;34619:20;34615:1;34604:9;34600:17;34593:47;34657:131;34783:4;34657:131;:::i;:::-;34649:139;;34547:248;;;:::o;34801:222::-;34894:4;34932:2;34921:9;34917:18;34909:26;;34945:71;35013:1;35002:9;34998:17;34989:6;34945:71;:::i;:::-;34899:124;;;;:::o;35029:129::-;35063:6;35090:20;;:::i;:::-;35080:30;;35119:33;35147:4;35139:6;35119:33;:::i;:::-;35070:88;;;:::o;35164:75::-;35197:6;35230:2;35224:9;35214:19;;35204:35;:::o;35245:307::-;35306:4;35396:18;35388:6;35385:30;35382:2;;;35418:18;;:::i;:::-;35382:2;35456:29;35478:6;35456:29;:::i;:::-;35448:37;;35540:4;35534;35530:15;35522:23;;35311:241;;;:::o;35558:308::-;35620:4;35710:18;35702:6;35699:30;35696:2;;;35732:18;;:::i;:::-;35696:2;35770:29;35792:6;35770:29;:::i;:::-;35762:37;;35854:4;35848;35844:15;35836:23;;35625:241;;;:::o;35872:141::-;35921:4;35944:3;35936:11;;35967:3;35964:1;35957:14;36001:4;35998:1;35988:18;35980:26;;35926:87;;;:::o;36019:98::-;36070:6;36104:5;36098:12;36088:22;;36077:40;;;:::o;36123:99::-;36175:6;36209:5;36203:12;36193:22;;36182:40;;;:::o;36228:168::-;36311:11;36345:6;36340:3;36333:19;36385:4;36380:3;36376:14;36361:29;;36323:73;;;;:::o;36402:169::-;36486:11;36520:6;36515:3;36508:19;36560:4;36555:3;36551:14;36536:29;;36498:73;;;;:::o;36577:148::-;36679:11;36716:3;36701:18;;36691:34;;;;:::o;36731:305::-;36771:3;36790:20;36808:1;36790:20;:::i;:::-;36785:25;;36824:20;36842:1;36824:20;:::i;:::-;36819:25;;36978:1;36910:66;36906:74;36903:1;36900:81;36897:2;;;36984:18;;:::i;:::-;36897:2;37028:1;37025;37021:9;37014:16;;36775:261;;;;:::o;37042:185::-;37082:1;37099:20;37117:1;37099:20;:::i;:::-;37094:25;;37133:20;37151:1;37133:20;:::i;:::-;37128:25;;37172:1;37162:2;;37177:18;;:::i;:::-;37162:2;37219:1;37216;37212:9;37207:14;;37084:143;;;;:::o;37233:348::-;37273:7;37296:20;37314:1;37296:20;:::i;:::-;37291:25;;37330:20;37348:1;37330:20;:::i;:::-;37325:25;;37518:1;37450:66;37446:74;37443:1;37440:81;37435:1;37428:9;37421:17;37417:105;37414:2;;;37525:18;;:::i;:::-;37414:2;37573:1;37570;37566:9;37555:20;;37281:300;;;;:::o;37587:191::-;37627:4;37647:20;37665:1;37647:20;:::i;:::-;37642:25;;37681:20;37699:1;37681:20;:::i;:::-;37676:25;;37720:1;37717;37714:8;37711:2;;;37725:18;;:::i;:::-;37711:2;37770:1;37767;37763:9;37755:17;;37632:146;;;;:::o;37784:96::-;37821:7;37850:24;37868:5;37850:24;:::i;:::-;37839:35;;37829:51;;;:::o;37886:90::-;37920:7;37963:5;37956:13;37949:21;37938:32;;37928:48;;;:::o;37982:149::-;38018:7;38058:66;38051:5;38047:78;38036:89;;38026:105;;;:::o;38137:126::-;38174:7;38214:42;38207:5;38203:54;38192:65;;38182:81;;;:::o;38269:77::-;38306:7;38335:5;38324:16;;38314:32;;;:::o;38352:154::-;38436:6;38431:3;38426;38413:30;38498:1;38489:6;38484:3;38480:16;38473:27;38403:103;;;:::o;38512:307::-;38580:1;38590:113;38604:6;38601:1;38598:13;38590:113;;;38689:1;38684:3;38680:11;38674:18;38670:1;38665:3;38661:11;38654:39;38626:2;38623:1;38619:10;38614:15;;38590:113;;;38721:6;38718:1;38715:13;38712:2;;;38801:1;38792:6;38787:3;38783:16;38776:27;38712:2;38561:258;;;;:::o;38825:320::-;38869:6;38906:1;38900:4;38896:12;38886:22;;38953:1;38947:4;38943:12;38974:18;38964:2;;39030:4;39022:6;39018:17;39008:27;;38964:2;39092;39084:6;39081:14;39061:18;39058:38;39055:2;;;39111:18;;:::i;:::-;39055:2;38876:269;;;;:::o;39151:281::-;39234:27;39256:4;39234:27;:::i;:::-;39226:6;39222:40;39364:6;39352:10;39349:22;39328:18;39316:10;39313:34;39310:62;39307:2;;;39375:18;;:::i;:::-;39307:2;39415:10;39411:2;39404:22;39194:238;;;:::o;39438:233::-;39477:3;39500:24;39518:5;39500:24;:::i;:::-;39491:33;;39546:66;39539:5;39536:77;39533:2;;;39616:18;;:::i;:::-;39533:2;39663:1;39656:5;39652:13;39645:20;;39481:190;;;:::o;39677:176::-;39709:1;39726:20;39744:1;39726:20;:::i;:::-;39721:25;;39760:20;39778:1;39760:20;:::i;:::-;39755:25;;39799:1;39789:2;;39804:18;;:::i;:::-;39789:2;39845:1;39842;39838:9;39833:14;;39711:142;;;;:::o;39859:180::-;39907:77;39904:1;39897:88;40004:4;40001:1;39994:15;40028:4;40025:1;40018:15;40045:180;40093:77;40090:1;40083:88;40190:4;40187:1;40180:15;40214:4;40211:1;40204:15;40231:180;40279:77;40276:1;40269:88;40376:4;40373:1;40366:15;40400:4;40397:1;40390:15;40417:180;40465:77;40462:1;40455:88;40562:4;40559:1;40552:15;40586:4;40583:1;40576:15;40603:180;40651:77;40648:1;40641:88;40748:4;40745:1;40738:15;40772:4;40769:1;40762:15;40789:117;40898:1;40895;40888:12;40912:117;41021:1;41018;41011:12;41035:117;41144:1;41141;41134:12;41158:117;41267:1;41264;41257:12;41281:102;41322:6;41373:2;41369:7;41364:2;41357:5;41353:14;41349:28;41339:38;;41329:54;;;:::o;41389:241::-;41529:34;41525:1;41517:6;41513:14;41506:58;41598:24;41593:2;41585:6;41581:15;41574:49;41495:135;:::o;41636:223::-;41776:34;41772:1;41764:6;41760:14;41753:58;41845:6;41840:2;41832:6;41828:15;41821:31;41742:117;:::o;41865:169::-;42005:21;42001:1;41993:6;41989:14;41982:45;41971:63;:::o;42040:237::-;42180:34;42176:1;42168:6;42164:14;42157:58;42249:20;42244:2;42236:6;42232:15;42225:45;42146:131;:::o;42283:225::-;42423:34;42419:1;42411:6;42407:14;42400:58;42492:8;42487:2;42479:6;42475:15;42468:33;42389:119;:::o;42514:178::-;42654:30;42650:1;42642:6;42638:14;42631:54;42620:72;:::o;42698:246::-;42838:34;42834:1;42826:6;42822:14;42815:58;42907:29;42902:2;42894:6;42890:15;42883:54;42804:140;:::o;42950:223::-;43090:34;43086:1;43078:6;43074:14;43067:58;43159:6;43154:2;43146:6;43142:15;43135:31;43056:117;:::o;43179:175::-;43319:27;43315:1;43307:6;43303:14;43296:51;43285:69;:::o;43360:231::-;43500:34;43496:1;43488:6;43484:14;43477:58;43569:14;43564:2;43556:6;43552:15;43545:39;43466:125;:::o;43597:227::-;43737:34;43733:1;43725:6;43721:14;43714:58;43806:10;43801:2;43793:6;43789:15;43782:35;43703:121;:::o;43830:180::-;43970:32;43966:1;43958:6;43954:14;43947:56;43936:74;:::o;44016:243::-;44156:34;44152:1;44144:6;44140:14;44133:58;44225:26;44220:2;44212:6;44208:15;44201:51;44122:137;:::o;44265:229::-;44405:34;44401:1;44393:6;44389:14;44382:58;44474:12;44469:2;44461:6;44457:15;44450:37;44371:123;:::o;44500:228::-;44640:34;44636:1;44628:6;44624:14;44617:58;44709:11;44704:2;44696:6;44692:15;44685:36;44606:122;:::o;44734:182::-;44874:34;44870:1;44862:6;44858:14;44851:58;44840:76;:::o;44922:230::-;45062:34;45058:1;45050:6;45046:14;45039:58;45131:13;45126:2;45118:6;45114:15;45107:38;45028:124;:::o;45158:231::-;45298:34;45294:1;45286:6;45282:14;45275:58;45367:14;45362:2;45354:6;45350:15;45343:39;45264:125;:::o;45395:228::-;45535:34;45531:1;45523:6;45519:14;45512:58;45604:11;45599:2;45591:6;45587:15;45580:36;45501:122;:::o;45629:182::-;45769:34;45765:1;45757:6;45753:14;45746:58;45735:76;:::o;45817:228::-;45957:34;45953:1;45945:6;45941:14;45934:58;46026:11;46021:2;46013:6;46009:15;46002:36;45923:122;:::o;46051:226::-;46191:34;46187:1;46179:6;46175:14;46168:58;46260:9;46255:2;46247:6;46243:15;46236:34;46157:120;:::o;46283:220::-;46423:34;46419:1;46411:6;46407:14;46400:58;46492:3;46487:2;46479:6;46475:15;46468:28;46389:114;:::o;46509:233::-;46649:34;46645:1;46637:6;46633:14;46626:58;46718:16;46713:2;46705:6;46701:15;46694:41;46615:127;:::o;46748:172::-;46888:24;46884:1;46876:6;46872:14;46865:48;46854:66;:::o;46926:226::-;47066:34;47062:1;47054:6;47050:14;47043:58;47135:9;47130:2;47122:6;47118:15;47111:34;47032:120;:::o;47158:236::-;47298:34;47294:1;47286:6;47282:14;47275:58;47367:19;47362:2;47354:6;47350:15;47343:44;47264:130;:::o;47400:227::-;47540:34;47536:1;47528:6;47524:14;47517:58;47609:10;47604:2;47596:6;47592:15;47585:35;47506:121;:::o;47633:222::-;47773:34;47769:1;47761:6;47757:14;47750:58;47842:5;47837:2;47829:6;47825:15;47818:30;47739:116;:::o;47861:122::-;47934:24;47952:5;47934:24;:::i;:::-;47927:5;47924:35;47914:2;;47973:1;47970;47963:12;47914:2;47904:79;:::o;47989:116::-;48059:21;48074:5;48059:21;:::i;:::-;48052:5;48049:32;48039:2;;48095:1;48092;48085:12;48039:2;48029:76;:::o;48111:120::-;48183:23;48200:5;48183:23;:::i;:::-;48176:5;48173:34;48163:2;;48221:1;48218;48211:12;48163:2;48153:78;:::o;48237:122::-;48310:24;48328:5;48310:24;:::i;:::-;48303:5;48300:35;48290:2;;48349:1;48346;48339:12;48290:2;48280:79;:::o

Swarm Source

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