Token BFH:Unit

 

Overview ERC-721

Total Supply:
0 BFHU

Holders:
554 addresses

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BFHUnit

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-02
*/

// Sources flattened with hardhat v2.0.10 https://hardhat.org

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


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


pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}


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


pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


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


pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

}


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


pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


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


pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File contracts3/roles/Roles.sol


pragma solidity ^0.8.0;

library Roles {
    struct Role {
        mapping(address => bool) bearer;
    }

    function add(Role storage role, address account) internal {
        require(!has(role, account), "role already has the account");
        role.bearer[account] = true;
    }

    function remove(Role storage role, address account) internal {
        require(has(role, account), "role dosen't have the account");
        role.bearer[account] = false;
    }

    function has(Role storage role, address account)
        internal
        view
        returns (bool)
    {
        return role.bearer[account];
    }
}


// File contracts3/roles/ERC173.sol


pragma solidity ^0.8.0;

//import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

/// @title ERC-173 Contract Ownership Standard
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-173.md
///  Note: the ERC-165 identifier for this interface is 0x7f5828d0
/* is ERC165 */
interface IERC173 {
    /// @dev This emits when ownership of a contract changes.
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /// @notice Get the address of the owner
    /// @return The address of the owner.
    function owner() external view returns (address);

    /// @notice Set the address of the new owner of the contract
    /// @param _newOwner The address of the new owner of the contract
    function transferOwnership(address _newOwner) external;
}

abstract contract ERC173 is IERC173 {
    address private _owner;

    constructor() {
        //_registerInterface(0x7f5828d0);
        _transferOwnership(msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner(), "Must be owner");
        _;
    }

    function owner() public view override returns (address) {
        return _owner;
    }

    function transferOwnership(address _newOwner)
        public
        virtual
        override
        onlyOwner()
    {
        _transferOwnership(_newOwner);
    }

    function _transferOwnership(address _newOwner) internal {
        address previousOwner = owner();
        _owner = _newOwner;
        emit OwnershipTransferred(previousOwner, _newOwner);
    }
}


// File contracts3/roles/Operatable.sol


pragma solidity ^0.8.0;


abstract contract Operatable is ERC173 {
    using Roles for Roles.Role;

    event OperatorAdded(address indexed account);
    event OperatorRemoved(address indexed account);

    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;
    Roles.Role private operators;

    constructor() {
        operators.add(msg.sender);
        _paused = false;
    }

    modifier onlyOperator() {
        require(isOperator(msg.sender), "Must be operator");
        _;
    }

    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    function transferOwnership(address _newOwner)
        public
        override
        onlyOperator()
    {
        _transferOwnership(_newOwner);
    }

    function isOperator(address account) public view returns (bool) {
        return operators.has(account);
    }

    function addOperator(address account) public onlyOperator() {
        operators.add(account);
        emit OperatorAdded(account);
    }

    function removeOperator(address account) public onlyOperator() {
        operators.remove(account);
        emit OperatorRemoved(account);
    }

    function paused() public view returns (bool) {
        return _paused;
    }

    function pause() public onlyOperator() whenNotPaused() {
        _paused = true;
        emit Paused(msg.sender);
    }

    function unpause() public onlyOperator() whenPaused() {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}


// File contracts3/token/ERC721TokenPausable.sol


pragma solidity ^0.8.0;


abstract contract ERC721TokenPausable is ERC721, Operatable {
    using Address for address;
    using Roles for Roles.Role;
    Roles.Role private tokenPauser;

    event TokenPauserAdded(address indexed account);
    event TokenPauserRemoved(address indexed account);

    event TokenPaused(uint256 indexed tokenId);
    event TokenUnpaused(uint256 indexed tokenId);

    event SetDefaultTokenPaused(bool defaultTokenPaused);

    // tokenId => bool
    mapping(uint256 => bool) private _tokenPaused;

    bool defaultTokenPaused = false;

    constructor() {
        tokenPauser.add(msg.sender);
    }

    modifier onlyTokenPauser() {
        require(
            isTokenPauser(msg.sender),
            "Only token pauser can call this method"
        );
        _;
    }

    modifier whenNotTokenPaused(uint256 _tokenId) {
        // tokenPauser can do if tokenPaused
        if (!isTokenPauser(msg.sender)) {
            require(!isTokenPaused(_tokenId), "TokenPausable: paused");
        }
        _;
    }

    modifier whenTokenPaused(uint256 _tokenId) {
        require(isTokenPaused(_tokenId), "TokenPausable: not paused");
        _;
    }
    
    function setDefaultTokenPaused(bool _defaultTokenPaused) public onlyOperator {
        defaultTokenPaused = _defaultTokenPaused;
        emit SetDefaultTokenPaused(_defaultTokenPaused);
    }
    
    function isDefaultTokenPaused() public view returns (bool) {
        return defaultTokenPaused;
    }

    function pauseToken(uint256 _tokenId) public onlyTokenPauser() {
        require(!isTokenPaused(_tokenId), "Token is already paused");
        _pauseToken(_tokenId);
    }

    function _pauseToken(uint256 _tokenId) internal {
        _tokenPaused[_tokenId] = true;
        emit TokenPaused(_tokenId);
    }

    function unpauseToken(uint256 _tokenId) public onlyTokenPauser() {
        require(isTokenPaused(_tokenId), "Token is not paused");
        _unpauseToken(_tokenId);
    }

    function _unpauseToken(uint256 _tokenId) internal {
        _tokenPaused[_tokenId] = false;
        emit TokenUnpaused(_tokenId);
    }

    function isTokenPaused(uint256 _tokenId) public view returns (bool) {
        return _tokenPaused[_tokenId];
    }

    function isTokenPauser(address account) public view returns (bool) {
        return tokenPauser.has(account);
    }

    function addTokenPauser(address account) public onlyOperator() {
        require(account.isContract(), "TokenPauser must be contract");
        tokenPauser.add(account);
        emit TokenPauserAdded(account);
    }

    function removeTokenPauser(address account) public onlyOperator() {
        tokenPauser.remove(account);
        emit TokenPauserRemoved(account);
    }

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


// File contracts3/token/ERC721Mintable.sol


pragma solidity ^0.8.0;


interface IERC721Mintable {
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    function exists(uint256 _tokenId) external view returns (bool);

    function mint(address _to, uint256 _tokenId) external;

    function isMinter(address account) external view returns (bool);

    function addMinter(address account) external;

    function removeMinter(address account) external;
}

abstract contract ERC721Mintable is ERC721, IERC721Mintable, Operatable {
    using Roles for Roles.Role;
    Roles.Role private minters;

    constructor() {
        addMinter(msg.sender);
    }

    modifier onlyMinter() {
        require(isMinter(msg.sender), "Must be minter");
        _;
    }

    function isMinter(address account) public view override returns (bool) {
        return minters.has(account);
    }

    function addMinter(address account) public override onlyOperator() {
        minters.add(account);
        emit MinterAdded(account);
    }

    function removeMinter(address account) public override onlyOperator() {
        minters.remove(account);
        emit MinterRemoved(account);
    }

    function exists(uint256 tokenId) public view override returns (bool) {
        return super._exists(tokenId);
    }

    function mint(address to, uint256 tokenId)
        public
        virtual
        override
        onlyMinter()
    {
        super._mint(to, tokenId);
    }
}


// File contracts3/IApprovalProxy.sol

pragma solidity ^0.8.0;

interface IApprovalProxy {
  function setApprovalForAll(address _owner, address _spender, bool _approved) external;
  function isApprovedForAll(address _owner, address _spender, bool _original) external view returns (bool);
}


// File contracts3/BFHUnit.sol

pragma solidity 0.8.1;




contract BFHUnit is ERC721TokenPausable, ERC721Mintable {
    using Address for address;

    event UpdateApprovalProxy(address _newProxyContract);
    IApprovalProxy public approvalProxy;
    string private baseURI;

    constructor(address _approvalProxy) ERC721("BFH:Unit", "BFHU") {
    //constructor(address _approvalProxy) {
    //constructor() ERC721("BFH:Unit", "BFHU") {
        setApprovalProxy(_approvalProxy);
        setBaseURI("https://bravefrontierheroes.com/metadata/units/");
    }

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

    function setBaseURI(string memory baseURI_) public onlyOperator() {
        baseURI = baseURI_;
    }

    function setApprovalProxy(address _new) public onlyOperator() {
        approvalProxy = IApprovalProxy(_new);
        emit UpdateApprovalProxy(_new);
    }

    function setApprovalForAll(address _spender, bool _approved) override public {
        if (address(approvalProxy) != address(0x0) && _spender.isContract()) {
            approvalProxy.setApprovalForAll(msg.sender, _spender, _approved);
        }
        super.setApprovalForAll(_spender, _approved);
    }

    function isApprovedForAll(address _owner, address _spender) override public view returns (bool) {
        bool original = super.isApprovedForAll(_owner, _spender);
        if (address(approvalProxy) != address(0x0)) {
            return approvalProxy.isApprovedForAll(_owner, _spender, original);
        }
        return original;
    }

    //override
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721TokenPausable, ERC721) whenNotPaused() whenNotTokenPaused(tokenId) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_approvalProxy","type":"address"}],"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":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"defaultTokenPaused","type":"bool"}],"name":"SetDefaultTokenPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TokenPauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TokenPauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newProxyContract","type":"address"}],"name":"UpdateApprovalProxy","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addTokenPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approvalProxy","outputs":[{"internalType":"contract IApprovalProxy","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","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":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDefaultTokenPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isTokenPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isTokenPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"pauseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeTokenPauser","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":"_spender","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setApprovalProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_defaultTokenPaused","type":"bool"}],"name":"setDefaultTokenPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unpauseToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a805460ff191690553480156200001b57600080fd5b5060405162002a1738038062002a178339810160408190526200003e9162000428565b60408051808201825260088152671091920e955b9a5d60c21b6020808301918252835180850190945260048452634246485560e01b9084015281519192916200008a9160009162000382565b508051620000a090600190602084019062000382565b505050620000b4336200013660201b60201c565b620000cf3360076200019660201b62000fe31790919060201c565b6006805460ff60a01b19169055620000f560083362000196602090811b62000fe317901c565b6200010033620001f0565b6200010b816200026c565b6200012f6040518060600160405280602f8152602001620029e8602f9139620002ee565b506200050a565b60006200014262000331565b600680546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001a2828262000340565b15620001cb5760405162461bcd60e51b8152600401620001c29062000496565b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b620001fb336200035f565b6200021a5760405162461bcd60e51b8152600401620001c2906200046c565b6200023581600b6200019660201b62000fe31790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b62000277336200035f565b620002965760405162461bcd60e51b8152600401620001c2906200046c565b600c80546001600160a01b0319166001600160a01b0383161790556040517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b790620002e390839062000458565b60405180910390a150565b620002f9336200035f565b620003185760405162461bcd60e51b8152600401620001c2906200046c565b80516200032d90600d90602084019062000382565b5050565b6006546001600160a01b031690565b6001600160a01b03166000908152602091909152604090205460ff1690565b60006200037c8260076200034060201b6200102f1790919060201c565b92915050565b8280546200039090620004cd565b90600052602060002090601f016020900481019282620003b45760008555620003ff565b82601f10620003cf57805160ff1916838001178555620003ff565b82800160010185558215620003ff579182015b82811115620003ff578251825591602001919060010190620003e2565b506200040d92915062000411565b5090565b5b808211156200040d576000815560010162000412565b6000602082840312156200043a578081fd5b81516001600160a01b038116811462000451578182fd5b9392505050565b6001600160a01b0391909116815260200190565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b6020808252601c908201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604082015260600190565b600281046001821680620004e257607f821691505b602082108114156200050457634e487b7160e01b600052602260045260246000fd5b50919050565b6124ce806200051a6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806374db07d811610130578063aa271e1a116100b8578063d64473681161007c578063d644736814610473578063e985e9c514610486578063ed841bf114610499578063f2fde38b146104ac578063fbd395f8146104bf57610227565b8063aa271e1a14610414578063ac8a584a14610427578063b88d4fde1461043a578063c2508c461461044d578063c87b56dd1461046057610227565b806395d89b41116100ff57806395d89b41146103c0578063983b2d56146103c85780639870d7fe146103db5780639bb5c9c3146103ee578063a22cb4651461040157610227565b806374db07d81461038a578063776ab6341461039d5780638456cb59146103b05780638da5cb5b146103b857610227565b806342842e0e116101b357806355f804b31161018257806355f804b3146103295780635c975abb1461033c5780636352211e146103445780636d70f7ae1461035757806370a082311461036a57610227565b806342842e0e146102e857806344734a98146102fb5780634dd09f331461030e5780634f558e791461031657610227565b8063175cf763116101fa578063175cf7631461029f57806323b872dd146102a75780633092afd5146102ba5780633f4ba83a146102cd57806340c10f19146102d557610227565b806301ffc9a71461022c57806306fdde0314610255578063081812fc1461026a578063095ea7b31461028a575b600080fd5b61023f61023a366004611bb9565b6104d2565b60405161024c9190611d1f565b60405180910390f35b61025d61051a565b60405161024c9190611d2a565b61027d610278366004611c37565b6105ac565b60405161024c9190611caa565b61029d610298366004611b58565b6105f8565b005b61023f610695565b61029d6102b5366004611a6e565b61069e565b61029d6102c8366004611a22565b6106d6565b61029d61073d565b61029d6102e3366004611b58565b6107d2565b61029d6102f6366004611a6e565b610805565b61029d610309366004611b81565b610820565b61027d61088e565b61023f610324366004611c37565b61089d565b61029d610337366004611bf1565b6108a8565b61023f6108e0565b61027d610352366004611c37565b6108f0565b61023f610365366004611a22565b610925565b61037d610378366004611a22565b610932565b60405161024c9190612350565b61029d610398366004611a22565b610976565b61029d6103ab366004611c37565b610a0b565b61029d610a61565b61027d610af3565b61025d610b02565b61029d6103d6366004611a22565b610b11565b61029d6103e9366004611a22565b610b78565b61029d6103fc366004611a22565b610bdf565b61029d61040f366004611b22565b610c4f565b61023f610422366004611a22565b610cec565b61029d610435366004611a22565b610cf9565b61029d610448366004611aa9565b610d60565b61029d61045b366004611a22565b610d9f565b61025d61046e366004611c37565b610e06565b61023f610481366004611c37565b610e89565b61023f610494366004611a3c565b610e9e565b61023f6104a7366004611a22565b610f54565b61029d6104ba366004611a22565b610f61565b61029d6104cd366004611c37565b610f8f565b60006001600160e01b031982166380ac58cd60e01b148061050357506001600160e01b03198216635b5e139f60e01b145b8061051257506105128261104e565b90505b919050565b606060008054610529906123c8565b80601f0160208091040260200160405190810160405280929190818152602001828054610555906123c8565b80156105a25780601f10610577576101008083540402835291602001916105a2565b820191906000526020600020905b81548152906001019060200180831161058557829003601f168201915b5050505050905090565b60006105b782611067565b6105dc5760405162461bcd60e51b81526004016105d3906120c7565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610603826108f0565b9050806001600160a01b0316836001600160a01b031614156106375760405162461bcd60e51b81526004016105d3906121e2565b806001600160a01b0316610649611084565b6001600160a01b0316148061066a575061066a81610665611084565b611088565b6106865760405162461bcd60e51b81526004016105d390611f75565b61069083836110b6565b505050565b600a5460ff1690565b6106af6106a9611084565b82611124565b6106cb5760405162461bcd60e51b81526004016105d390612223565b6106908383836111a9565b6106df33610925565b6106fb5760405162461bcd60e51b81526004016105d390611d6b565b610706600b826112d6565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b61074633610925565b6107625760405162461bcd60e51b81526004016105d390611d6b565b600654600160a01b900460ff1661078b5760405162461bcd60e51b81526004016105d390611d3d565b6006805460ff60a01b191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906107c8903390611caa565b60405180910390a1565b6107db33610cec565b6107f75760405162461bcd60e51b81526004016105d3906122ab565b610801828261131e565b5050565b61069083838360405180602001604052806000815250610d60565b61082933610925565b6108455760405162461bcd60e51b81526004016105d390611d6b565b600a805460ff19168215151790556040517fedf46a128f11ef41061cbc776d34f11f530d06579b03cceab02aee9db206bbc190610883908390611d1f565b60405180910390a150565b600c546001600160a01b031681565b600061051282611067565b6108b133610925565b6108cd5760405162461bcd60e51b81526004016105d390611d6b565b805161080190600d9060208401906118fc565b600654600160a01b900460ff1690565b6000818152600260205260408120546001600160a01b0316806105125760405162461bcd60e51b81526004016105d39061201c565b600061051260078361102f565b60006001600160a01b03821661095a5760405162461bcd60e51b81526004016105d390611fd2565b506001600160a01b031660009081526003602052604090205490565b61097f33610925565b61099b5760405162461bcd60e51b81526004016105d390611d6b565b6109ad816001600160a01b03166113fd565b6109c95760405162461bcd60e51b81526004016105d390611f14565b6109d4600882610fe3565b6040516001600160a01b038216907fff12d576e2fecf516eb406e6618d5e97bcc8046690863b984069b15ada11d61290600090a250565b610a1433610f54565b610a305760405162461bcd60e51b81526004016105d39061230a565b610a3981610e89565b610a555760405162461bcd60e51b81526004016105d390612065565b610a5e81611403565b50565b610a6a33610925565b610a865760405162461bcd60e51b81526004016105d390611d6b565b600654600160a01b900460ff1615610ab05760405162461bcd60e51b81526004016105d390611f4b565b6006805460ff60a01b1916600160a01b1790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906107c8903390611caa565b6006546001600160a01b031690565b606060018054610529906123c8565b610b1a33610925565b610b365760405162461bcd60e51b81526004016105d390611d6b565b610b41600b82610fe3565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b610b8133610925565b610b9d5760405162461bcd60e51b81526004016105d390611d6b565b610ba8600782610fe3565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b610be833610925565b610c045760405162461bcd60e51b81526004016105d390611d6b565b600c80546001600160a01b0319166001600160a01b0383161790556040517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b790610883908390611caa565b600c546001600160a01b031615801590610c765750610c76826001600160a01b03166113fd565b15610ce257600c54604051631b3b02e560e11b81526001600160a01b039091169063367605ca90610caf90339086908690600401611cbe565b600060405180830381600087803b158015610cc957600080fd5b505af1158015610cdd573d6000803e3d6000fd5b505050505b6108018282611443565b6000610512600b8361102f565b610d0233610925565b610d1e5760405162461bcd60e51b81526004016105d390611d6b565b610d296007826112d6565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b610d71610d6b611084565b83611124565b610d8d5760405162461bcd60e51b81526004016105d390612223565b610d9984848484611511565b50505050565b610da833610925565b610dc45760405162461bcd60e51b81526004016105d390611d6b565b610dcf6008826112d6565b6040516001600160a01b038216907f2186c7d8e4b2d6a73790355b1a465872175798d2366146e638fc885d54460b8590600090a250565b6060610e1182611067565b610e2d5760405162461bcd60e51b81526004016105d39061215c565b6000610e37611544565b90506000815111610e575760405180602001604052806000815250610e82565b80610e6184611553565b604051602001610e72929190611c7b565b6040516020818303038152906040525b9392505050565b60009081526009602052604090205460ff1690565b600080610eab8484611088565b600c549091506001600160a01b031615610f4b57600c546040516346e67e2960e11b81526001600160a01b0390911690638dccfc5290610ef390879087908690600401611cbe565b60206040518083038186803b158015610f0b57600080fd5b505afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f439190611b9d565b915050610f4e565b90505b92915050565b600061051260088361102f565b610f6a33610925565b610f865760405162461bcd60e51b81526004016105d390611d6b565b610a5e8161166e565b610f9833610f54565b610fb45760405162461bcd60e51b81526004016105d39061230a565b610fbd81610e89565b15610fda5760405162461bcd60e51b81526004016105d390612274565b610a5e816116cc565b610fed828261102f565b1561100a5760405162461bcd60e51b81526004016105d3906121ab565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b03166000908152602091909152604090205460ff1690565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906110eb826108f0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061112f82611067565b61114b5760405162461bcd60e51b81526004016105d390611ec8565b6000611156836108f0565b9050806001600160a01b0316846001600160a01b031614806111915750836001600160a01b0316611186846105ac565b6001600160a01b0316145b806111a157506111a18185611088565b949350505050565b826001600160a01b03166111bc826108f0565b6001600160a01b0316146111e25760405162461bcd60e51b81526004016105d390612113565b6001600160a01b0382166112085760405162461bcd60e51b81526004016105d390611e4d565b61121383838361170f565b61121e6000826110b6565b6001600160a01b0383166000908152600360205260408120805460019290611247908490612385565b90915550506001600160a01b0382166000908152600360205260408120805460019290611275908490612359565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6112e0828261102f565b6112fc5760405162461bcd60e51b81526004016105d3906122d3565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6001600160a01b0382166113445760405162461bcd60e51b81526004016105d390612092565b61134d81611067565b1561136a5760405162461bcd60e51b81526004016105d390611e16565b6113766000838361170f565b6001600160a01b038216600090815260036020526040812080546001929061139f908490612359565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b600081815260096020526040808220805460ff191690555182917f0cfa9cc56bacd896c88effb6a4051b954fcaaf2de7ae98882e39f294ea65184391a250565b61144b611084565b6001600160a01b0316826001600160a01b0316141561147c5760405162461bcd60e51b81526004016105d390611e91565b8060056000611489611084565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556114cd611084565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115059190611d1f565b60405180910390a35050565b61151c8484846111a9565b61152884848484611778565b610d995760405162461bcd60e51b81526004016105d390611dc4565b6060600d8054610529906123c8565b60608161157857506040805180820190915260018152600360fc1b6020820152610515565b8160005b81156115a2578061158c81612403565b915061159b9050600a83612371565b915061157c565b60008167ffffffffffffffff8111156115cb57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115f5576020820181803683370190505b5090505b84156111a15761160a600183612385565b9150611617600a8661241e565b611622906030612359565b60f81b81838151811061164557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611667600a86612371565b94506115f9565b6000611678610af3565b600680546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081815260096020526040808220805460ff191660011790555182917fc2d830ac158eec7b589dfadf012044c95b8646222991556ab4cd311e38bc77d191a250565b600654600160a01b900460ff16156117395760405162461bcd60e51b81526004016105d390611f4b565b8061174333610f54565b61176d5761175081610e89565b1561176d5760405162461bcd60e51b81526004016105d390611d95565b610d99848484611893565b600061178c846001600160a01b03166113fd565b1561188857836001600160a01b031663150b7a026117a8611084565b8786866040518563ffffffff1660e01b81526004016117ca9493929190611ce2565b602060405180830381600087803b1580156117e457600080fd5b505af1925050508015611814575060408051601f3d908101601f1916820190925261181191810190611bd5565b60015b61186e573d808015611842576040519150601f19603f3d011682016040523d82523d6000602084013e611847565b606091505b5080516118665760405162461bcd60e51b81526004016105d390611dc4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506111a1565b506001949350505050565b600654600160a01b900460ff16156118bd5760405162461bcd60e51b81526004016105d390611f4b565b806118c733610f54565b6118f1576118d481610e89565b156118f15760405162461bcd60e51b81526004016105d390611d95565b610d99848484610690565b828054611908906123c8565b90600052602060002090601f01602090048101928261192a5760008555611970565b82601f1061194357805160ff1916838001178555611970565b82800160010185558215611970579182015b82811115611970578251825591602001919060010190611955565b5061197c929150611980565b5090565b5b8082111561197c5760008155600101611981565b600067ffffffffffffffff808411156119b0576119b061245e565b604051601f8501601f19908116603f011681019082821181831017156119d8576119d861245e565b816040528093508581528686860111156119f157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461051557600080fd5b600060208284031215611a33578081fd5b610e8282611a0b565b60008060408385031215611a4e578081fd5b611a5783611a0b565b9150611a6560208401611a0b565b90509250929050565b600080600060608486031215611a82578081fd5b611a8b84611a0b565b9250611a9960208501611a0b565b9150604084013590509250925092565b60008060008060808587031215611abe578081fd5b611ac785611a0b565b9350611ad560208601611a0b565b925060408501359150606085013567ffffffffffffffff811115611af7578182fd5b8501601f81018713611b07578182fd5b611b1687823560208401611995565b91505092959194509250565b60008060408385031215611b34578182fd5b611b3d83611a0b565b91506020830135611b4d81612474565b809150509250929050565b60008060408385031215611b6a578182fd5b611b7383611a0b565b946020939093013593505050565b600060208284031215611b92578081fd5b8135610f4b81612474565b600060208284031215611bae578081fd5b8151610f4b81612474565b600060208284031215611bca578081fd5b8135610f4b81612482565b600060208284031215611be6578081fd5b8151610f4b81612482565b600060208284031215611c02578081fd5b813567ffffffffffffffff811115611c18578182fd5b8201601f81018413611c28578182fd5b6111a184823560208401611995565b600060208284031215611c48578081fd5b5035919050565b60008151808452611c6781602086016020860161239c565b601f01601f19169290920160200192915050565b60008351611c8d81846020880161239c565b835190830190611ca181836020880161239c565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611d1590830184611c4f565b9695505050505050565b901515815260200190565b600060208252610e826020830184611c4f565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b602080825260159082015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601c908201527f546f6b656e506175736572206d75737420626520636f6e747261637400000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b602080825260139082015272151bdad95b881a5cc81b9bdd081c185d5cd959606a1b604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601c908201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526017908201527f546f6b656e20697320616c726561647920706175736564000000000000000000604082015260600190565b6020808252600e908201526d26bab9ba1031329036b4b73a32b960911b604082015260600190565b6020808252601d908201527f726f6c6520646f73656e2774206861766520746865206163636f756e74000000604082015260600190565b60208082526026908201527f4f6e6c7920746f6b656e207061757365722063616e2063616c6c2074686973206040820152651b595d1a1bd960d21b606082015260800190565b90815260200190565b6000821982111561236c5761236c612432565b500190565b60008261238057612380612448565b500490565b60008282101561239757612397612432565b500390565b60005b838110156123b757818101518382015260200161239f565b83811115610d995750506000910152565b6002810460018216806123dc57607f821691505b602082108114156123fd57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561241757612417612432565b5060010190565b60008261242d5761242d612448565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610a5e57600080fd5b6001600160e01b031981168114610a5e57600080fdfea26469706673582212202cd9d846124b8a73963b4096566e9073f79190bce97d70db732aa704d11101fc64736f6c6343000801003368747470733a2f2f627261766566726f6e746965726865726f65732e636f6d2f6d657461646174612f756e6974732f000000000000000000000000fe5e8baaa93bb559142593b6402595f493a79a68

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

000000000000000000000000fe5e8baaa93bb559142593b6402595f493a79a68

-----Decoded View---------------
Arg [0] : _approvalProxy (address): 0xfe5e8baaa93bb559142593b6402595f493a79a68

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fe5e8baaa93bb559142593b6402595f493a79a68


Deployed ByteCode Sourcemap

42723:1861:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21707:292;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22639:100;;;:::i;:::-;;;;;;;:::i;24106:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23636:404::-;;;;;;:::i;:::-;;:::i;:::-;;39131:103;;;:::i;24996:305::-;;;;;;:::i;:::-;;:::i;41899:150::-;;;;;;:::i;:::-;;:::i;37504:124::-;;;:::i;42182:164::-;;;;;;:::i;:::-;;:::i;25372:151::-;;;;;;:::i;:::-;;:::i;38925:194::-;;;;;;:::i;:::-;;:::i;42879:35::-;;;:::i;42057:117::-;;;;;;:::i;:::-;;:::i;43349:103::-;;;;;;:::i;:::-;;:::i;37288:78::-;;;:::i;22333:239::-;;;;;;:::i;:::-;;:::i;36866:112::-;;;;;;:::i;:::-;;:::i;22063:208::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40141:219::-;;;;;;:::i;:::-;;:::i;39565:173::-;;;;;;:::i;:::-;;:::i;37374:122::-;;;:::i;35411:88::-;;;:::i;22808:104::-;;;:::i;41749:142::-;;;;;;:::i;:::-;;:::i;36986:139::-;;;;;;:::i;:::-;;:::i;43460:158::-;;;;;;:::i;:::-;;:::i;43626:310::-;;;;;;:::i;:::-;;:::i;41624:117::-;;;;;;:::i;:::-;;:::i;37133:147::-;;;;;;:::i;:::-;;:::i;25594:285::-;;;;;;:::i;:::-;;:::i;40368:155::-;;;;;;:::i;:::-;;:::i;22983:360::-;;;;;;:::i;:::-;;:::i;39892:116::-;;;;;;:::i;:::-;;:::i;43944:343::-;;;;;;:::i;:::-;;:::i;40016:117::-;;;;;;:::i;:::-;;:::i;36701:157::-;;;;;;:::i;:::-;;:::i;39242:174::-;;;;;;:::i;:::-;;:::i;21707:292::-;21809:4;-1:-1:-1;;;;;;21833:40:0;;-1:-1:-1;;;21833:40:0;;:105;;-1:-1:-1;;;;;;;21890:48:0;;-1:-1:-1;;;21890:48:0;21833:105;:158;;;;21955:36;21979:11;21955:23;:36::i;:::-;21826:165;;21707:292;;;;:::o;22639:100::-;22693:13;22726:5;22719:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22639:100;:::o;24106:221::-;24182:7;24210:16;24218:7;24210;:16::i;:::-;24202:73;;;;-1:-1:-1;;;24202:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;24295:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24295:24:0;;24106:221::o;23636:404::-;23717:13;23733:23;23748:7;23733:14;:23::i;:::-;23717:39;;23781:5;-1:-1:-1;;;;;23775:11:0;:2;-1:-1:-1;;;;;23775:11:0;;;23767:57;;;;-1:-1:-1;;;23767:57:0;;;;;;;:::i;:::-;23861:5;-1:-1:-1;;;;;23845:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23845:21:0;;:69;;;;23870:44;23894:5;23901:12;:10;:12::i;:::-;23870:23;:44::i;:::-;23837:161;;;;-1:-1:-1;;;23837:161:0;;;;;;;:::i;:::-;24011:21;24020:2;24024:7;24011:8;:21::i;:::-;23636:404;;;:::o;39131:103::-;39208:18;;;;39131:103;:::o;24996:305::-;25157:41;25176:12;:10;:12::i;:::-;25190:7;25157:18;:41::i;:::-;25149:103;;;;-1:-1:-1;;;25149:103:0;;;;;;;:::i;:::-;25265:28;25275:4;25281:2;25285:7;25265:9;:28::i;41899:150::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;41980:23:::1;:7;41995::::0;41980:14:::1;:23::i;:::-;42019:22;::::0;-1:-1:-1;;;;;42019:22:0;::::1;::::0;::::1;::::0;;;::::1;41899:150:::0;:::o;37504:124::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;36641:7:::1;::::0;-1:-1:-1;;;36641:7:0;::::1;;;36633:40;;;;-1:-1:-1::0;;;36633:40:0::1;;;;;;;:::i;:::-;37569:7:::2;:15:::0;;-1:-1:-1;;;;37569:15:0::2;::::0;;37600:20:::2;::::0;::::2;::::0;::::2;::::0;37609:10:::2;::::0;37600:20:::2;:::i;:::-;;;;;;;;37504:124::o:0;42182:164::-;41557:20;41566:10;41557:8;:20::i;:::-;41549:47;;;;-1:-1:-1;;;41549:47:0;;;;;;;:::i;:::-;42314:24:::1;42326:2;42330:7;42314:11;:24::i;:::-;42182:164:::0;;:::o;25372:151::-;25476:39;25493:4;25499:2;25503:7;25476:39;;;;;;;;;;;;:16;:39::i;38925:194::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;39013:18:::1;:40:::0;;-1:-1:-1;;39013:40:0::1;::::0;::::1;;;::::0;;39069:42:::1;::::0;::::1;::::0;::::1;::::0;39013:40;;39069:42:::1;:::i;:::-;;;;;;;;38925:194:::0;:::o;42879:35::-;;;-1:-1:-1;;;;;42879:35:0;;:::o;42057:117::-;42120:4;42144:22;42158:7;42144:13;:22::i;43349:103::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;43426:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;37288:78::-:0;37351:7;;-1:-1:-1;;;37351:7:0;;;;;37288:78::o;22333:239::-;22405:7;22441:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22441:16:0;22476:19;22468:73;;;;-1:-1:-1;;;22468:73:0;;;;;;;:::i;36866:112::-;36924:4;36948:22;:9;36962:7;36948:13;:22::i;22063:208::-;22135:7;-1:-1:-1;;;;;22163:19:0;;22155:74;;;;-1:-1:-1;;;22155:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22247:16:0;;;;;:9;:16;;;;;;;22063:208::o;40141:219::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;40223:20:::1;:7;-1:-1:-1::0;;;;;40223:18:0::1;;:20::i;:::-;40215:61;;;;-1:-1:-1::0;;;40215:61:0::1;;;;;;;:::i;:::-;40287:24;:11;40303:7:::0;40287:15:::1;:24::i;:::-;40327:25;::::0;-1:-1:-1;;;;;40327:25:0;::::1;::::0;::::1;::::0;;;::::1;40141:219:::0;:::o;39565:173::-;38412:25;38426:10;38412:13;:25::i;:::-;38390:113;;;;-1:-1:-1;;;38390:113:0;;;;;;;:::i;:::-;39649:23:::1;39663:8;39649:13;:23::i;:::-;39641:55;;;;-1:-1:-1::0;;;39641:55:0::1;;;;;;;:::i;:::-;39707:23;39721:8;39707:13;:23::i;:::-;39565:173:::0;:::o;37374:122::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;36544:7:::1;::::0;-1:-1:-1;;;36544:7:0;::::1;;;36543:8;36535:37;;;;-1:-1:-1::0;;;36535:37:0::1;;;;;;;:::i;:::-;37440:7:::2;:14:::0;;-1:-1:-1;;;;37440:14:0::2;-1:-1:-1::0;;;37440:14:0::2;::::0;;37470:18:::2;::::0;::::2;::::0;::::2;::::0;37477:10:::2;::::0;37470:18:::2;:::i;35411:88::-:0;35485:6;;-1:-1:-1;;;;;35485:6:0;35411:88;:::o;22808:104::-;22864:13;22897:7;22890:14;;;;;:::i;41749:142::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;41827:20:::1;:7;41839::::0;41827:11:::1;:20::i;:::-;41863;::::0;-1:-1:-1;;;;;41863:20:0;::::1;::::0;::::1;::::0;;;::::1;41749:142:::0;:::o;36986:139::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;37057:22:::1;:9;37071:7:::0;37057:13:::1;:22::i;:::-;37095;::::0;-1:-1:-1;;;;;37095:22:0;::::1;::::0;::::1;::::0;;;::::1;36986:139:::0;:::o;43460:158::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;43533:13:::1;:36:::0;;-1:-1:-1;;;;;;43533:36:0::1;-1:-1:-1::0;;;;;43533:36:0;::::1;;::::0;;43585:25:::1;::::0;::::1;::::0;::::1;::::0;43533:36;;43585:25:::1;:::i;43626:310::-:0;43726:13;;-1:-1:-1;;;;;43726:13:0;43718:38;;;;:63;;;43760:21;:8;-1:-1:-1;;;;;43760:19:0;;:21::i;:::-;43714:160;;;43798:13;;:64;;-1:-1:-1;;;43798:64:0;;-1:-1:-1;;;;;43798:13:0;;;;:31;;:64;;43830:10;;43842:8;;43852:9;;43798:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43714:160;43884:44;43908:8;43918:9;43884:23;:44::i;41624:117::-;41689:4;41713:20;:7;41725;41713:11;:20::i;37133:147::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;37207:25:::1;:9;37224:7:::0;37207:16:::1;:25::i;:::-;37248:24;::::0;-1:-1:-1;;;;;37248:24:0;::::1;::::0;::::1;::::0;;;::::1;37133:147:::0;:::o;25594:285::-;25726:41;25745:12;:10;:12::i;:::-;25759:7;25726:18;:41::i;:::-;25718:103;;;;-1:-1:-1;;;25718:103:0;;;;;;;:::i;:::-;25832:39;25846:4;25852:2;25856:7;25865:5;25832:13;:39::i;:::-;25594:285;;;;:::o;40368:155::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;40445:27:::1;:11;40464:7:::0;40445:18:::1;:27::i;:::-;40488;::::0;-1:-1:-1;;;;;40488:27:0;::::1;::::0;::::1;::::0;;;::::1;40368:155:::0;:::o;22983:360::-;23056:13;23090:16;23098:7;23090;:16::i;:::-;23082:76;;;;-1:-1:-1;;;23082:76:0;;;;;;;:::i;:::-;23171:21;23195:10;:8;:10::i;:::-;23171:34;;23247:1;23229:7;23223:21;:25;:112;;;;;;;;;;;;;;;;;23288:7;23297:18;:7;:16;:18::i;:::-;23271:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23223:112;23216:119;22983:360;-1:-1:-1;;;22983:360:0:o;39892:116::-;39954:4;39978:22;;;:12;:22;;;;;;;;;39892:116::o;43944:343::-;44034:4;44051:13;44067:40;44090:6;44098:8;44067:22;:40::i;:::-;44130:13;;44051:56;;-1:-1:-1;;;;;;44130:13:0;44122:38;44118:136;;44184:13;;:58;;-1:-1:-1;;;44184:58:0;;-1:-1:-1;;;;;44184:13:0;;;;:30;;:58;;44215:6;;44223:8;;44233;;44184:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44177:65;;;;;44118:136;44271:8;-1:-1:-1;43944:343:0;;;;;:::o;40016:117::-;40077:4;40101:24;:11;40117:7;40101:15;:24::i;36701:157::-;36428:22;36439:10;36428;:22::i;:::-;36420:51;;;;-1:-1:-1;;;36420:51:0;;;;;;;:::i;:::-;36821:29:::1;36840:9;36821:18;:29::i;39242:174::-:0;38412:25;38426:10;38412:13;:25::i;:::-;38390:113;;;;-1:-1:-1;;;38390:113:0;;;;;;;:::i;:::-;39325:23:::1;39339:8;39325:13;:23::i;:::-;39324:24;39316:60;;;;-1:-1:-1::0;;;39316:60:0::1;;;;;;;:::i;:::-;39387:21;39399:8;39387:11;:21::i;33685:175::-:0;33763:18;33767:4;33773:7;33763:3;:18::i;:::-;33762:19;33754:60;;;;-1:-1:-1;;;33754:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33825:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;33825:27:0;33848:4;33825:27;;;33685:175::o;34055:156::-;-1:-1:-1;;;;;34183:20:0;34154:4;34183:20;;;;;;;;;;;;;;;34055:156::o;20199:157::-;-1:-1:-1;;;;;;20308:40:0;;-1:-1:-1;;;20308:40:0;20199:157;;;:::o;27346:127::-;27411:4;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;:30;;;27346:127::o;16979:98::-;17059:10;16979:98;:::o;24765:164::-;-1:-1:-1;;;;;24886:25:0;;;24862:4;24886:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24765:164::o;31230:174::-;31305:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31305:29:0;-1:-1:-1;;;;;31305:29:0;;;;;;;;:24;;31359:23;31305:24;31359:14;:23::i;:::-;-1:-1:-1;;;;;31350:46:0;;;;;;;;;;;31230:174;;:::o;27640:355::-;27733:4;27758:16;27766:7;27758;:16::i;:::-;27750:73;;;;-1:-1:-1;;;27750:73:0;;;;;;;:::i;:::-;27834:13;27850:23;27865:7;27850:14;:23::i;:::-;27834:39;;27903:5;-1:-1:-1;;;;;27892:16:0;:7;-1:-1:-1;;;;;27892:16:0;;:51;;;;27936:7;-1:-1:-1;;;;;27912:31:0;:20;27924:7;27912:11;:20::i;:::-;-1:-1:-1;;;;;27912:31:0;;27892:51;:94;;;;27947:39;27971:5;27978:7;27947:23;:39::i;:::-;27884:103;27640:355;-1:-1:-1;;;;27640:355:0:o;30568:544::-;30693:4;-1:-1:-1;;;;;30666:31:0;:23;30681:7;30666:14;:23::i;:::-;-1:-1:-1;;;;;30666:31:0;;30658:85;;;;-1:-1:-1;;;30658:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30762:16:0;;30754:65;;;;-1:-1:-1;;;30754:65:0;;;;;;;:::i;:::-;30832:39;30853:4;30859:2;30863:7;30832:20;:39::i;:::-;30936:29;30953:1;30957:7;30936:8;:29::i;:::-;-1:-1:-1;;;;;30978:15:0;;;;;;:9;:15;;;;;:20;;30997:1;;30978:15;:20;;30997:1;;30978:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31009:13:0;;;;;;:9;:13;;;;;:18;;31026:1;;31009:13;:18;;31026:1;;31009:18;:::i;:::-;;;;-1:-1:-1;;31038:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31038:21:0;-1:-1:-1;;;;;31038:21:0;;;;;;;;;31077:27;;31038:16;;31077:27;;;;;;;30568:544;;;:::o;33868:179::-;33948:18;33952:4;33958:7;33948:3;:18::i;:::-;33940:60;;;;-1:-1:-1;;;33940:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34011:20:0;34034:5;34011:20;;;;;;;;;;;:28;;-1:-1:-1;;34011:28:0;;;33868:179::o;29260:382::-;-1:-1:-1;;;;;29340:16:0;;29332:61;;;;-1:-1:-1;;;29332:61:0;;;;;;;:::i;:::-;29413:16;29421:7;29413;:16::i;:::-;29412:17;29404:58;;;;-1:-1:-1;;;29404:58:0;;;;;;;:::i;:::-;29475:45;29504:1;29508:2;29512:7;29475:20;:45::i;:::-;-1:-1:-1;;;;;29533:13:0;;;;;;:9;:13;;;;;:18;;29550:1;;29533:13;:18;;29550:1;;29533:18;:::i;:::-;;;;-1:-1:-1;;29562:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29562:21:0;-1:-1:-1;;;;;29562:21:0;;;;;;;;29601:33;;29562:16;;;29601:33;;29562:16;;29601:33;29260:382;;:::o;9090:422::-;9457:20;9496:8;;;9090:422::o;39746:138::-;39832:5;39807:22;;;:12;:22;;;;;;:30;;-1:-1:-1;;39807:30:0;;;39853:23;39820:8;;39853:23;;;39746:138;:::o;24399:295::-;24514:12;:10;:12::i;:::-;-1:-1:-1;;;;;24502:24:0;:8;-1:-1:-1;;;;;24502:24:0;;;24494:62;;;;-1:-1:-1;;;24494:62:0;;;;;;;:::i;:::-;24614:8;24569:18;:32;24588:12;:10;:12::i;:::-;-1:-1:-1;;;;;24569:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24569:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;24569:53:0;;;;;;;;;;;24653:12;:10;:12::i;:::-;-1:-1:-1;;;;;24638:48:0;;24677:8;24638:48;;;;;;:::i;:::-;;;;;;;;24399:295;;:::o;26761:272::-;26875:28;26885:4;26891:2;26895:7;26875:9;:28::i;:::-;26922:48;26945:4;26951:2;26955:7;26964:5;26922:22;:48::i;:::-;26914:111;;;;-1:-1:-1;;;26914:111:0;;;;;;;:::i;43241:100::-;43293:13;43326:7;43319:14;;;;;:::i;17640:723::-;17696:13;17917:10;17913:53;;-1:-1:-1;17944:10:0;;;;;;;;;;;;-1:-1:-1;;;17944:10:0;;;;;;17913:53;17991:5;17976:12;18032:78;18039:9;;18032:78;;18065:8;;;;:::i;:::-;;-1:-1:-1;18088:10:0;;-1:-1:-1;18096:2:0;18088:10;;:::i;:::-;;;18032:78;;;18120:19;18152:6;18142:17;;;;;;-1:-1:-1;;;18142:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18142:17:0;;18120:39;;18170:154;18177:10;;18170:154;;18204:11;18214:1;18204:11;;:::i;:::-;;-1:-1:-1;18273:10:0;18281:2;18273:5;:10;:::i;:::-;18260:24;;:2;:24;:::i;:::-;18247:39;;18230:6;18237;18230:14;;;;;;-1:-1:-1;;;18230:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18230:56:0;;;;;;;;-1:-1:-1;18301:11:0;18310:2;18301:11;;:::i;:::-;;;18170:154;;35686:197;35753:21;35777:7;:5;:7::i;:::-;35795:6;:18;;-1:-1:-1;;;;;;35795:18:0;-1:-1:-1;;;;;35795:18:0;;;;;;;;;35829:46;;35753:31;;-1:-1:-1;35795:18:0;35829:46;;;;;;-1:-1:-1;;35829:46:0;35686:197;;:::o;39424:133::-;39483:22;;;;:12;:22;;;;;;:29;;-1:-1:-1;;39483:29:0;39508:4;39483:29;;;39528:21;39496:8;;39528:21;;;39424:133;:::o;44311:270::-;36544:7;;-1:-1:-1;;;36544:7:0;;;;36543:8;36535:37;;;;-1:-1:-1;;;36535:37:0;;;;;;;:::i;:::-;44508:7:::1;38639:25;38653:10;38639:13;:25::i;:::-;38634:117;;38690:23;38704:8;38690:13;:23::i;:::-;38689:24;38681:58;;;;-1:-1:-1::0;;;38681:58:0::1;;;;;;;:::i;:::-;44528:45:::2;44555:4;44561:2;44565:7;44528:26;:45::i;31969:843::-:0;32090:4;32116:15;:2;-1:-1:-1;;;;;32116:13:0;;:15::i;:::-;32112:693;;;32168:2;-1:-1:-1;;;;;32152:36:0;;32189:12;:10;:12::i;:::-;32203:4;32209:7;32218:5;32152:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32152:72:0;;;;;;;;-1:-1:-1;;32152:72:0;;;;;;;;;;;;:::i;:::-;;;32148:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32398:13:0;;32394:341;;32441:60;;-1:-1:-1;;;32441:60:0;;;;;;;:::i;32394:341::-;32685:6;32679:13;32670:6;32666:2;32662:15;32655:38;32148:602;-1:-1:-1;;;;;;32275:55:0;-1:-1:-1;;;32275:55:0;;-1:-1:-1;32268:62:0;;32112:693;-1:-1:-1;32789:4:0;31969:843;;;;;;:::o;40531:241::-;36544:7;;-1:-1:-1;;;36544:7:0;;;;36543:8;36535:37;;;;-1:-1:-1;;;36535:37:0;;;;;;;:::i;:::-;40699:7:::1;38639:25;38653:10;38639:13;:25::i;:::-;38634:117;;38690:23;38704:8;38690:13;:23::i;:::-;38689:24;38681:58;;;;-1:-1:-1::0;;;38681:58:0::1;;;;;;;:::i;:::-;40719:45:::2;40746:4;40752:2;40756:7;40719:26;:45::i;-1:-1:-1:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:633:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;232:2;226:9;200:2;286:15;;-1:-1:-1;;282:24:1;;;308:2;278:33;274:42;262:55;;;332:18;;;352:22;;;329:46;326:2;;;378:18;;:::i;:::-;418:10;414:2;407:22;447:6;438:15;;477:6;469;462:22;517:3;508:6;503:3;499:16;496:25;493:2;;;534:1;531;524:12;493:2;584:6;579:3;572:4;564:6;560:17;547:44;639:1;632:4;623:6;615;611:19;607:30;600:41;;;;90:557;;;;;:::o;652:175::-;722:20;;-1:-1:-1;;;;;771:31:1;;761:42;;751:2;;817:1;814;807:12;832:198;;944:2;932:9;923:7;919:23;915:32;912:2;;;965:6;957;950:22;912:2;993:31;1014:9;993:31;:::i;1035:274::-;;;1164:2;1152:9;1143:7;1139:23;1135:32;1132:2;;;1185:6;1177;1170:22;1132:2;1213:31;1234:9;1213:31;:::i;:::-;1203:41;;1263:40;1299:2;1288:9;1284:18;1263:40;:::i;:::-;1253:50;;1122:187;;;;;:::o;1314:342::-;;;;1460:2;1448:9;1439:7;1435:23;1431:32;1428:2;;;1481:6;1473;1466:22;1428:2;1509:31;1530:9;1509:31;:::i;:::-;1499:41;;1559:40;1595:2;1584:9;1580:18;1559:40;:::i;:::-;1549:50;;1646:2;1635:9;1631:18;1618:32;1608:42;;1418:238;;;;;:::o;1661:702::-;;;;;1833:3;1821:9;1812:7;1808:23;1804:33;1801:2;;;1855:6;1847;1840:22;1801:2;1883:31;1904:9;1883:31;:::i;:::-;1873:41;;1933:40;1969:2;1958:9;1954:18;1933:40;:::i;:::-;1923:50;;2020:2;2009:9;2005:18;1992:32;1982:42;;2075:2;2064:9;2060:18;2047:32;2102:18;2094:6;2091:30;2088:2;;;2139:6;2131;2124:22;2088:2;2167:22;;2220:4;2212:13;;2208:27;-1:-1:-1;2198:2:1;;2254:6;2246;2239:22;2198:2;2282:75;2349:7;2344:2;2331:16;2326:2;2322;2318:11;2282:75;:::i;:::-;2272:85;;;1791:572;;;;;;;:::o;2368:329::-;;;2494:2;2482:9;2473:7;2469:23;2465:32;2462:2;;;2515:6;2507;2500:22;2462:2;2543:31;2564:9;2543:31;:::i;:::-;2533:41;;2624:2;2613:9;2609:18;2596:32;2637:30;2661:5;2637:30;:::i;:::-;2686:5;2676:15;;;2452:245;;;;;:::o;2702:266::-;;;2831:2;2819:9;2810:7;2806:23;2802:32;2799:2;;;2852:6;2844;2837:22;2799:2;2880:31;2901:9;2880:31;:::i;:::-;2870:41;2958:2;2943:18;;;;2930:32;;-1:-1:-1;;;2789:179:1:o;2973:253::-;;3082:2;3070:9;3061:7;3057:23;3053:32;3050:2;;;3103:6;3095;3088:22;3050:2;3147:9;3134:23;3166:30;3190:5;3166:30;:::i;3231:257::-;;3351:2;3339:9;3330:7;3326:23;3322:32;3319:2;;;3372:6;3364;3357:22;3319:2;3409:9;3403:16;3428:30;3452:5;3428:30;:::i;3493:257::-;;3604:2;3592:9;3583:7;3579:23;3575:32;3572:2;;;3625:6;3617;3610:22;3572:2;3669:9;3656:23;3688:32;3714:5;3688:32;:::i;3755:261::-;;3877:2;3865:9;3856:7;3852:23;3848:32;3845:2;;;3898:6;3890;3883:22;3845:2;3935:9;3929:16;3954:32;3980:5;3954:32;:::i;4021:482::-;;4143:2;4131:9;4122:7;4118:23;4114:32;4111:2;;;4164:6;4156;4149:22;4111:2;4209:9;4196:23;4242:18;4234:6;4231:30;4228:2;;;4279:6;4271;4264:22;4228:2;4307:22;;4360:4;4352:13;;4348:27;-1:-1:-1;4338:2:1;;4394:6;4386;4379:22;4338:2;4422:75;4489:7;4484:2;4471:16;4466:2;4462;4458:11;4422:75;:::i;4508:190::-;;4620:2;4608:9;4599:7;4595:23;4591:32;4588:2;;;4641:6;4633;4626:22;4588:2;-1:-1:-1;4669:23:1;;4578:120;-1:-1:-1;4578:120:1:o;4703:259::-;;4784:5;4778:12;4811:6;4806:3;4799:19;4827:63;4883:6;4876:4;4871:3;4867:14;4860:4;4853:5;4849:16;4827:63;:::i;:::-;4944:2;4923:15;-1:-1:-1;;4919:29:1;4910:39;;;;4951:4;4906:50;;4754:208;-1:-1:-1;;4754:208:1:o;4967:470::-;;5184:6;5178:13;5200:53;5246:6;5241:3;5234:4;5226:6;5222:17;5200:53;:::i;:::-;5316:13;;5275:16;;;;5338:57;5316:13;5275:16;5372:4;5360:17;;5338:57;:::i;:::-;5411:20;;5154:283;-1:-1:-1;;;;5154:283:1:o;5442:203::-;-1:-1:-1;;;;;5606:32:1;;;;5588:51;;5576:2;5561:18;;5543:102::o;5650:385::-;-1:-1:-1;;;;;5902:15:1;;;5884:34;;5954:15;;;;5949:2;5934:18;;5927:43;6013:14;;6006:22;6001:2;5986:18;;5979:50;5834:2;5819:18;;5801:234::o;6040:490::-;-1:-1:-1;;;;;6309:15:1;;;6291:34;;6361:15;;6356:2;6341:18;;6334:43;6408:2;6393:18;;6386:34;;;6456:3;6451:2;6436:18;;6429:31;;;6040:490;;6477:47;;6504:19;;6496:6;6477:47;:::i;:::-;6469:55;6243:287;-1:-1:-1;;;;;;6243:287:1:o;6535:187::-;6700:14;;6693:22;6675:41;;6663:2;6648:18;;6630:92::o;6958:221::-;;7107:2;7096:9;7089:21;7127:46;7169:2;7158:9;7154:18;7146:6;7127:46;:::i;7184:344::-;7386:2;7368:21;;;7425:2;7405:18;;;7398:30;-1:-1:-1;;;7459:2:1;7444:18;;7437:50;7519:2;7504:18;;7358:170::o;7533:340::-;7735:2;7717:21;;;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7808:2:1;7793:18;;7786:46;7864:2;7849:18;;7707:166::o;7878:345::-;8080:2;8062:21;;;8119:2;8099:18;;;8092:30;-1:-1:-1;;;8153:2:1;8138:18;;8131:51;8214:2;8199:18;;8052:171::o;8228:414::-;8430:2;8412:21;;;8469:2;8449:18;;;8442:30;8508:34;8503:2;8488:18;;8481:62;-1:-1:-1;;;8574:2:1;8559:18;;8552:48;8632:3;8617:19;;8402:240::o;8647:352::-;8849:2;8831:21;;;8888:2;8868:18;;;8861:30;8927;8922:2;8907:18;;8900:58;8990:2;8975:18;;8821:178::o;9004:400::-;9206:2;9188:21;;;9245:2;9225:18;;;9218:30;9284:34;9279:2;9264:18;;9257:62;-1:-1:-1;;;9350:2:1;9335:18;;9328:34;9394:3;9379:19;;9178:226::o;9409:349::-;9611:2;9593:21;;;9650:2;9630:18;;;9623:30;9689:27;9684:2;9669:18;;9662:55;9749:2;9734:18;;9583:175::o;9763:408::-;9965:2;9947:21;;;10004:2;9984:18;;;9977:30;10043:34;10038:2;10023:18;;10016:62;-1:-1:-1;;;10109:2:1;10094:18;;10087:42;10161:3;10146:19;;9937:234::o;10176:352::-;10378:2;10360:21;;;10417:2;10397:18;;;10390:30;10456;10451:2;10436:18;;10429:58;10519:2;10504:18;;10350:178::o;10533:340::-;10735:2;10717:21;;;10774:2;10754:18;;;10747:30;-1:-1:-1;;;10808:2:1;10793:18;;10786:46;10864:2;10849:18;;10707:166::o;10878:420::-;11080:2;11062:21;;;11119:2;11099:18;;;11092:30;11158:34;11153:2;11138:18;;11131:62;11229:26;11224:2;11209:18;;11202:54;11288:3;11273:19;;11052:246::o;11303:406::-;11505:2;11487:21;;;11544:2;11524:18;;;11517:30;11583:34;11578:2;11563:18;;11556:62;-1:-1:-1;;;11649:2:1;11634:18;;11627:40;11699:3;11684:19;;11477:232::o;11714:405::-;11916:2;11898:21;;;11955:2;11935:18;;;11928:30;11994:34;11989:2;11974:18;;11967:62;-1:-1:-1;;;12060:2:1;12045:18;;12038:39;12109:3;12094:19;;11888:231::o;12124:343::-;12326:2;12308:21;;;12365:2;12345:18;;;12338:30;-1:-1:-1;;;12399:2:1;12384:18;;12377:49;12458:2;12443:18;;12298:169::o;12472:356::-;12674:2;12656:21;;;12693:18;;;12686:30;12752:34;12747:2;12732:18;;12725:62;12819:2;12804:18;;12646:182::o;12833:408::-;13035:2;13017:21;;;13074:2;13054:18;;;13047:30;13113:34;13108:2;13093:18;;13086:62;-1:-1:-1;;;13179:2:1;13164:18;;13157:42;13231:3;13216:19;;13007:234::o;13246:405::-;13448:2;13430:21;;;13487:2;13467:18;;;13460:30;13526:34;13521:2;13506:18;;13499:62;-1:-1:-1;;;13592:2:1;13577:18;;13570:39;13641:3;13626:19;;13420:231::o;13656:411::-;13858:2;13840:21;;;13897:2;13877:18;;;13870:30;13936:34;13931:2;13916:18;;13909:62;-1:-1:-1;;;14002:2:1;13987:18;;13980:45;14057:3;14042:19;;13830:237::o;14072:352::-;14274:2;14256:21;;;14313:2;14293:18;;;14286:30;14352;14347:2;14332:18;;14325:58;14415:2;14400:18;;14246:178::o;14429:397::-;14631:2;14613:21;;;14670:2;14650:18;;;14643:30;14709:34;14704:2;14689:18;;14682:62;-1:-1:-1;;;14775:2:1;14760:18;;14753:31;14816:3;14801:19;;14603:223::o;14831:413::-;15033:2;15015:21;;;15072:2;15052:18;;;15045:30;15111:34;15106:2;15091:18;;15084:62;-1:-1:-1;;;15177:2:1;15162:18;;15155:47;15234:3;15219:19;;15005:239::o;15249:347::-;15451:2;15433:21;;;15490:2;15470:18;;;15463:30;15529:25;15524:2;15509:18;;15502:53;15587:2;15572:18;;15423:173::o;15601:338::-;15803:2;15785:21;;;15842:2;15822:18;;;15815:30;-1:-1:-1;;;15876:2:1;15861:18;;15854:44;15930:2;15915:18;;15775:164::o;15944:353::-;16146:2;16128:21;;;16185:2;16165:18;;;16158:30;16224:31;16219:2;16204:18;;16197:59;16288:2;16273:18;;16118:179::o;16302:402::-;16504:2;16486:21;;;16543:2;16523:18;;;16516:30;16582:34;16577:2;16562:18;;16555:62;-1:-1:-1;;;16648:2:1;16633:18;;16626:36;16694:3;16679:19;;16476:228::o;16709:177::-;16855:25;;;16843:2;16828:18;;16810:76::o;16891:128::-;;16962:1;16958:6;16955:1;16952:13;16949:2;;;16968:18;;:::i;:::-;-1:-1:-1;17004:9:1;;16939:80::o;17024:120::-;;17090:1;17080:2;;17095:18;;:::i;:::-;-1:-1:-1;17129:9:1;;17070:74::o;17149:125::-;;17217:1;17214;17211:8;17208:2;;;17222:18;;:::i;:::-;-1:-1:-1;17259:9:1;;17198:76::o;17279:258::-;17351:1;17361:113;17375:6;17372:1;17369:13;17361:113;;;17451:11;;;17445:18;17432:11;;;17425:39;17397:2;17390:10;17361:113;;;17492:6;17489:1;17486:13;17483:2;;;-1:-1:-1;;17527:1:1;17509:16;;17502:27;17332:205::o;17542:380::-;17627:1;17617:12;;17674:1;17664:12;;;17685:2;;17739:4;17731:6;17727:17;17717:27;;17685:2;17792;17784:6;17781:14;17761:18;17758:38;17755:2;;;17838:10;17833:3;17829:20;17826:1;17819:31;17873:4;17870:1;17863:15;17901:4;17898:1;17891:15;17755:2;;17597:325;;;:::o;17927:135::-;;-1:-1:-1;;17987:17:1;;17984:2;;;18007:18;;:::i;:::-;-1:-1:-1;18054:1:1;18043:13;;17974:88::o;18067:112::-;;18125:1;18115:2;;18130:18;;:::i;:::-;-1:-1:-1;18164:9:1;;18105:74::o;18184:127::-;18245:10;18240:3;18236:20;18233:1;18226:31;18276:4;18273:1;18266:15;18300:4;18297:1;18290:15;18316:127;18377:10;18372:3;18368:20;18365:1;18358:31;18408:4;18405:1;18398:15;18432:4;18429:1;18422:15;18448:127;18509:10;18504:3;18500:20;18497:1;18490:31;18540:4;18537:1;18530:15;18564:4;18561:1;18554:15;18580:120;18668:5;18661:13;18654:21;18647:5;18644:32;18634:2;;18690:1;18687;18680:12;18705:133;-1:-1:-1;;;;;;18781:32:1;;18771:43;;18761:2;;18828:1;18825;18818:12

Swarm Source

ipfs://2cd9d846124b8a73963b4096566e9073f79190bce97d70db732aa704d11101fc
Loading