BNB Price: $617.89 (+3.44%)
 

Overview

Max Total Supply

0BitCube Club

Holders

560

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Gate 1
Balance
1 BitCube Club
0x0d0707963952f2fba59dd06f2b425ace40b492fe
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BitCubeClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2022-04-28
*/

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

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

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

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

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

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


/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}



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

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

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

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

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


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

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


/**
 * @dev 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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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


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


/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


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

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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



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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}




/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


contract BitCubeClub is ERC721, ERC721URIStorage, AccessControl {
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("BitCube Club", "BitCube Club") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
    }

    function safeMint(address to, string memory uri) public onlyRole(MINTER_ROLE) {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

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

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

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

}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f4269744375626520436c756200000000000000000000000000000000000000008152506040518060400160405280600c81526020017f4269744375626520436c7562000000000000000000000000000000000000000081525081600090805190602001906200009692919062000264565b508060019080519060200190620000af92919062000264565b505050620000c76000801b33620000ff60201b60201c565b620000f97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000ff60201b60201c565b62000379565b620001118282620001f160201b60201c565b620001ed5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001926200025c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620002729062000314565b90600052602060002090601f016020900481019282620002965760008555620002e2565b82601f10620002b157805160ff1916838001178555620002e2565b82800160010185558215620002e2579182015b82811115620002e1578251825591602001919060010190620002c4565b5b509050620002f19190620002f5565b5090565b5b8082111562000310576000816000905550600101620002f6565b5090565b600060028204905060018216806200032d57607f821691505b602082108114156200034457620003436200034a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61378180620003896000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063b88d4fde1161007c578063b88d4fde1461035e578063c87b56dd1461037a578063d204c45e146103aa578063d5391393146103c6578063d547741f146103e4578063e985e9c51461040057610137565b806370a08231146102a657806391d14854146102d657806395d89b4114610306578063a217fddf14610324578063a22cb4651461034257610137565b8063248a9ca3116100ff578063248a9ca3146101f25780632f2ff15d1461022257806336568abe1461023e57806342842e0e1461025a5780636352211e1461027657610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b61015660048036038101906101519190612540565b610430565b6040516101639190612a27565b60405180910390f35b610174610442565b6040516101819190612a5d565b60405180910390f35b6101a4600480360381019061019f919061259a565b6104d4565b6040516101b191906129c0565b60405180910390f35b6101d460048036038101906101cf9190612493565b610559565b005b6101f060048036038101906101eb9190612321565b610671565b005b61020c600480360381019061020791906124d3565b6106d1565b6040516102199190612a42565b60405180910390f35b61023c60048036038101906102379190612500565b6106f1565b005b61025860048036038101906102539190612500565b610712565b005b610274600480360381019061026f9190612321565b610795565b005b610290600480360381019061028b919061259a565b6107b5565b60405161029d91906129c0565b60405180910390f35b6102c060048036038101906102bb91906122b4565b610867565b6040516102cd9190612cbf565b60405180910390f35b6102f060048036038101906102eb9190612500565b61091f565b6040516102fd9190612a27565b60405180910390f35b61030e61098a565b60405161031b9190612a5d565b60405180910390f35b61032c610a1c565b6040516103399190612a42565b60405180910390f35b61035c600480360381019061035791906123f7565b610a23565b005b61037860048036038101906103739190612374565b610a39565b005b610394600480360381019061038f919061259a565b610a9b565b6040516103a19190612a5d565b60405180910390f35b6103c460048036038101906103bf9190612437565b610aad565b005b6103ce610b09565b6040516103db9190612a42565b60405180910390f35b6103fe60048036038101906103f99190612500565b610b2d565b005b61041a600480360381019061041591906122e1565b610b4e565b6040516104279190612a27565b60405180910390f35b600061043b82610be2565b9050919050565b60606000805461045190612fa3565b80601f016020809104026020016040519081016040528092919081815260200182805461047d90612fa3565b80156104ca5780601f1061049f576101008083540402835291602001916104ca565b820191906000526020600020905b8154815290600101906020018083116104ad57829003601f168201915b5050505050905090565b60006104df82610c5c565b61051e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051590612c1f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610564826107b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc90612c5f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105f4610cc8565b73ffffffffffffffffffffffffffffffffffffffff16148061062357506106228161061d610cc8565b610b4e565b5b610662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065990612b5f565b60405180910390fd5b61066c8383610cd0565b505050565b61068261067c610cc8565b82610d89565b6106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612c7f565b60405180910390fd5b6106cc838383610e67565b505050565b600060076000838152602001908152602001600020600101549050919050565b6106fa826106d1565b610703816110ce565b61070d83836110e2565b505050565b61071a610cc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90612c9f565b60405180910390fd5b61079182826111c3565b5050565b6107b083838360405180602001604052806000815250610a39565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590612b9f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612b7f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461099990612fa3565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590612fa3565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b6000801b81565b610a35610a2e610cc8565b83836112a5565b5050565b610a4a610a44610cc8565b83610d89565b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090612c7f565b60405180910390fd5b610a9584848484611412565b50505050565b6060610aa68261146e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ad7816110ce565b6000610ae360086115c0565b9050610aef60086115ce565b610af984826115e4565b610b038184611602565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610b36826106d1565b610b3f816110ce565b610b4983836111c3565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c555750610c5482611676565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d43836107b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610d9482610c5c565b610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90612b3f565b60405180910390fd5b6000610dde836107b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e205750610e1f8185610b4e565b5b80610e5e57508373ffffffffffffffffffffffffffffffffffffffff16610e46846104d4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e87826107b5565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490612abf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490612aff565b60405180910390fd5b610f58838383611758565b610f63600082610cd0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb39190612e85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461100a9190612da4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110c983838361175d565b505050565b6110df816110da610cc8565b611762565b50565b6110ec828261091f565b6111bf5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611164610cc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6111cd828261091f565b156112a15760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611246610cc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b90612b1f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114059190612a27565b60405180910390a3505050565b61141d848484610e67565b611429848484846117ff565b611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90612a9f565b60405180910390fd5b50505050565b606061147982610c5c565b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90612bff565b60405180910390fd5b60006006600084815260200190815260200160002080546114d890612fa3565b80601f016020809104026020016040519081016040528092919081815260200182805461150490612fa3565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b505050505090506000611562611996565b90506000815114156115785781925050506115bb565b6000825111156115ad578082604051602001611595929190612962565b604051602081830303815290604052925050506115bb565b6115b6846119ad565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6115fe828260405180602001604052806000815250611a54565b5050565b61160b82610c5c565b61164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190612bbf565b60405180910390fd5b806006600084815260200190815260200160002090805190602001906116719291906120b3565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061174157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611751575061175082611aaf565b5b9050919050565b505050565b505050565b61176c828261091f565b6117fb576117918173ffffffffffffffffffffffffffffffffffffffff166014611b19565b61179f8360001c6020611b19565b6040516020016117b0929190612986565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f29190612a5d565b60405180910390fd5b5050565b60006118208473ffffffffffffffffffffffffffffffffffffffff16611d55565b15611989578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611849610cc8565b8786866040518563ffffffff1660e01b815260040161186b94939291906129db565b602060405180830381600087803b15801561188557600080fd5b505af19250505080156118b657506040513d601f19601f820116820180604052508101906118b3919061256d565b60015b611939573d80600081146118e6576040519150601f19603f3d011682016040523d82523d6000602084013e6118eb565b606091505b50600081511415611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890612a9f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061198e565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606119b882610c5c565b6119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90612c3f565b60405180910390fd5b6000611a01611996565b90506000815111611a215760405180602001604052806000815250611a4c565b80611a2b84611d78565b604051602001611a3c929190612962565b6040516020818303038152906040525b915050919050565b611a5e8383611ed9565b611a6b60008484846117ff565b611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190612a9f565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060006002836002611b2c9190612e2b565b611b369190612da4565b67ffffffffffffffff811115611b4f57611b4e61313c565b5b6040519080825280601f01601f191660200182016040528015611b815781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611bb957611bb861310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c1d57611c1c61310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611c5d9190612e2b565b611c679190612da4565b90505b6001811115611d07577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611ca957611ca861310d565b5b1a60f81b828281518110611cc057611cbf61310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d0090612f79565b9050611c6a565b5060008414611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4290612a7f565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415611dc0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ed4565b600082905060005b60008214611df2578080611ddb90613006565b915050600a82611deb9190612dfa565b9150611dc8565b60008167ffffffffffffffff811115611e0e57611e0d61313c565b5b6040519080825280601f01601f191660200182016040528015611e405781602001600182028036833780820191505090505b5090505b60008514611ecd57600182611e599190612e85565b9150600a85611e68919061304f565b6030611e749190612da4565b60f81b818381518110611e8a57611e8961310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ec69190612dfa565b9450611e44565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4090612bdf565b60405180910390fd5b611f5281610c5c565b15611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990612adf565b60405180910390fd5b611f9e60008383611758565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fee9190612da4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120af6000838361175d565b5050565b8280546120bf90612fa3565b90600052602060002090601f0160209004810192826120e15760008555612128565b82601f106120fa57805160ff1916838001178555612128565b82800160010185558215612128579182015b8281111561212757825182559160200191906001019061210c565b5b5090506121359190612139565b5090565b5b8082111561215257600081600090555060010161213a565b5090565b600061216961216484612cff565b612cda565b90508281526020810184848401111561218557612184613170565b5b612190848285612f37565b509392505050565b60006121ab6121a684612d30565b612cda565b9050828152602081018484840111156121c7576121c6613170565b5b6121d2848285612f37565b509392505050565b6000813590506121e9816136d8565b92915050565b6000813590506121fe816136ef565b92915050565b60008135905061221381613706565b92915050565b6000813590506122288161371d565b92915050565b60008151905061223d8161371d565b92915050565b600082601f8301126122585761225761316b565b5b8135612268848260208601612156565b91505092915050565b600082601f8301126122865761228561316b565b5b8135612296848260208601612198565b91505092915050565b6000813590506122ae81613734565b92915050565b6000602082840312156122ca576122c961317a565b5b60006122d8848285016121da565b91505092915050565b600080604083850312156122f8576122f761317a565b5b6000612306858286016121da565b9250506020612317858286016121da565b9150509250929050565b60008060006060848603121561233a5761233961317a565b5b6000612348868287016121da565b9350506020612359868287016121da565b925050604061236a8682870161229f565b9150509250925092565b6000806000806080858703121561238e5761238d61317a565b5b600061239c878288016121da565b94505060206123ad878288016121da565b93505060406123be8782880161229f565b925050606085013567ffffffffffffffff8111156123df576123de613175565b5b6123eb87828801612243565b91505092959194509250565b6000806040838503121561240e5761240d61317a565b5b600061241c858286016121da565b925050602061242d858286016121ef565b9150509250929050565b6000806040838503121561244e5761244d61317a565b5b600061245c858286016121da565b925050602083013567ffffffffffffffff81111561247d5761247c613175565b5b61248985828601612271565b9150509250929050565b600080604083850312156124aa576124a961317a565b5b60006124b8858286016121da565b92505060206124c98582860161229f565b9150509250929050565b6000602082840312156124e9576124e861317a565b5b60006124f784828501612204565b91505092915050565b600080604083850312156125175761251661317a565b5b600061252585828601612204565b9250506020612536858286016121da565b9150509250929050565b6000602082840312156125565761255561317a565b5b600061256484828501612219565b91505092915050565b6000602082840312156125835761258261317a565b5b60006125918482850161222e565b91505092915050565b6000602082840312156125b0576125af61317a565b5b60006125be8482850161229f565b91505092915050565b6125d081612eb9565b82525050565b6125df81612ecb565b82525050565b6125ee81612ed7565b82525050565b60006125ff82612d61565b6126098185612d77565b9350612619818560208601612f46565b6126228161317f565b840191505092915050565b600061263882612d6c565b6126428185612d88565b9350612652818560208601612f46565b61265b8161317f565b840191505092915050565b600061267182612d6c565b61267b8185612d99565b935061268b818560208601612f46565b80840191505092915050565b60006126a4602083612d88565b91506126af82613190565b602082019050919050565b60006126c7603283612d88565b91506126d2826131b9565b604082019050919050565b60006126ea602583612d88565b91506126f582613208565b604082019050919050565b600061270d601c83612d88565b915061271882613257565b602082019050919050565b6000612730602483612d88565b915061273b82613280565b604082019050919050565b6000612753601983612d88565b915061275e826132cf565b602082019050919050565b6000612776602c83612d88565b9150612781826132f8565b604082019050919050565b6000612799603883612d88565b91506127a482613347565b604082019050919050565b60006127bc602a83612d88565b91506127c782613396565b604082019050919050565b60006127df602983612d88565b91506127ea826133e5565b604082019050919050565b6000612802602e83612d88565b915061280d82613434565b604082019050919050565b6000612825602083612d88565b915061283082613483565b602082019050919050565b6000612848603183612d88565b9150612853826134ac565b604082019050919050565b600061286b602c83612d88565b9150612876826134fb565b604082019050919050565b600061288e602f83612d88565b91506128998261354a565b604082019050919050565b60006128b1602183612d88565b91506128bc82613599565b604082019050919050565b60006128d4603183612d88565b91506128df826135e8565b604082019050919050565b60006128f7601783612d99565b915061290282613637565b601782019050919050565b600061291a601183612d99565b915061292582613660565b601182019050919050565b600061293d602f83612d88565b915061294882613689565b604082019050919050565b61295c81612f2d565b82525050565b600061296e8285612666565b915061297a8284612666565b91508190509392505050565b6000612991826128ea565b915061299d8285612666565b91506129a88261290d565b91506129b48284612666565b91508190509392505050565b60006020820190506129d560008301846125c7565b92915050565b60006080820190506129f060008301876125c7565b6129fd60208301866125c7565b612a0a6040830185612953565b8181036060830152612a1c81846125f4565b905095945050505050565b6000602082019050612a3c60008301846125d6565b92915050565b6000602082019050612a5760008301846125e5565b92915050565b60006020820190508181036000830152612a77818461262d565b905092915050565b60006020820190508181036000830152612a9881612697565b9050919050565b60006020820190508181036000830152612ab8816126ba565b9050919050565b60006020820190508181036000830152612ad8816126dd565b9050919050565b60006020820190508181036000830152612af881612700565b9050919050565b60006020820190508181036000830152612b1881612723565b9050919050565b60006020820190508181036000830152612b3881612746565b9050919050565b60006020820190508181036000830152612b5881612769565b9050919050565b60006020820190508181036000830152612b788161278c565b9050919050565b60006020820190508181036000830152612b98816127af565b9050919050565b60006020820190508181036000830152612bb8816127d2565b9050919050565b60006020820190508181036000830152612bd8816127f5565b9050919050565b60006020820190508181036000830152612bf881612818565b9050919050565b60006020820190508181036000830152612c188161283b565b9050919050565b60006020820190508181036000830152612c388161285e565b9050919050565b60006020820190508181036000830152612c5881612881565b9050919050565b60006020820190508181036000830152612c78816128a4565b9050919050565b60006020820190508181036000830152612c98816128c7565b9050919050565b60006020820190508181036000830152612cb881612930565b9050919050565b6000602082019050612cd46000830184612953565b92915050565b6000612ce4612cf5565b9050612cf08282612fd5565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d1961313c565b5b612d238261317f565b9050602081019050919050565b600067ffffffffffffffff821115612d4b57612d4a61313c565b5b612d548261317f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612daf82612f2d565b9150612dba83612f2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612def57612dee613080565b5b828201905092915050565b6000612e0582612f2d565b9150612e1083612f2d565b925082612e2057612e1f6130af565b5b828204905092915050565b6000612e3682612f2d565b9150612e4183612f2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e7a57612e79613080565b5b828202905092915050565b6000612e9082612f2d565b9150612e9b83612f2d565b925082821015612eae57612ead613080565b5b828203905092915050565b6000612ec482612f0d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f64578082015181840152602081019050612f49565b83811115612f73576000848401525b50505050565b6000612f8482612f2d565b91506000821415612f9857612f97613080565b5b600182039050919050565b60006002820490506001821680612fbb57607f821691505b60208210811415612fcf57612fce6130de565b5b50919050565b612fde8261317f565b810181811067ffffffffffffffff82111715612ffd57612ffc61313c565b5b80604052505050565b600061301182612f2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561304457613043613080565b5b600182019050919050565b600061305a82612f2d565b915061306583612f2d565b925082613075576130746130af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6136e181612eb9565b81146136ec57600080fd5b50565b6136f881612ecb565b811461370357600080fd5b50565b61370f81612ed7565b811461371a57600080fd5b50565b61372681612ee1565b811461373157600080fd5b50565b61373d81612f2d565b811461374857600080fd5b5056fea264697066735822122084b47006b1c7b137b9f163b9ca88086ae8d7b3b5026e52f01c268d657ea40a0e64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063b88d4fde1161007c578063b88d4fde1461035e578063c87b56dd1461037a578063d204c45e146103aa578063d5391393146103c6578063d547741f146103e4578063e985e9c51461040057610137565b806370a08231146102a657806391d14854146102d657806395d89b4114610306578063a217fddf14610324578063a22cb4651461034257610137565b8063248a9ca3116100ff578063248a9ca3146101f25780632f2ff15d1461022257806336568abe1461023e57806342842e0e1461025a5780636352211e1461027657610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b61015660048036038101906101519190612540565b610430565b6040516101639190612a27565b60405180910390f35b610174610442565b6040516101819190612a5d565b60405180910390f35b6101a4600480360381019061019f919061259a565b6104d4565b6040516101b191906129c0565b60405180910390f35b6101d460048036038101906101cf9190612493565b610559565b005b6101f060048036038101906101eb9190612321565b610671565b005b61020c600480360381019061020791906124d3565b6106d1565b6040516102199190612a42565b60405180910390f35b61023c60048036038101906102379190612500565b6106f1565b005b61025860048036038101906102539190612500565b610712565b005b610274600480360381019061026f9190612321565b610795565b005b610290600480360381019061028b919061259a565b6107b5565b60405161029d91906129c0565b60405180910390f35b6102c060048036038101906102bb91906122b4565b610867565b6040516102cd9190612cbf565b60405180910390f35b6102f060048036038101906102eb9190612500565b61091f565b6040516102fd9190612a27565b60405180910390f35b61030e61098a565b60405161031b9190612a5d565b60405180910390f35b61032c610a1c565b6040516103399190612a42565b60405180910390f35b61035c600480360381019061035791906123f7565b610a23565b005b61037860048036038101906103739190612374565b610a39565b005b610394600480360381019061038f919061259a565b610a9b565b6040516103a19190612a5d565b60405180910390f35b6103c460048036038101906103bf9190612437565b610aad565b005b6103ce610b09565b6040516103db9190612a42565b60405180910390f35b6103fe60048036038101906103f99190612500565b610b2d565b005b61041a600480360381019061041591906122e1565b610b4e565b6040516104279190612a27565b60405180910390f35b600061043b82610be2565b9050919050565b60606000805461045190612fa3565b80601f016020809104026020016040519081016040528092919081815260200182805461047d90612fa3565b80156104ca5780601f1061049f576101008083540402835291602001916104ca565b820191906000526020600020905b8154815290600101906020018083116104ad57829003601f168201915b5050505050905090565b60006104df82610c5c565b61051e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051590612c1f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610564826107b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc90612c5f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105f4610cc8565b73ffffffffffffffffffffffffffffffffffffffff16148061062357506106228161061d610cc8565b610b4e565b5b610662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065990612b5f565b60405180910390fd5b61066c8383610cd0565b505050565b61068261067c610cc8565b82610d89565b6106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612c7f565b60405180910390fd5b6106cc838383610e67565b505050565b600060076000838152602001908152602001600020600101549050919050565b6106fa826106d1565b610703816110ce565b61070d83836110e2565b505050565b61071a610cc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077e90612c9f565b60405180910390fd5b61079182826111c3565b5050565b6107b083838360405180602001604052806000815250610a39565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590612b9f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90612b7f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461099990612fa3565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590612fa3565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b6000801b81565b610a35610a2e610cc8565b83836112a5565b5050565b610a4a610a44610cc8565b83610d89565b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090612c7f565b60405180910390fd5b610a9584848484611412565b50505050565b6060610aa68261146e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ad7816110ce565b6000610ae360086115c0565b9050610aef60086115ce565b610af984826115e4565b610b038184611602565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610b36826106d1565b610b3f816110ce565b610b4983836111c3565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c555750610c5482611676565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610d43836107b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610d9482610c5c565b610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90612b3f565b60405180910390fd5b6000610dde836107b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e205750610e1f8185610b4e565b5b80610e5e57508373ffffffffffffffffffffffffffffffffffffffff16610e46846104d4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e87826107b5565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490612abf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490612aff565b60405180910390fd5b610f58838383611758565b610f63600082610cd0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb39190612e85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461100a9190612da4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110c983838361175d565b505050565b6110df816110da610cc8565b611762565b50565b6110ec828261091f565b6111bf5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611164610cc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6111cd828261091f565b156112a15760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611246610cc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b90612b1f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114059190612a27565b60405180910390a3505050565b61141d848484610e67565b611429848484846117ff565b611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90612a9f565b60405180910390fd5b50505050565b606061147982610c5c565b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90612bff565b60405180910390fd5b60006006600084815260200190815260200160002080546114d890612fa3565b80601f016020809104026020016040519081016040528092919081815260200182805461150490612fa3565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b505050505090506000611562611996565b90506000815114156115785781925050506115bb565b6000825111156115ad578082604051602001611595929190612962565b604051602081830303815290604052925050506115bb565b6115b6846119ad565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6115fe828260405180602001604052806000815250611a54565b5050565b61160b82610c5c565b61164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190612bbf565b60405180910390fd5b806006600084815260200190815260200160002090805190602001906116719291906120b3565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061174157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611751575061175082611aaf565b5b9050919050565b505050565b505050565b61176c828261091f565b6117fb576117918173ffffffffffffffffffffffffffffffffffffffff166014611b19565b61179f8360001c6020611b19565b6040516020016117b0929190612986565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f29190612a5d565b60405180910390fd5b5050565b60006118208473ffffffffffffffffffffffffffffffffffffffff16611d55565b15611989578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611849610cc8565b8786866040518563ffffffff1660e01b815260040161186b94939291906129db565b602060405180830381600087803b15801561188557600080fd5b505af19250505080156118b657506040513d601f19601f820116820180604052508101906118b3919061256d565b60015b611939573d80600081146118e6576040519150601f19603f3d011682016040523d82523d6000602084013e6118eb565b606091505b50600081511415611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890612a9f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061198e565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606119b882610c5c565b6119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90612c3f565b60405180910390fd5b6000611a01611996565b90506000815111611a215760405180602001604052806000815250611a4c565b80611a2b84611d78565b604051602001611a3c929190612962565b6040516020818303038152906040525b915050919050565b611a5e8383611ed9565b611a6b60008484846117ff565b611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190612a9f565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060006002836002611b2c9190612e2b565b611b369190612da4565b67ffffffffffffffff811115611b4f57611b4e61313c565b5b6040519080825280601f01601f191660200182016040528015611b815781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611bb957611bb861310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c1d57611c1c61310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611c5d9190612e2b565b611c679190612da4565b90505b6001811115611d07577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611ca957611ca861310d565b5b1a60f81b828281518110611cc057611cbf61310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d0090612f79565b9050611c6a565b5060008414611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4290612a7f565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415611dc0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ed4565b600082905060005b60008214611df2578080611ddb90613006565b915050600a82611deb9190612dfa565b9150611dc8565b60008167ffffffffffffffff811115611e0e57611e0d61313c565b5b6040519080825280601f01601f191660200182016040528015611e405781602001600182028036833780820191505090505b5090505b60008514611ecd57600182611e599190612e85565b9150600a85611e68919061304f565b6030611e749190612da4565b60f81b818381518110611e8a57611e8961310d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ec69190612dfa565b9450611e44565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4090612bdf565b60405180910390fd5b611f5281610c5c565b15611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990612adf565b60405180910390fd5b611f9e60008383611758565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fee9190612da4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120af6000838361175d565b5050565b8280546120bf90612fa3565b90600052602060002090601f0160209004810192826120e15760008555612128565b82601f106120fa57805160ff1916838001178555612128565b82800160010185558215612128579182015b8281111561212757825182559160200191906001019061210c565b5b5090506121359190612139565b5090565b5b8082111561215257600081600090555060010161213a565b5090565b600061216961216484612cff565b612cda565b90508281526020810184848401111561218557612184613170565b5b612190848285612f37565b509392505050565b60006121ab6121a684612d30565b612cda565b9050828152602081018484840111156121c7576121c6613170565b5b6121d2848285612f37565b509392505050565b6000813590506121e9816136d8565b92915050565b6000813590506121fe816136ef565b92915050565b60008135905061221381613706565b92915050565b6000813590506122288161371d565b92915050565b60008151905061223d8161371d565b92915050565b600082601f8301126122585761225761316b565b5b8135612268848260208601612156565b91505092915050565b600082601f8301126122865761228561316b565b5b8135612296848260208601612198565b91505092915050565b6000813590506122ae81613734565b92915050565b6000602082840312156122ca576122c961317a565b5b60006122d8848285016121da565b91505092915050565b600080604083850312156122f8576122f761317a565b5b6000612306858286016121da565b9250506020612317858286016121da565b9150509250929050565b60008060006060848603121561233a5761233961317a565b5b6000612348868287016121da565b9350506020612359868287016121da565b925050604061236a8682870161229f565b9150509250925092565b6000806000806080858703121561238e5761238d61317a565b5b600061239c878288016121da565b94505060206123ad878288016121da565b93505060406123be8782880161229f565b925050606085013567ffffffffffffffff8111156123df576123de613175565b5b6123eb87828801612243565b91505092959194509250565b6000806040838503121561240e5761240d61317a565b5b600061241c858286016121da565b925050602061242d858286016121ef565b9150509250929050565b6000806040838503121561244e5761244d61317a565b5b600061245c858286016121da565b925050602083013567ffffffffffffffff81111561247d5761247c613175565b5b61248985828601612271565b9150509250929050565b600080604083850312156124aa576124a961317a565b5b60006124b8858286016121da565b92505060206124c98582860161229f565b9150509250929050565b6000602082840312156124e9576124e861317a565b5b60006124f784828501612204565b91505092915050565b600080604083850312156125175761251661317a565b5b600061252585828601612204565b9250506020612536858286016121da565b9150509250929050565b6000602082840312156125565761255561317a565b5b600061256484828501612219565b91505092915050565b6000602082840312156125835761258261317a565b5b60006125918482850161222e565b91505092915050565b6000602082840312156125b0576125af61317a565b5b60006125be8482850161229f565b91505092915050565b6125d081612eb9565b82525050565b6125df81612ecb565b82525050565b6125ee81612ed7565b82525050565b60006125ff82612d61565b6126098185612d77565b9350612619818560208601612f46565b6126228161317f565b840191505092915050565b600061263882612d6c565b6126428185612d88565b9350612652818560208601612f46565b61265b8161317f565b840191505092915050565b600061267182612d6c565b61267b8185612d99565b935061268b818560208601612f46565b80840191505092915050565b60006126a4602083612d88565b91506126af82613190565b602082019050919050565b60006126c7603283612d88565b91506126d2826131b9565b604082019050919050565b60006126ea602583612d88565b91506126f582613208565b604082019050919050565b600061270d601c83612d88565b915061271882613257565b602082019050919050565b6000612730602483612d88565b915061273b82613280565b604082019050919050565b6000612753601983612d88565b915061275e826132cf565b602082019050919050565b6000612776602c83612d88565b9150612781826132f8565b604082019050919050565b6000612799603883612d88565b91506127a482613347565b604082019050919050565b60006127bc602a83612d88565b91506127c782613396565b604082019050919050565b60006127df602983612d88565b91506127ea826133e5565b604082019050919050565b6000612802602e83612d88565b915061280d82613434565b604082019050919050565b6000612825602083612d88565b915061283082613483565b602082019050919050565b6000612848603183612d88565b9150612853826134ac565b604082019050919050565b600061286b602c83612d88565b9150612876826134fb565b604082019050919050565b600061288e602f83612d88565b91506128998261354a565b604082019050919050565b60006128b1602183612d88565b91506128bc82613599565b604082019050919050565b60006128d4603183612d88565b91506128df826135e8565b604082019050919050565b60006128f7601783612d99565b915061290282613637565b601782019050919050565b600061291a601183612d99565b915061292582613660565b601182019050919050565b600061293d602f83612d88565b915061294882613689565b604082019050919050565b61295c81612f2d565b82525050565b600061296e8285612666565b915061297a8284612666565b91508190509392505050565b6000612991826128ea565b915061299d8285612666565b91506129a88261290d565b91506129b48284612666565b91508190509392505050565b60006020820190506129d560008301846125c7565b92915050565b60006080820190506129f060008301876125c7565b6129fd60208301866125c7565b612a0a6040830185612953565b8181036060830152612a1c81846125f4565b905095945050505050565b6000602082019050612a3c60008301846125d6565b92915050565b6000602082019050612a5760008301846125e5565b92915050565b60006020820190508181036000830152612a77818461262d565b905092915050565b60006020820190508181036000830152612a9881612697565b9050919050565b60006020820190508181036000830152612ab8816126ba565b9050919050565b60006020820190508181036000830152612ad8816126dd565b9050919050565b60006020820190508181036000830152612af881612700565b9050919050565b60006020820190508181036000830152612b1881612723565b9050919050565b60006020820190508181036000830152612b3881612746565b9050919050565b60006020820190508181036000830152612b5881612769565b9050919050565b60006020820190508181036000830152612b788161278c565b9050919050565b60006020820190508181036000830152612b98816127af565b9050919050565b60006020820190508181036000830152612bb8816127d2565b9050919050565b60006020820190508181036000830152612bd8816127f5565b9050919050565b60006020820190508181036000830152612bf881612818565b9050919050565b60006020820190508181036000830152612c188161283b565b9050919050565b60006020820190508181036000830152612c388161285e565b9050919050565b60006020820190508181036000830152612c5881612881565b9050919050565b60006020820190508181036000830152612c78816128a4565b9050919050565b60006020820190508181036000830152612c98816128c7565b9050919050565b60006020820190508181036000830152612cb881612930565b9050919050565b6000602082019050612cd46000830184612953565b92915050565b6000612ce4612cf5565b9050612cf08282612fd5565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d1961313c565b5b612d238261317f565b9050602081019050919050565b600067ffffffffffffffff821115612d4b57612d4a61313c565b5b612d548261317f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612daf82612f2d565b9150612dba83612f2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612def57612dee613080565b5b828201905092915050565b6000612e0582612f2d565b9150612e1083612f2d565b925082612e2057612e1f6130af565b5b828204905092915050565b6000612e3682612f2d565b9150612e4183612f2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e7a57612e79613080565b5b828202905092915050565b6000612e9082612f2d565b9150612e9b83612f2d565b925082821015612eae57612ead613080565b5b828203905092915050565b6000612ec482612f0d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f64578082015181840152602081019050612f49565b83811115612f73576000848401525b50505050565b6000612f8482612f2d565b91506000821415612f9857612f97613080565b5b600182039050919050565b60006002820490506001821680612fbb57607f821691505b60208210811415612fcf57612fce6130de565b5b50919050565b612fde8261317f565b810181811067ffffffffffffffff82111715612ffd57612ffc61313c565b5b80604052505050565b600061301182612f2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561304457613043613080565b5b600182019050919050565b600061305a82612f2d565b915061306583612f2d565b925082613075576130746130af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6136e181612eb9565b81146136ec57600080fd5b50565b6136f881612ecb565b811461370357600080fd5b50565b61370f81612ed7565b811461371a57600080fd5b50565b61372681612ee1565b811461373157600080fd5b50565b61373d81612f2d565b811461374857600080fd5b5056fea264697066735822122084b47006b1c7b137b9f163b9ca88086ae8d7b3b5026e52f01c268d657ea40a0e64736f6c63430008070033

Deployed Bytecode Sourcemap

47146:1268:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48200:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33158:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34718:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34241:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35468:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22095:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22488:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23536:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35878:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32852:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32582:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20555:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33327:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19660:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35011:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36134:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47996:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47547:248;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47261:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22880:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35237:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48200:209;48336:4;48365:36;48389:11;48365:23;:36::i;:::-;48358:43;;48200:209;;;:::o;33158:100::-;33212:13;33245:5;33238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33158:100;:::o;34718:221::-;34794:7;34822:16;34830:7;34822;:16::i;:::-;34814:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34907:15;:24;34923:7;34907:24;;;;;;;;;;;;;;;;;;;;;34900:31;;34718:221;;;:::o;34241:411::-;34322:13;34338:23;34353:7;34338:14;:23::i;:::-;34322:39;;34386:5;34380:11;;:2;:11;;;;34372:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34480:5;34464:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34489:37;34506:5;34513:12;:10;:12::i;:::-;34489:16;:37::i;:::-;34464:62;34442:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34623:21;34632:2;34636:7;34623:8;:21::i;:::-;34311:341;34241:411;;:::o;35468:339::-;35663:41;35682:12;:10;:12::i;:::-;35696:7;35663:18;:41::i;:::-;35655:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35771:28;35781:4;35787:2;35791:7;35771:9;:28::i;:::-;35468:339;;;:::o;22095:131::-;22169:7;22196:6;:12;22203:4;22196:12;;;;;;;;;;;:22;;;22189:29;;22095:131;;;:::o;22488:147::-;22571:18;22584:4;22571:12;:18::i;:::-;20151:16;20162:4;20151:10;:16::i;:::-;22602:25:::1;22613:4;22619:7;22602:10;:25::i;:::-;22488:147:::0;;;:::o;23536:218::-;23643:12;:10;:12::i;:::-;23632:23;;:7;:23;;;23624:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;23720:26;23732:4;23738:7;23720:11;:26::i;:::-;23536:218;;:::o;35878:185::-;36016:39;36033:4;36039:2;36043:7;36016:39;;;;;;;;;;;;:16;:39::i;:::-;35878:185;;;:::o;32852:239::-;32924:7;32944:13;32960:7;:16;32968:7;32960:16;;;;;;;;;;;;;;;;;;;;;32944:32;;33012:1;32995:19;;:5;:19;;;;32987:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33078:5;33071:12;;;32852:239;;;:::o;32582:208::-;32654:7;32699:1;32682:19;;:5;:19;;;;32674:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32766:9;:16;32776:5;32766:16;;;;;;;;;;;;;;;;32759:23;;32582:208;;;:::o;20555:147::-;20641:4;20665:6;:12;20672:4;20665:12;;;;;;;;;;;:20;;:29;20686:7;20665:29;;;;;;;;;;;;;;;;;;;;;;;;;20658:36;;20555:147;;;;:::o;33327:104::-;33383:13;33416:7;33409:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33327:104;:::o;19660:49::-;19705:4;19660:49;;;:::o;35011:155::-;35106:52;35125:12;:10;:12::i;:::-;35139:8;35149;35106:18;:52::i;:::-;35011:155;;:::o;36134:328::-;36309:41;36328:12;:10;:12::i;:::-;36342:7;36309:18;:41::i;:::-;36301:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36415:39;36429:4;36435:2;36439:7;36448:5;36415:13;:39::i;:::-;36134:328;;;;:::o;47996:196::-;48123:13;48161:23;48176:7;48161:14;:23::i;:::-;48154:30;;47996:196;;;:::o;47547:248::-;47299:24;20151:16;20162:4;20151:10;:16::i;:::-;47636:15:::1;47654:25;:15;:23;:25::i;:::-;47636:43;;47690:27;:15;:25;:27::i;:::-;47728:22;47738:2;47742:7;47728:9;:22::i;:::-;47761:26;47774:7;47783:3;47761:12;:26::i;:::-;47625:170;47547:248:::0;;;:::o;47261:62::-;47299:24;47261:62;:::o;22880:149::-;22964:18;22977:4;22964:12;:18::i;:::-;20151:16;20162:4;20151:10;:16::i;:::-;22995:26:::1;23007:4;23013:7;22995:11;:26::i;:::-;22880:149:::0;;;:::o;35237:164::-;35334:4;35358:18;:25;35377:5;35358:25;;;;;;;;;;;;;;;:35;35384:8;35358:35;;;;;;;;;;;;;;;;;;;;;;;;;35351:42;;35237:164;;;;:::o;20259:204::-;20344:4;20383:32;20368:47;;;:11;:47;;;;:87;;;;20419:36;20443:11;20419:23;:36::i;:::-;20368:87;20361:94;;20259:204;;;:::o;37972:127::-;38037:4;38089:1;38061:30;;:7;:16;38069:7;38061:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38054:37;;37972:127;;;:::o;6803:98::-;6856:7;6883:10;6876:17;;6803:98;:::o;42118:174::-;42220:2;42193:15;:24;42209:7;42193:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42276:7;42272:2;42238:46;;42247:23;42262:7;42247:14;:23::i;:::-;42238:46;;;;;;;;;;;;42118:174;;:::o;38266:348::-;38359:4;38384:16;38392:7;38384;:16::i;:::-;38376:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38460:13;38476:23;38491:7;38476:14;:23::i;:::-;38460:39;;38529:5;38518:16;;:7;:16;;;:52;;;;38538:32;38555:5;38562:7;38538:16;:32::i;:::-;38518:52;:87;;;;38598:7;38574:31;;:20;38586:7;38574:11;:20::i;:::-;:31;;;38518:87;38510:96;;;38266:348;;;;:::o;41375:625::-;41534:4;41507:31;;:23;41522:7;41507:14;:23::i;:::-;:31;;;41499:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;41613:1;41599:16;;:2;:16;;;;41591:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41669:39;41690:4;41696:2;41700:7;41669:20;:39::i;:::-;41773:29;41790:1;41794:7;41773:8;:29::i;:::-;41834:1;41815:9;:15;41825:4;41815:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41863:1;41846:9;:13;41856:2;41846:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41894:2;41875:7;:16;41883:7;41875:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41933:7;41929:2;41914:27;;41923:4;41914:27;;;;;;;;;;;;41954:38;41974:4;41980:2;41984:7;41954:19;:38::i;:::-;41375:625;;;:::o;21006:105::-;21073:30;21084:4;21090:12;:10;:12::i;:::-;21073:10;:30::i;:::-;21006:105;:::o;25037:238::-;25121:22;25129:4;25135:7;25121;:22::i;:::-;25116:152;;25192:4;25160:6;:12;25167:4;25160:12;;;;;;;;;;;:20;;:29;25181:7;25160:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;25243:12;:10;:12::i;:::-;25216:40;;25234:7;25216:40;;25228:4;25216:40;;;;;;;;;;25116:152;25037:238;;:::o;25407:239::-;25491:22;25499:4;25505:7;25491;:22::i;:::-;25487:152;;;25562:5;25530:6;:12;25537:4;25530:12;;;;;;;;;;;:20;;:29;25551:7;25530:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;25614:12;:10;:12::i;:::-;25587:40;;25605:7;25587:40;;25599:4;25587:40;;;;;;;;;;25487:152;25407:239;;:::o;42434:315::-;42589:8;42580:17;;:5;:17;;;;42572:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;42676:8;42638:18;:25;42657:5;42638:25;;;;;;;;;;;;;;;:35;42664:8;42638:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;42722:8;42700:41;;42715:5;42700:41;;;42732:8;42700:41;;;;;;:::i;:::-;;;;;;;;42434:315;;;:::o;37344:::-;37501:28;37511:4;37517:2;37521:7;37501:9;:28::i;:::-;37548:48;37571:4;37577:2;37581:7;37590:5;37548:22;:48::i;:::-;37540:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37344:315;;;;:::o;45650:679::-;45723:13;45757:16;45765:7;45757;:16::i;:::-;45749:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;45840:23;45866:10;:19;45877:7;45866:19;;;;;;;;;;;45840:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45896:18;45917:10;:8;:10::i;:::-;45896:31;;46025:1;46009:4;46003:18;:23;45999:72;;;46050:9;46043:16;;;;;;45999:72;46201:1;46181:9;46175:23;:27;46171:108;;;46250:4;46256:9;46233:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46219:48;;;;;;46171:108;46298:23;46313:7;46298:14;:23::i;:::-;46291:30;;;;45650:679;;;;:::o;791:114::-;856:7;883;:14;;;876:21;;791:114;;;:::o;913:127::-;1020:1;1002:7;:14;;;:19;;;;;;;;;;;913:127;:::o;38956:110::-;39032:26;39042:2;39046:7;39032:26;;;;;;;;;;;;:9;:26::i;:::-;38956:110;;:::o;46485:217::-;46585:16;46593:7;46585;:16::i;:::-;46577:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;46685:9;46663:10;:19;46674:7;46663:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;46485:217;;:::o;32213:305::-;32315:4;32367:25;32352:40;;;:11;:40;;;;:105;;;;32424:33;32409:48;;;:11;:48;;;;32352:105;:158;;;;32474:36;32498:11;32474:23;:36::i;:::-;32352:158;32332:178;;32213:305;;;:::o;44685:126::-;;;;:::o;45196:125::-;;;;:::o;21401:505::-;21490:22;21498:4;21504:7;21490;:22::i;:::-;21485:414;;21678:41;21706:7;21678:41;;21716:2;21678:19;:41::i;:::-;21792:38;21820:4;21812:13;;21827:2;21792:19;:38::i;:::-;21583:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21529:358;;;;;;;;;;;:::i;:::-;;;;;;;;21485:414;21401:505;;:::o;43314:799::-;43469:4;43490:15;:2;:13;;;:15::i;:::-;43486:620;;;43542:2;43526:36;;;43563:12;:10;:12::i;:::-;43577:4;43583:7;43592:5;43526:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43522:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43785:1;43768:6;:13;:18;43764:272;;;43811:60;;;;;;;;;;:::i;:::-;;;;;;;;43764:272;43986:6;43980:13;43971:6;43967:2;43963:15;43956:38;43522:529;43659:41;;;43649:51;;;:6;:51;;;;43642:58;;;;;43486:620;44090:4;44083:11;;43314:799;;;;;;;:::o;34085:94::-;34136:13;34162:9;;;;;;;;;;;;;;34085:94;:::o;33502:334::-;33575:13;33609:16;33617:7;33609;:16::i;:::-;33601:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33690:21;33714:10;:8;:10::i;:::-;33690:34;;33766:1;33748:7;33742:21;:25;:86;;;;;;;;;;;;;;;;;33794:7;33803:18;:7;:16;:18::i;:::-;33777:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33742:86;33735:93;;;33502:334;;;:::o;39293:321::-;39423:18;39429:2;39433:7;39423:5;:18::i;:::-;39474:54;39505:1;39509:2;39513:7;39522:5;39474:22;:54::i;:::-;39452:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;39293:321;;;:::o;17692:157::-;17777:4;17816:25;17801:40;;;:11;:40;;;;17794:47;;17692:157;;;:::o;5803:451::-;5878:13;5904:19;5949:1;5940:6;5936:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5926:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5904:47;;5962:15;:6;5969:1;5962:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;5988;:6;5995:1;5988:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6019:9;6044:1;6035:6;6031:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6019:26;;6014:135;6051:1;6047;:5;6014:135;;;6086:12;6107:3;6099:5;:11;6086:25;;;;;;;:::i;:::-;;;;;6074:6;6081:1;6074:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;6136:1;6126:11;;;;;6054:3;;;;:::i;:::-;;;6014:135;;;;6176:1;6167:5;:10;6159:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6239:6;6225:21;;;5803:451;;;;:::o;8098:326::-;8158:4;8415:1;8393:7;:19;;;:23;8386:30;;8098:326;;;:::o;4502:723::-;4558:13;4788:1;4779:5;:10;4775:53;;;4806:10;;;;;;;;;;;;;;;;;;;;;4775:53;4838:12;4853:5;4838:20;;4869:14;4894:78;4909:1;4901:4;:9;4894:78;;4927:8;;;;;:::i;:::-;;;;4958:2;4950:10;;;;;:::i;:::-;;;4894:78;;;4982:19;5014:6;5004:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4982:39;;5032:154;5048:1;5039:5;:10;5032:154;;5076:1;5066:11;;;;;:::i;:::-;;;5143:2;5135:5;:10;;;;:::i;:::-;5122:2;:24;;;;:::i;:::-;5109:39;;5092:6;5099;5092:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5172:2;5163:11;;;;;:::i;:::-;;;5032:154;;;5210:6;5196:21;;;;;4502:723;;;;:::o;39950:439::-;40044:1;40030:16;;:2;:16;;;;40022:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40103:16;40111:7;40103;:16::i;:::-;40102:17;40094:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40165:45;40194:1;40198:2;40202:7;40165:20;:45::i;:::-;40240:1;40223:9;:13;40233:2;40223:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40271:2;40252:7;:16;40260:7;40252:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40316:7;40312:2;40291:33;;40308:1;40291:33;;;;;;;;;;;;40337:44;40365:1;40369:2;40373:7;40337:19;:44::i;:::-;39950:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:329::-;2481:6;2530:2;2518:9;2509:7;2505:23;2501:32;2498:119;;;2536:79;;:::i;:::-;2498:119;2656:1;2681:53;2726:7;2717:6;2706:9;2702:22;2681:53;:::i;:::-;2671:63;;2627:117;2422:329;;;;:::o;2757:474::-;2825:6;2833;2882:2;2870:9;2861:7;2857:23;2853:32;2850:119;;;2888:79;;:::i;:::-;2850:119;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;2757:474;;;;;:::o;3237:619::-;3314:6;3322;3330;3379:2;3367:9;3358:7;3354:23;3350:32;3347:119;;;3385:79;;:::i;:::-;3347:119;3505:1;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3476:117;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3760:2;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3731:118;3237:619;;;;;:::o;3862:943::-;3957:6;3965;3973;3981;4030:3;4018:9;4009:7;4005:23;4001:33;3998:120;;;4037:79;;:::i;:::-;3998:120;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4568:2;4557:9;4553:18;4540:32;4599:18;4591:6;4588:30;4585:117;;;4621:79;;:::i;:::-;4585:117;4726:62;4780:7;4771:6;4760:9;4756:22;4726:62;:::i;:::-;4716:72;;4511:287;3862:943;;;;;;;:::o;4811:468::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:119;;;4939:79;;:::i;:::-;4901:119;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:50;5254:7;5245:6;5234:9;5230:22;5212:50;:::i;:::-;5202:60;;5157:115;4811:468;;;;;:::o;5285:654::-;5363:6;5371;5420:2;5408:9;5399:7;5395:23;5391:32;5388:119;;;5426:79;;:::i;:::-;5388:119;5546:1;5571:53;5616:7;5607:6;5596:9;5592:22;5571:53;:::i;:::-;5561:63;;5517:117;5701:2;5690:9;5686:18;5673:32;5732:18;5724:6;5721:30;5718:117;;;5754:79;;:::i;:::-;5718:117;5859:63;5914:7;5905:6;5894:9;5890:22;5859:63;:::i;:::-;5849:73;;5644:288;5285:654;;;;;:::o;5945:474::-;6013:6;6021;6070:2;6058:9;6049:7;6045:23;6041:32;6038:119;;;6076:79;;:::i;:::-;6038:119;6196:1;6221:53;6266:7;6257:6;6246:9;6242:22;6221:53;:::i;:::-;6211:63;;6167:117;6323:2;6349:53;6394:7;6385:6;6374:9;6370:22;6349:53;:::i;:::-;6339:63;;6294:118;5945:474;;;;;:::o;6425:329::-;6484:6;6533:2;6521:9;6512:7;6508:23;6504:32;6501:119;;;6539:79;;:::i;:::-;6501:119;6659:1;6684:53;6729:7;6720:6;6709:9;6705:22;6684:53;:::i;:::-;6674:63;;6630:117;6425:329;;;;:::o;6760:474::-;6828:6;6836;6885:2;6873:9;6864:7;6860:23;6856:32;6853:119;;;6891:79;;:::i;:::-;6853:119;7011:1;7036:53;7081:7;7072:6;7061:9;7057:22;7036:53;:::i;:::-;7026:63;;6982:117;7138:2;7164:53;7209:7;7200:6;7189:9;7185:22;7164:53;:::i;:::-;7154:63;;7109:118;6760:474;;;;;:::o;7240:327::-;7298:6;7347:2;7335:9;7326:7;7322:23;7318:32;7315:119;;;7353:79;;:::i;:::-;7315:119;7473:1;7498:52;7542:7;7533:6;7522:9;7518:22;7498:52;:::i;:::-;7488:62;;7444:116;7240:327;;;;:::o;7573:349::-;7642:6;7691:2;7679:9;7670:7;7666:23;7662:32;7659:119;;;7697:79;;:::i;:::-;7659:119;7817:1;7842:63;7897:7;7888:6;7877:9;7873:22;7842:63;:::i;:::-;7832:73;;7788:127;7573:349;;;;:::o;7928:329::-;7987:6;8036:2;8024:9;8015:7;8011:23;8007:32;8004:119;;;8042:79;;:::i;:::-;8004:119;8162:1;8187:53;8232:7;8223:6;8212:9;8208:22;8187:53;:::i;:::-;8177:63;;8133:117;7928:329;;;;:::o;8263:118::-;8350:24;8368:5;8350:24;:::i;:::-;8345:3;8338:37;8263:118;;:::o;8387:109::-;8468:21;8483:5;8468:21;:::i;:::-;8463:3;8456:34;8387:109;;:::o;8502:118::-;8589:24;8607:5;8589:24;:::i;:::-;8584:3;8577:37;8502:118;;:::o;8626:360::-;8712:3;8740:38;8772:5;8740:38;:::i;:::-;8794:70;8857:6;8852:3;8794:70;:::i;:::-;8787:77;;8873:52;8918:6;8913:3;8906:4;8899:5;8895:16;8873:52;:::i;:::-;8950:29;8972:6;8950:29;:::i;:::-;8945:3;8941:39;8934:46;;8716:270;8626:360;;;;:::o;8992:364::-;9080:3;9108:39;9141:5;9108:39;:::i;:::-;9163:71;9227:6;9222:3;9163:71;:::i;:::-;9156:78;;9243:52;9288:6;9283:3;9276:4;9269:5;9265:16;9243:52;:::i;:::-;9320:29;9342:6;9320:29;:::i;:::-;9315:3;9311:39;9304:46;;9084:272;8992:364;;;;:::o;9362:377::-;9468:3;9496:39;9529:5;9496:39;:::i;:::-;9551:89;9633:6;9628:3;9551:89;:::i;:::-;9544:96;;9649:52;9694:6;9689:3;9682:4;9675:5;9671:16;9649:52;:::i;:::-;9726:6;9721:3;9717:16;9710:23;;9472:267;9362:377;;;;:::o;9745:366::-;9887:3;9908:67;9972:2;9967:3;9908:67;:::i;:::-;9901:74;;9984:93;10073:3;9984:93;:::i;:::-;10102:2;10097:3;10093:12;10086:19;;9745:366;;;:::o;10117:::-;10259:3;10280:67;10344:2;10339:3;10280:67;:::i;:::-;10273:74;;10356:93;10445:3;10356:93;:::i;:::-;10474:2;10469:3;10465:12;10458:19;;10117:366;;;:::o;10489:::-;10631:3;10652:67;10716:2;10711:3;10652:67;:::i;:::-;10645:74;;10728:93;10817:3;10728:93;:::i;:::-;10846:2;10841:3;10837:12;10830:19;;10489:366;;;:::o;10861:::-;11003:3;11024:67;11088:2;11083:3;11024:67;:::i;:::-;11017:74;;11100:93;11189:3;11100:93;:::i;:::-;11218:2;11213:3;11209:12;11202:19;;10861:366;;;:::o;11233:::-;11375:3;11396:67;11460:2;11455:3;11396:67;:::i;:::-;11389:74;;11472:93;11561:3;11472:93;:::i;:::-;11590:2;11585:3;11581:12;11574:19;;11233:366;;;:::o;11605:::-;11747:3;11768:67;11832:2;11827:3;11768:67;:::i;:::-;11761:74;;11844:93;11933:3;11844:93;:::i;:::-;11962:2;11957:3;11953:12;11946:19;;11605:366;;;:::o;11977:::-;12119:3;12140:67;12204:2;12199:3;12140:67;:::i;:::-;12133:74;;12216:93;12305:3;12216:93;:::i;:::-;12334:2;12329:3;12325:12;12318:19;;11977:366;;;:::o;12349:::-;12491:3;12512:67;12576:2;12571:3;12512:67;:::i;:::-;12505:74;;12588:93;12677:3;12588:93;:::i;:::-;12706:2;12701:3;12697:12;12690:19;;12349:366;;;:::o;12721:::-;12863:3;12884:67;12948:2;12943:3;12884:67;:::i;:::-;12877:74;;12960:93;13049:3;12960:93;:::i;:::-;13078:2;13073:3;13069:12;13062:19;;12721:366;;;:::o;13093:::-;13235:3;13256:67;13320:2;13315:3;13256:67;:::i;:::-;13249:74;;13332:93;13421:3;13332:93;:::i;:::-;13450:2;13445:3;13441:12;13434:19;;13093:366;;;:::o;13465:::-;13607:3;13628:67;13692:2;13687:3;13628:67;:::i;:::-;13621:74;;13704:93;13793:3;13704:93;:::i;:::-;13822:2;13817:3;13813:12;13806:19;;13465:366;;;:::o;13837:::-;13979:3;14000:67;14064:2;14059:3;14000:67;:::i;:::-;13993:74;;14076:93;14165:3;14076:93;:::i;:::-;14194:2;14189:3;14185:12;14178:19;;13837:366;;;:::o;14209:::-;14351:3;14372:67;14436:2;14431:3;14372:67;:::i;:::-;14365:74;;14448:93;14537:3;14448:93;:::i;:::-;14566:2;14561:3;14557:12;14550:19;;14209:366;;;:::o;14581:::-;14723:3;14744:67;14808:2;14803:3;14744:67;:::i;:::-;14737:74;;14820:93;14909:3;14820:93;:::i;:::-;14938:2;14933:3;14929:12;14922:19;;14581:366;;;:::o;14953:::-;15095:3;15116:67;15180:2;15175:3;15116:67;:::i;:::-;15109:74;;15192:93;15281:3;15192:93;:::i;:::-;15310:2;15305:3;15301:12;15294:19;;14953:366;;;:::o;15325:::-;15467:3;15488:67;15552:2;15547:3;15488:67;:::i;:::-;15481:74;;15564:93;15653:3;15564:93;:::i;:::-;15682:2;15677:3;15673:12;15666:19;;15325:366;;;:::o;15697:::-;15839:3;15860:67;15924:2;15919:3;15860:67;:::i;:::-;15853:74;;15936:93;16025:3;15936:93;:::i;:::-;16054:2;16049:3;16045:12;16038:19;;15697:366;;;:::o;16069:402::-;16229:3;16250:85;16332:2;16327:3;16250:85;:::i;:::-;16243:92;;16344:93;16433:3;16344:93;:::i;:::-;16462:2;16457:3;16453:12;16446:19;;16069:402;;;:::o;16477:::-;16637:3;16658:85;16740:2;16735:3;16658:85;:::i;:::-;16651:92;;16752:93;16841:3;16752:93;:::i;:::-;16870:2;16865:3;16861:12;16854:19;;16477:402;;;:::o;16885:366::-;17027:3;17048:67;17112:2;17107:3;17048:67;:::i;:::-;17041:74;;17124:93;17213:3;17124:93;:::i;:::-;17242:2;17237:3;17233:12;17226:19;;16885:366;;;:::o;17257:118::-;17344:24;17362:5;17344:24;:::i;:::-;17339:3;17332:37;17257:118;;:::o;17381:435::-;17561:3;17583:95;17674:3;17665:6;17583:95;:::i;:::-;17576:102;;17695:95;17786:3;17777:6;17695:95;:::i;:::-;17688:102;;17807:3;17800:10;;17381:435;;;;;:::o;17822:967::-;18204:3;18226:148;18370:3;18226:148;:::i;:::-;18219:155;;18391:95;18482:3;18473:6;18391:95;:::i;:::-;18384:102;;18503:148;18647:3;18503:148;:::i;:::-;18496:155;;18668:95;18759:3;18750:6;18668:95;:::i;:::-;18661:102;;18780:3;18773:10;;17822:967;;;;;:::o;18795:222::-;18888:4;18926:2;18915:9;18911:18;18903:26;;18939:71;19007:1;18996:9;18992:17;18983:6;18939:71;:::i;:::-;18795:222;;;;:::o;19023:640::-;19218:4;19256:3;19245:9;19241:19;19233:27;;19270:71;19338:1;19327:9;19323:17;19314:6;19270:71;:::i;:::-;19351:72;19419:2;19408:9;19404:18;19395:6;19351:72;:::i;:::-;19433;19501:2;19490:9;19486:18;19477:6;19433:72;:::i;:::-;19552:9;19546:4;19542:20;19537:2;19526:9;19522:18;19515:48;19580:76;19651:4;19642:6;19580:76;:::i;:::-;19572:84;;19023:640;;;;;;;:::o;19669:210::-;19756:4;19794:2;19783:9;19779:18;19771:26;;19807:65;19869:1;19858:9;19854:17;19845:6;19807:65;:::i;:::-;19669:210;;;;:::o;19885:222::-;19978:4;20016:2;20005:9;20001:18;19993:26;;20029:71;20097:1;20086:9;20082:17;20073:6;20029:71;:::i;:::-;19885:222;;;;:::o;20113:313::-;20226:4;20264:2;20253:9;20249:18;20241:26;;20313:9;20307:4;20303:20;20299:1;20288:9;20284:17;20277:47;20341:78;20414:4;20405:6;20341:78;:::i;:::-;20333:86;;20113:313;;;;:::o;20432:419::-;20598:4;20636:2;20625:9;20621:18;20613:26;;20685:9;20679:4;20675:20;20671:1;20660:9;20656:17;20649:47;20713:131;20839:4;20713:131;:::i;:::-;20705:139;;20432:419;;;:::o;20857:::-;21023:4;21061:2;21050:9;21046:18;21038:26;;21110:9;21104:4;21100:20;21096:1;21085:9;21081:17;21074:47;21138:131;21264:4;21138:131;:::i;:::-;21130:139;;20857:419;;;:::o;21282:::-;21448:4;21486:2;21475:9;21471:18;21463:26;;21535:9;21529:4;21525:20;21521:1;21510:9;21506:17;21499:47;21563:131;21689:4;21563:131;:::i;:::-;21555:139;;21282:419;;;:::o;21707:::-;21873:4;21911:2;21900:9;21896:18;21888:26;;21960:9;21954:4;21950:20;21946:1;21935:9;21931:17;21924:47;21988:131;22114:4;21988:131;:::i;:::-;21980:139;;21707:419;;;:::o;22132:::-;22298:4;22336:2;22325:9;22321:18;22313:26;;22385:9;22379:4;22375:20;22371:1;22360:9;22356:17;22349:47;22413:131;22539:4;22413:131;:::i;:::-;22405:139;;22132:419;;;:::o;22557:::-;22723:4;22761:2;22750:9;22746:18;22738:26;;22810:9;22804:4;22800:20;22796:1;22785:9;22781:17;22774:47;22838:131;22964:4;22838:131;:::i;:::-;22830:139;;22557:419;;;:::o;22982:::-;23148:4;23186:2;23175:9;23171:18;23163:26;;23235:9;23229:4;23225:20;23221:1;23210:9;23206:17;23199:47;23263:131;23389:4;23263:131;:::i;:::-;23255:139;;22982:419;;;:::o;23407:::-;23573:4;23611:2;23600:9;23596:18;23588:26;;23660:9;23654:4;23650:20;23646:1;23635:9;23631:17;23624:47;23688:131;23814:4;23688:131;:::i;:::-;23680:139;;23407:419;;;:::o;23832:::-;23998:4;24036:2;24025:9;24021:18;24013:26;;24085:9;24079:4;24075:20;24071:1;24060:9;24056:17;24049:47;24113:131;24239:4;24113:131;:::i;:::-;24105:139;;23832:419;;;:::o;24257:::-;24423:4;24461:2;24450:9;24446:18;24438:26;;24510:9;24504:4;24500:20;24496:1;24485:9;24481:17;24474:47;24538:131;24664:4;24538:131;:::i;:::-;24530:139;;24257:419;;;:::o;24682:::-;24848:4;24886:2;24875:9;24871:18;24863:26;;24935:9;24929:4;24925:20;24921:1;24910:9;24906:17;24899:47;24963:131;25089:4;24963:131;:::i;:::-;24955:139;;24682:419;;;:::o;25107:::-;25273:4;25311:2;25300:9;25296:18;25288:26;;25360:9;25354:4;25350:20;25346:1;25335:9;25331:17;25324:47;25388:131;25514:4;25388:131;:::i;:::-;25380:139;;25107:419;;;:::o;25532:::-;25698:4;25736:2;25725:9;25721:18;25713:26;;25785:9;25779:4;25775:20;25771:1;25760:9;25756:17;25749:47;25813:131;25939:4;25813:131;:::i;:::-;25805:139;;25532:419;;;:::o;25957:::-;26123:4;26161:2;26150:9;26146:18;26138:26;;26210:9;26204:4;26200:20;26196:1;26185:9;26181:17;26174:47;26238:131;26364:4;26238:131;:::i;:::-;26230:139;;25957:419;;;:::o;26382:::-;26548:4;26586:2;26575:9;26571:18;26563:26;;26635:9;26629:4;26625:20;26621:1;26610:9;26606:17;26599:47;26663:131;26789:4;26663:131;:::i;:::-;26655:139;;26382:419;;;:::o;26807:::-;26973:4;27011:2;27000:9;26996:18;26988:26;;27060:9;27054:4;27050:20;27046:1;27035:9;27031:17;27024:47;27088:131;27214:4;27088:131;:::i;:::-;27080:139;;26807:419;;;:::o;27232:::-;27398:4;27436:2;27425:9;27421:18;27413:26;;27485:9;27479:4;27475:20;27471:1;27460:9;27456:17;27449:47;27513:131;27639:4;27513:131;:::i;:::-;27505:139;;27232:419;;;:::o;27657:::-;27823:4;27861:2;27850:9;27846:18;27838:26;;27910:9;27904:4;27900:20;27896:1;27885:9;27881:17;27874:47;27938:131;28064:4;27938:131;:::i;:::-;27930:139;;27657:419;;;:::o;28082:222::-;28175:4;28213:2;28202:9;28198:18;28190:26;;28226:71;28294:1;28283:9;28279:17;28270:6;28226:71;:::i;:::-;28082:222;;;;:::o;28310:129::-;28344:6;28371:20;;:::i;:::-;28361:30;;28400:33;28428:4;28420:6;28400:33;:::i;:::-;28310:129;;;:::o;28445:75::-;28478:6;28511:2;28505:9;28495:19;;28445:75;:::o;28526:307::-;28587:4;28677:18;28669:6;28666:30;28663:56;;;28699:18;;:::i;:::-;28663:56;28737:29;28759:6;28737:29;:::i;:::-;28729:37;;28821:4;28815;28811:15;28803:23;;28526:307;;;:::o;28839:308::-;28901:4;28991:18;28983:6;28980:30;28977:56;;;29013:18;;:::i;:::-;28977:56;29051:29;29073:6;29051:29;:::i;:::-;29043:37;;29135:4;29129;29125:15;29117:23;;28839:308;;;:::o;29153:98::-;29204:6;29238:5;29232:12;29222:22;;29153:98;;;:::o;29257:99::-;29309:6;29343:5;29337:12;29327:22;;29257:99;;;:::o;29362:168::-;29445:11;29479:6;29474:3;29467:19;29519:4;29514:3;29510:14;29495:29;;29362:168;;;;:::o;29536:169::-;29620:11;29654:6;29649:3;29642:19;29694:4;29689:3;29685:14;29670:29;;29536:169;;;;:::o;29711:148::-;29813:11;29850:3;29835:18;;29711:148;;;;:::o;29865:305::-;29905:3;29924:20;29942:1;29924:20;:::i;:::-;29919:25;;29958:20;29976:1;29958:20;:::i;:::-;29953:25;;30112:1;30044:66;30040:74;30037:1;30034:81;30031:107;;;30118:18;;:::i;:::-;30031:107;30162:1;30159;30155:9;30148:16;;29865:305;;;;:::o;30176:185::-;30216:1;30233:20;30251:1;30233:20;:::i;:::-;30228:25;;30267:20;30285:1;30267:20;:::i;:::-;30262:25;;30306:1;30296:35;;30311:18;;:::i;:::-;30296:35;30353:1;30350;30346:9;30341:14;;30176:185;;;;:::o;30367:348::-;30407:7;30430:20;30448:1;30430:20;:::i;:::-;30425:25;;30464:20;30482:1;30464:20;:::i;:::-;30459:25;;30652:1;30584:66;30580:74;30577:1;30574:81;30569:1;30562:9;30555:17;30551:105;30548:131;;;30659:18;;:::i;:::-;30548:131;30707:1;30704;30700:9;30689:20;;30367:348;;;;:::o;30721:191::-;30761:4;30781:20;30799:1;30781:20;:::i;:::-;30776:25;;30815:20;30833:1;30815:20;:::i;:::-;30810:25;;30854:1;30851;30848:8;30845:34;;;30859:18;;:::i;:::-;30845:34;30904:1;30901;30897:9;30889:17;;30721:191;;;;:::o;30918:96::-;30955:7;30984:24;31002:5;30984:24;:::i;:::-;30973:35;;30918:96;;;:::o;31020:90::-;31054:7;31097:5;31090:13;31083:21;31072:32;;31020:90;;;:::o;31116:77::-;31153:7;31182:5;31171:16;;31116:77;;;:::o;31199:149::-;31235:7;31275:66;31268:5;31264:78;31253:89;;31199:149;;;:::o;31354:126::-;31391:7;31431:42;31424:5;31420:54;31409:65;;31354:126;;;:::o;31486:77::-;31523:7;31552:5;31541:16;;31486:77;;;:::o;31569:154::-;31653:6;31648:3;31643;31630:30;31715:1;31706:6;31701:3;31697:16;31690:27;31569:154;;;:::o;31729:307::-;31797:1;31807:113;31821:6;31818:1;31815:13;31807:113;;;31906:1;31901:3;31897:11;31891:18;31887:1;31882:3;31878:11;31871:39;31843:2;31840:1;31836:10;31831:15;;31807:113;;;31938:6;31935:1;31932:13;31929:101;;;32018:1;32009:6;32004:3;32000:16;31993:27;31929:101;31778:258;31729:307;;;:::o;32042:171::-;32081:3;32104:24;32122:5;32104:24;:::i;:::-;32095:33;;32150:4;32143:5;32140:15;32137:41;;;32158:18;;:::i;:::-;32137:41;32205:1;32198:5;32194:13;32187:20;;32042:171;;;:::o;32219:320::-;32263:6;32300:1;32294:4;32290:12;32280:22;;32347:1;32341:4;32337:12;32368:18;32358:81;;32424:4;32416:6;32412:17;32402:27;;32358:81;32486:2;32478:6;32475:14;32455:18;32452:38;32449:84;;;32505:18;;:::i;:::-;32449:84;32270:269;32219:320;;;:::o;32545:281::-;32628:27;32650:4;32628:27;:::i;:::-;32620:6;32616:40;32758:6;32746:10;32743:22;32722:18;32710:10;32707:34;32704:62;32701:88;;;32769:18;;:::i;:::-;32701:88;32809:10;32805:2;32798:22;32588:238;32545:281;;:::o;32832:233::-;32871:3;32894:24;32912:5;32894:24;:::i;:::-;32885:33;;32940:66;32933:5;32930:77;32927:103;;;33010:18;;:::i;:::-;32927:103;33057:1;33050:5;33046:13;33039:20;;32832:233;;;:::o;33071:176::-;33103:1;33120:20;33138:1;33120:20;:::i;:::-;33115:25;;33154:20;33172:1;33154:20;:::i;:::-;33149:25;;33193:1;33183:35;;33198:18;;:::i;:::-;33183:35;33239:1;33236;33232:9;33227:14;;33071:176;;;;:::o;33253:180::-;33301:77;33298:1;33291:88;33398:4;33395:1;33388:15;33422:4;33419:1;33412:15;33439:180;33487:77;33484:1;33477:88;33584:4;33581:1;33574:15;33608:4;33605:1;33598:15;33625:180;33673:77;33670:1;33663:88;33770:4;33767:1;33760:15;33794:4;33791:1;33784:15;33811:180;33859:77;33856:1;33849:88;33956:4;33953:1;33946:15;33980:4;33977:1;33970:15;33997:180;34045:77;34042:1;34035:88;34142:4;34139:1;34132:15;34166:4;34163:1;34156:15;34183:117;34292:1;34289;34282:12;34306:117;34415:1;34412;34405:12;34429:117;34538:1;34535;34528:12;34552:117;34661:1;34658;34651:12;34675:102;34716:6;34767:2;34763:7;34758:2;34751:5;34747:14;34743:28;34733:38;;34675:102;;;:::o;34783:182::-;34923:34;34919:1;34911:6;34907:14;34900:58;34783:182;:::o;34971:237::-;35111:34;35107:1;35099:6;35095:14;35088:58;35180:20;35175:2;35167:6;35163:15;35156:45;34971:237;:::o;35214:224::-;35354:34;35350:1;35342:6;35338:14;35331:58;35423:7;35418:2;35410:6;35406:15;35399:32;35214:224;:::o;35444:178::-;35584:30;35580:1;35572:6;35568:14;35561:54;35444:178;:::o;35628:223::-;35768:34;35764:1;35756:6;35752:14;35745:58;35837:6;35832:2;35824:6;35820:15;35813:31;35628:223;:::o;35857:175::-;35997:27;35993:1;35985:6;35981:14;35974:51;35857:175;:::o;36038:231::-;36178:34;36174:1;36166:6;36162:14;36155:58;36247:14;36242:2;36234:6;36230:15;36223:39;36038:231;:::o;36275:243::-;36415:34;36411:1;36403:6;36399:14;36392:58;36484:26;36479:2;36471:6;36467:15;36460:51;36275:243;:::o;36524:229::-;36664:34;36660:1;36652:6;36648:14;36641:58;36733:12;36728:2;36720:6;36716:15;36709:37;36524:229;:::o;36759:228::-;36899:34;36895:1;36887:6;36883:14;36876:58;36968:11;36963:2;36955:6;36951:15;36944:36;36759:228;:::o;36993:233::-;37133:34;37129:1;37121:6;37117:14;37110:58;37202:16;37197:2;37189:6;37185:15;37178:41;36993:233;:::o;37232:182::-;37372:34;37368:1;37360:6;37356:14;37349:58;37232:182;:::o;37420:236::-;37560:34;37556:1;37548:6;37544:14;37537:58;37629:19;37624:2;37616:6;37612:15;37605:44;37420:236;:::o;37662:231::-;37802:34;37798:1;37790:6;37786:14;37779:58;37871:14;37866:2;37858:6;37854:15;37847:39;37662:231;:::o;37899:234::-;38039:34;38035:1;38027:6;38023:14;38016:58;38108:17;38103:2;38095:6;38091:15;38084:42;37899:234;:::o;38139:220::-;38279:34;38275:1;38267:6;38263:14;38256:58;38348:3;38343:2;38335:6;38331:15;38324:28;38139:220;:::o;38365:236::-;38505:34;38501:1;38493:6;38489:14;38482:58;38574:19;38569:2;38561:6;38557:15;38550:44;38365:236;:::o;38607:173::-;38747:25;38743:1;38735:6;38731:14;38724:49;38607:173;:::o;38786:167::-;38926:19;38922:1;38914:6;38910:14;38903:43;38786:167;:::o;38959:234::-;39099:34;39095:1;39087:6;39083:14;39076:58;39168:17;39163:2;39155:6;39151:15;39144:42;38959:234;:::o;39199:122::-;39272:24;39290:5;39272:24;:::i;:::-;39265:5;39262:35;39252:63;;39311:1;39308;39301:12;39252:63;39199:122;:::o;39327:116::-;39397:21;39412:5;39397:21;:::i;:::-;39390:5;39387:32;39377:60;;39433:1;39430;39423:12;39377:60;39327:116;:::o;39449:122::-;39522:24;39540:5;39522:24;:::i;:::-;39515:5;39512:35;39502:63;;39561:1;39558;39551:12;39502:63;39449:122;:::o;39577:120::-;39649:23;39666:5;39649:23;:::i;:::-;39642:5;39639:34;39629:62;;39687:1;39684;39677:12;39629:62;39577:120;:::o;39703:122::-;39776:24;39794:5;39776:24;:::i;:::-;39769:5;39766:35;39756:63;;39815:1;39812;39805:12;39756:63;39703:122;:::o

Swarm Source

ipfs://84b47006b1c7b137b9f163b9ca88086ae8d7b3b5026e52f01c268d657ea40a0e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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